靈動微電子ARM Cortex M0 MM32F0010 UART1和UART2中斷接收資料
目錄:
1、MM32F0010UART簡介
2、MM32F0010UART特性
3、MM32F0010使用UART2的注意事項
4、MM32F0010UART中斷接收的初始化配置
5、MM32F0010UART中斷接收函式的編寫
6、MM32F0010UART查詢方式傳送資料函式的編寫
7、MM32F0010UART處理接收資料函式的編寫
1、MM32F0010UART簡介:
MM32F0010的通用非同步收發器 (UART) 提供了一種靈活的方法與使用工業標準 NRZ 非同步序列資料格式的外部裝置之間進行全雙工資料交換。UART 利用分數波特率發生器提供寬範圍的波特率選擇。它支援同步單向通訊和半雙工單線通訊。
2、MM32F0010UART特性:
• 支援非同步方式下 RS-232S 協議,符合工業標準 16550
• 全雙工非同步操作
• 分數波特率發生器系統
• 傳送和接收共用的可程式設計波特率
• 單獨分開的傳送和接收緩衝暫存器
• 內建 1 位元組傳送和 1 位元組接收緩衝
• 傳送和接收資料低位在前
• 一個起始位開始,後面接資料位,輸出的資料長度可為 5 位、6 位、7 位、8 位,最後為
停止位。另外可選擇是否有加奇偶校驗位,奇偶校驗位在資料位之後停止位之前。
• 第 9 位可做同步幀配置
• 支援硬體奇數或者偶數校驗產生和偵測
• 線斷開產生和偵測
• 線空閒產生和偵測
• 支援 LIN 協議下收發 brk
• 支援訊號收發互換,接收和傳送取反
• 支援波特率自適應功能
• 支援下面中斷源:
– 傳送端 BUFFER 空
– 接收端資料有效
– 接收緩衝快取溢位
– 幀錯誤
– 奇偶校驗錯誤
– 接收斷開幀
– 傳送移位暫存器完成
– 傳送斷開幀完成
– 接收同步幀
– 空閒幀完成
– 自動波特率結束
– 自動波特率錯誤
3、MM32F0010使用UART2的注意事項:
注意:因PA13為SWD燒錄口,MCU每次上電覆位瞬間預設為SWD功能,如果使用者把PA13複用成了UART2_RX功能,則在main函式中很快就被初始化成串列埠2的UART2_RX功能,導致來不及識別燒錄時序,造成下次無法支援燒錄程式碼,因此最好延時1s再複用為UART2_RX功能,讓燒錄器每次燒錄時有足夠的時間識別MCU的
燒錄時序。
4、MM32F0010UART中斷接收的初始化配置:
(1)在MDK Keil工程中新建bsp_uartx.c和bsp_uartx.h檔案,在bsp_uartx.c中包含bsp_uartx.h標頭檔案
(2)在bsp_uartx.c檔案中編寫UART1中斷接收的初始化函式,並定義UART1和UART2的接收快取等引數
1 #include "bsp_uartx.h"
2
3 //UART1接收快取,最大UART1_REC_LEN個位元組
4 u8 UART1_Rx_Buf[UART1_REC_LEN];
5 //UART1接收計數
6 u16 UART1_Rx_Cnt;
7 //UART1多少ms允許判斷接收完資料
8 u8 UART1_Rx_TimeCnt = 0;
9
10 //UART2接收快取,最大UART1_REC_LEN個位元組
11 u8 UART2_Rx_Buf[UART2_REC_LEN];
12 //UART2接收計數
13 u16 UART2_Rx_Cnt;
14 //UART2多少ms允許判斷接收完資料
15 u8 UART2_Rx_TimeCnt = 0;
16 //UART1 接收標誌
17 bool UART1_Rx_Flag = false;
18 //UART2 接收標誌
19 bool UART2_Rx_Flag = false;
20
21 /**
22 ***********************************************************************************************************************
23 *@函式名稱:void Bsp_UART1_Init_Config(u32 bound)
24 *@功能描述:UART2 Init
25 *@輸入引數:bound:通訊波特率
26 *@返回引數:None
27 ***********************************************************************************************************************
28 */
29 void Bsp_UART1_Init_Config(u32 bound)
30 {
31 GPIO_InitTypeDef GPIO_InitStructure;
32 UART_InitTypeDef UART_InitStructure;
33 NVIC_InitTypeDef NVIC_InitStruct;
34
35 //使能UART1 時鐘
36 RCC_APB1PeriphClockCmd(RCC_APB1ENR_UART1, ENABLE);
37 //使能GPIOA時鐘
38 RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
39
40 //PA3 複用功能為UART1_RX
41 GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);
42 //PA12 複用功能為UART1_TX
43 GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_1);
44
45 GPIO_StructInit(&GPIO_InitStructure);
46 //PA12 UART1_TX
47 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
48 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
49 //PA12 UART1_TX 推輓輸出
50 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
51 GPIO_Init(GPIOA, &GPIO_InitStructure);
52
53 //GPIOA.3 UART1_RX
54 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
55 //PA3 UART1_RX上拉輸入
56 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
57 GPIO_Init(GPIOA, &GPIO_InitStructure);
58
59 //自定義值初始化UART1結構體成員
60 UART_StructInit(&UART_InitStructure);
61 //配置串列埠波特率
62 UART_InitStructure.UART_BaudRate = bound;
63 //8位資料位長度
64 UART_InitStructure.UART_WordLength = UART_WordLength_8b;
65 //1位停止位
66 UART_InitStructure.UART_StopBits = UART_StopBits_1;
67 //配置為不帶奇偶校驗位
68 UART_InitStructure.UART_Parity = UART_Parity_No;
69 //配置為不帶硬體流控
70 UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;
71 //允許UART接收和傳送資料
72 UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx;
73 //使能UART1接收中斷
74 UART_ITConfig( UART1, UART_IT_RXIEN, ENABLE);
75 //根據配置的UART1結構體成員初始化UART1
76 UART_Init(UART1, &UART_InitStructure);
77
78 //使能UART1 NVIC中斷通道
79 NVIC_InitStruct.NVIC_IRQChannel = UART1_IRQn;
80 //使能UART1 NVIC中斷
81 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
82
83 //設定UART1中斷優先順序
84 NVIC_InitStruct.NVIC_IRQChannelPriority = 0;
85 //根據配置的中斷優先順序引數初始化NVIC中斷優先順序
86 NVIC_Init(& NVIC_InitStruct);
87 //使能UART1工作
88 UART_Cmd(UART1, ENABLE);
89 }
(3)在bsp_uartx.c檔案中編寫UART2中斷接收的初始化函式
1 /**
2 ***********************************************************************************************************************
3 *@函式名稱:void Bsp_UART2_Init_Config(u32 bound)
4 *@功能描述:UART2 Init
5 *@輸入引數:bound:通訊波特率
6 *@返回引數:None
7 ***********************************************************************************************************************
8 */
9 void Bsp_UART2_Init_Config(u32 bound)
10 {
11 //GPIO GPIO set
12 GPIO_InitTypeDef GPIO_InitStructure;
13 UART_InitTypeDef UART_InitStructure;
14 NVIC_InitTypeDef NVIC_InitStruct;
15
16 //使能GPIOA時鐘
17 RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
18 //使能UART2時鐘
19 RCC_APB1PeriphClockCmd(RCC_APB1ENR_UART2, ENABLE);
20
21 //PA1 複用功能為UART2_TX
22 GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_2);
23 //PA13 複用功能為UART2_RX
24 GPIO_PinAFConfig(GPIOA, GPIO_PinSource13, GPIO_AF_2);
25
26 GPIO_StructInit(&GPIO_InitStructure);
27 //PA1 UART2_TX
28 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
29 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
30 //PA1 UART2_TX 推輓輸出
31 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
32 GPIO_Init(GPIOA, &GPIO_InitStructure);
33
34 //GPIOA.13 UART2_RX
35 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
36 //PA13 UART2_RX上拉輸入
37 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
38 GPIO_Init(GPIOA, &GPIO_InitStructure);
39
40 //自定義值初始化UART2結構體成員
41 UART_StructInit(&UART_InitStructure);
42 //配置串列埠波特率
43 UART_InitStructure.UART_BaudRate = bound;
44 //8位資料位長度
45 UART_InitStructure.UART_WordLength = UART_WordLength_8b;
46 //1位停止位
47 UART_InitStructure.UART_StopBits = UART_StopBits_1;
48 //配置為不帶奇偶校驗位
49 UART_InitStructure.UART_Parity = UART_Parity_No;
50 //配置為不帶硬體流控
51 UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;
52 //允許UART接收和傳送資料
53 UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx;
54 //使能UART2接收中斷
55 UART_ITConfig(UART2, UART_IT_RXIEN, ENABLE);
56 //根據配置的UART2結構體成員初始化UART2
57 UART_Init(UART2, &UART_InitStructure);
58
59 //使能UART2 NVIC中斷通道
60 NVIC_InitStruct.NVIC_IRQChannel = UART2_IRQn;
61 //使能UART2 NVIC中斷
62 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
63 //設定UART2中斷優先順序
64 NVIC_InitStruct.NVIC_IRQChannelPriority = 1;
65 //根據配置的中斷優先順序引數初始化NVIC中斷優先順序
66 NVIC_Init(& NVIC_InitStruct);
67 //使能UART2工作
68 UART_Cmd(UART2, ENABLE);
69 }
(4)在bsp_uartx.h檔案中編寫標頭檔案,包括UART1和UART2中斷接收初始化函式以及變數的外部宣告,程式碼如下所示:
1 #ifndef __BSP_UARTX__H__
2 #define __BSP_UARTX__H__
3
4 #include "mm32_device.h"
5 #include "hal_conf.h"
6 #include "string.h"
7
8 //UART1 Baudrate
9 #define UART1_BAUD_RATE (115200)
10 //UART2 Baudrate
11 #define UART2_BAUD_RATE (115200)
12
13 //UART1最大接收位元組數200
14 #define UART1_REC_LEN (200)
15 //UART2最大接收位元組數200
16 #define UART2_REC_LEN (200)
17
18 //UART1接收快取,最大UART1_REC_LEN個位元組
19 extern u8 UART1_Rx_Buf[UART1_REC_LEN];
20 //UART2接收快取,最大UART2_REC_LEN個位元組
21 extern u8 UART2_Rx_Buf[UART2_REC_LEN];
22
23 //UART1接收計數
24 extern u16 UART1_Rx_Cnt;
25 //UART2接收計數
26 extern u16 UART2_Rx_Cnt;
27
28 //UART1多少ms允許判斷接收完資料
29 extern u8 UART1_Rx_TimeCnt;
30 extern u8 UART2_Rx_TimeCnt;
31 //UART1 接收標誌
32 extern bool UART1_Rx_Flag;
33 //UART2 接收標誌
34 extern bool UART2_Rx_Flag;
35 //UART1 Init
36 void Bsp_UART1_Init_Config(u32 bound);
37 //UART2 Init
38 void Bsp_UART2_Init_Config(u32 bound);
39 //處理UART1接收任務
40 void Bsp_UART1_Recv_Task(void);
41 //處理UART2接收任務
42 void Bsp_UART2_Recv_Task(void);
43 //傳送單位元組資料
44 void Bsp_UART_SendByte(u8 dat);
45 //傳送多位元組資料
46 void Bsp_UART_SendBytes(u8 *buf, u16 len);
47 //傳送ASCII字元
48 void Bsp_UART_SendASCII(char *str);
49
50 #endif
5、MM32F0010UART中斷接收函式的編寫:
(1)在bsp_uartx.c檔案中編寫UART1中斷接收資料函式,程式碼如下所示:
1 /**
2 ***********************************************************************************************************************
3 *@函式名稱:void UART1_IRQHandler(void)
4 *@功能描述:UART1 中斷服務函式
5 *@輸入引數:None
6 *@返回引數:None
7 ***********************************************************************************************************************
8 */
9 void UART1_IRQHandler(void)
10 {
11 u8 Recbyte;
12
13 if(UART_GetITStatus(UART1, UART_IT_RXIEN) == SET)
14 {
15 UART_ClearITPendingBit(UART1, UART_IT_RXIEN);
16 //在TIM3裡面對接收做超時處理,為後續處理接收資料做準備
17 UART1_Rx_TimeCnt = 2;
18 //讀出UART1接收到的資料到Recbyte
19 Recbyte = UART_ReceiveData(UART1);
20 //把UART1接收到的資料快取到UART1接收快取陣列中
21 UART1_Rx_Buf[UART1_Rx_Cnt] = Recbyte;
22
23 if(UART1_Rx_Cnt < UART1_REC_LEN-1)
24 {
25 //UART1接收計數
26 UART1_Rx_Cnt++;
27 }
28 else
29 {
30 //接收快取滿清接收計數
31 UART1_Rx_Cnt = 0;
32 }
33 }
34 }
(2)在bsp_uartx.c檔案中編寫UART2中斷接收資料函式,程式碼如下所示:
1 /**
2 ***********************************************************************************************************************
3 *@函式名稱:void UART2_IRQHandler(void)
4 *@功能描述:UART2 中斷服務函式
5 *@輸入引數:None
6 *@返回引數:None
7 ***********************************************************************************************************************
8 */
9 void UART2_IRQHandler(void)
10 {
11 u8 Recbyte;
12
13 if(UART_GetITStatus(UART2, UART_IT_RXIEN) == SET)
14 {
15 UART_ClearITPendingBit(UART2, UART_IT_RXIEN);
16 //在TIM3裡面對接收做超時處理,為後續處理接收資料做準備
17 UART2_Rx_TimeCnt = 3;
18 //讀出UART2接收到的資料到Recbyte
19 Recbyte = UART_ReceiveData(UART2);
20 //把UART2接收到的資料快取到UART2接收快取陣列中
21 UART2_Rx_Buf[UART2_Rx_Cnt] = Recbyte;
22
23 if(UART2_Rx_Cnt < UART2_REC_LEN-1)
24 {
25 //UART2接收計數
26 UART2_Rx_Cnt++;
27 }
28 else
29 {
30 //接收快取滿清接收計數
31 UART2_Rx_Cnt = 0;
32 }
33 }
34 }
6、MM32F0010UART查詢方式傳送資料函式的編寫
(1)在bsp_uartx.c檔案中編寫UART查詢方式傳送單位元組資料函式,程式碼如下所示:
1 /**
2 ***********************************************************************************************************************
3 *@函式名稱:void Bsp_UART_SendByte(UART_TypeDef* uart,u8 data)
4 *@功能描述:UART傳送單位元組資料
5 *@輸入引數:uart:串列埠號,data:待發送的資料
6 *@返回引數:None
7 ***********************************************************************************************************************
8 */
9 void Bsp_UART_SendByte(UART_TypeDef* uart,u8 data)
10 {
11 UART_SendData(uart, data);
12 while(!UART_GetFlagStatus(uart, UART_FLAG_TXEPT));
13 }
(2)在bsp_uartx.c檔案中編寫UART查詢方式傳送多位元組資料函式,程式碼如下所示:
1 /**
2 ***********************************************************************************************************************
3 *@函式名稱:void Bsp_UART_SendBytes(UART_TypeDef* uart,u8 *buf, u16 len)
4 *@功能描述:UART傳送多位元組資料
5 *@輸入引數:uart:串列埠號,buf:資料指標指向待發送的資料;len:資料長度
6 *@返回引數:None
7 ***********************************************************************************************************************
8 */
9 void Bsp_UART_SendBytes(UART_TypeDef* uart,u8 *buf, u16 len)
10 {
11 while(len--)
12 {
13 Bsp_UART_SendByte(uart,*buf++);
14 }
15 }
(3)在bsp_uartx.c檔案中編寫UART查詢方式傳送ASII字元函式,程式碼如下所示:
1 /**
2 ***********************************************************************************************************************
3 *@函式名稱:void Bsp_UART_SendASCII(UART_TypeDef* uart,char *str)
4 *@功能描述:傳送ASII字元
5 *@輸入引數:str:指向字串的字元指標
6 *@返回引數:None
7 ***********************************************************************************************************************
8 */
9 void Bsp_UART_SendASCII(UART_TypeDef* uart,char *str)
10 {
11 while(*str)
12 {
13 Bsp_UART_SendByte(uart,*str++);
14 }
15 }
7、MM32F0010UART處理接收資料函式的編寫:
(1)在MDK Keil中新建bsp_timerx.c和bsp_timerx.h檔案開一個TIM3定時器定時中斷5ms為例,用作UART1和UART2接收資料超時標誌,方便處理接收資料,bsp_timerx.c檔案中包含bsp_timerx.h檔案,在bsp_timerx.c中編寫TIM3定時中斷5ms初始化函式,程式碼如下所示:
1 /**
2 ***********************************************************************************************************************
3 *@函式名稱:void Bsp_TIM3_Init(u16 Prescaler,u16 Period)
4 *@功能描述:TIM3 Init
5 *@輸入引數:Prescaler:預分頻係數1-65536、Period:週期值
6 *@返回引數:None
7 ***********************************************************************************************************************
8 */
9 void Bsp_TIM3_Init(u16 Prescaler,u16 Period)
10 {
11 TIM_TimeBaseInitTypeDef TIM_StructInit;
12 NVIC_InitTypeDef NVIC_StructInit;
13
14 //使能TIM3外設時鐘
15 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
16 //配置TIM3過載計數週期值
17 TIM_StructInit.TIM_Period = Period;
18 //配置TIM3 預分頻係數
19 TIM_StructInit.TIM_Prescaler = Prescaler;
20 //配置TIM3時鐘分割
21 TIM_StructInit.TIM_ClockDivision = TIM_CKD_DIV1;
22 //向上計數模式
23 TIM_StructInit.TIM_CounterMode = TIM_CounterMode_Up;
24 //配置脈衝週期計數
25 TIM_StructInit.TIM_RepetitionCounter = 0;
26 //根據以上配置引數初始化 TIM3結構體成員引數
27 TIM_TimeBaseInit(TIM3, &TIM_StructInit);
28
29 //使能TIM3 NVIC中斷優先順序通道
30 NVIC_StructInit.NVIC_IRQChannel = TIM3_IRQn;
31 //配置TIM3 NVIC中斷優先順序
32 NVIC_StructInit.NVIC_IRQChannelPriority = 1;
33 //使能NVIC中斷優先順序
34 NVIC_StructInit.NVIC_IRQChannelCmd = ENABLE;
35 //根據配置的中斷優先順序引數初始化TIM3中斷優先順序
36 NVIC_Init(&NVIC_StructInit);
37
38 //TIM3計時之前清向上計數標誌
39 TIM_ClearFlag(TIM3, TIM_FLAG_Update);
40 //使能TIM3向上計時中斷
41 TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
42 //使能TIM3 工作
43 TIM_Cmd(TIM3, ENABLE);
44 }
(2)在bsp_timerx.c中編寫TIM3定時中斷5ms中斷服務函式,程式碼如下所示:
1 /**
2 **************************************************************************************************************************
3 * 函式名稱:void TIM3_IRQHandler(void)
4 * 函式功能:TIM3中斷服務函式
5 * 輸入引數:無
6 * 輸出引數:無
7 * 返回數值:無
8 **************************************************************************************************************************
9 */
10 void TIM3_IRQHandler(void)
11 {
12 if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
13 {
14 TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
15
16 //UART1多少ms允許判斷接收完資料,10ms可根據具體情況更改超時時間
17 if(UART1_Rx_TimeCnt > 0)
18 {
19 UART1_Rx_TimeCnt--;
20
21 if(UART1_Rx_TimeCnt == 0)
22 {
23 UART1_Rx_Flag = true;
24 }
25 }
26 //UART2多少ms允許判斷接收完資料,15ms可根據具體情況更改超時時間
27 if(UART2_Rx_TimeCnt > 0)
28 {
29 UART2_Rx_TimeCnt--;
30
31 if(UART2_Rx_TimeCnt == 0)
32 {
33 UART2_Rx_Flag = true;
34 }
35 }
36 }
37 }
(3)在bsp_timerx.h中編寫標頭檔案,包含TIM3定時中斷5ms初始化函式宣告,UART標頭檔案包含,程式碼如下所示:
1 #ifndef __BSP_TIMX__H__
2 #define __BSP_TIMX__H__
3
4 #include "mm32_device.h"
5 #include "hal_conf.h"
6 #include "bsp_uartx.h"
7
8
9 //初始化TIM3
10 void Bsp_TIM3_Init(u16 Prescaler,u16 Period);
11
12
13
14
15 #endif
(4)在bsp_uartx.c中編寫處理UART1接收資料函式
1 /**
2 ***********************************************************************************************************************
3 *@函式名稱:void Bsp_UART1_Recv_Task(void)
4 *@功能描述:處理UART1接收任務
5 *@輸入引數:None
6 *@返回引數:None
7 ***********************************************************************************************************************
8 */
9 void Bsp_UART1_Recv_Task(void)
10 {
11 //UART1接收標誌
12 if(UART1_Rx_Flag == true)
13 {
14 UART1_Rx_Flag = false;
15
16 //UART1接收到0x55 0xAA 0xEE
17 if((UART1_Rx_Buf[0] == 0x55) && (UART1_Rx_Buf[1] == 0xAA) && (UART1_Rx_Buf[2] == 0xEE))
18 {
19 //UART1原樣返回接收到的資料
20 Bsp_UART_SendBytes(UART1,UART1_Rx_Buf,UART1_Rx_Cnt);
21 }
22 //清UART1接收計數
23 UART1_Rx_Cnt = 0;
24 //清UART1接收快取
25 memset(UART1_Rx_Buf,0,sizeof(UART1_Rx_Buf));
26 }
27 }
(5)在bsp_uartx.c中編寫處理UART2接收資料函式
1 /**
2 ***********************************************************************************************************************
3 *@函式名稱:void Bsp_UART2_Recv_Task(void)
4 *@功能描述:處理UART2接收任務
5 *@輸入引數:None
6 *@返回引數:None
7 ***********************************************************************************************************************
8 */
9 void Bsp_UART2_Recv_Task(void)
10 {
11 //UART2接收標誌
12 if(UART2_Rx_Flag == true)
13 {
14 UART2_Rx_Flag = false;
15 //UART2接收到0xAA 0xBB 0xCC
16 if((UART2_Rx_Buf[0] == 0xAA) && (UART2_Rx_Buf[1] == 0xBB) && (UART2_Rx_Buf[2] == 0xCC))
17 {
18 //UART2原樣返回接收到的資料
19 Bsp_UART_SendBytes(UART2,UART2_Rx_Buf,UART2_Rx_Cnt);
20 }
21 //清UART2接收計數
22 UART2_Rx_Cnt = 0;
23 //清UART2接收快取
24 memset(UART2_Rx_Buf,0,sizeof(UART2_Rx_Buf));
25 }
26 }
(6)在main.c中檔案中包含"bsp_uartx.h"、"delay.h"(含SysTick 1ms初始化函式宣告即DELAY_Init、DELAY_Ms(__IO u32 count))、"bsp_timerx.h"標頭檔案,在main函式中分別呼叫SysTick初始化函式DELAY_Init、DELAY_Ms(1000);延時1s(注意:因PA13為SWD燒錄口,MCU每次上電覆位瞬間預設為SWD功能,如果使用者把PA13複用成了UART2_RX功能在main函式中很快就被初始化成串列埠2的UART2_RX功能,導致來不及識別燒錄時序,造成下次無法支援燒錄程式碼,因此最好延時1s再複用為UART2_RX功能讓燒錄器每次燒錄時有足夠的時間識別MCU的燒錄時序)Bsp_TIM3_Init、Bsp_UART1_Init_Config、Bsp_UART2_Init_Config初始化,波特率均設為115200,在while(1)大迴圈中分別呼叫Bsp_UART1_Recv_Task、Bsp_UART2_Recv_Task處理UART1和UART2接收任務函式,程式碼如下所示,編譯程式碼並燒錄到MM32F0010核心板或開發板中。
1 #include "delay.h"
2 #include "bsp_timerx.h"
3 #include "bsp_uartx.h"
4
5 /**
6 ***********************************************************************************************************************
7 *@函式名稱:int main(void)
8 *@功能描述:main函式,主函式入口程式碼在這裡開始執行
9 *@輸入引數:None
10 *@返回引數:int:0(和編譯器有關)
11 ***********************************************************************************************************************
12 */
13 int main(void)
14 {
15 //SysTick Init
16 DELAY_Init();
17 //Delay 1000ms
18 DELAY_Ms(1000);
19 //TIM3 Init Config 5ms
20 Bsp_TIM3_Init(SystemCoreClock/100000-1,500-1);
21 //UART1 Init Baudrate 115200
22 Bsp_UART1_Init_Config(UART1_BAUD_RATE);
23 //UART2 Init Baudrate 115200
24 Bsp_UART2_Init_Config(UART2_BAUD_RATE);
25
26 while(1)
27 {
28 //處理UART1接收任務
29 Bsp_UART1_Recv_Task();
30 //處理UART2接收任務
31 Bsp_UART2_Recv_Task();
32
33 }
34 }
(7)UART1和UART2通過USB轉串列埠工具分別與PC機或膝上型電腦的USB口連線,開啟串列埠除錯助手上位機軟體,波特率設為115200,測試UART1接收資料:0x55 0xAA 0xEE和傳送資料(接收到的資料原樣返回給上位機串列埠除錯助手)如下圖1所示,測試UART2接收資料:0xAA 0xBB 0xCC和傳送資料(接收到的資料原樣返回給上位機串列埠除錯助手)如下圖2所示:
圖1
圖2