靈動微電子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外設寄存器編程手冊。