灵动微电子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外设寄存器编程手册。