靈動微電子ARM Cortex M0 MM32F0010 UART1和UART2中斷接收數據


靈動微電子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

 

結束語:

  關於MM32F0010 UART1和UART2初始化成中斷接收功能的配置可以參考庫函數外設文件即:hal_uart.c和hal_uart.h、hal_rcc.c和hal_rcc.h以及hal_gpio.c和hal_gpio.h文件,如果想了解多一些配置和使用方法可以結合MM32F0010的DS數據手冊和UM外設寄存器編程手冊。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM