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初始化函数,代码如下所示: - /**
- ***********************************************************************************************************************
- *@函数名称:void Bsp_TIM3_Init(u16 Prescaler,u16 Period)
- *@功能描述:TIM3 Init
- *@输入参数:Prescaler:预分频系数1-65536、Period:周期值
- *@返回参数:None
- ***********************************************************************************************************************
- */
- void Bsp_TIM3_Init(u16 Prescaler,u16 Period)
- {
- TIM_TimeBaseInitTypeDef TIM_StructInit;
- NVIC_InitTypeDef NVIC_StructInit;
- //使能TIM3外设时钟
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
- //配置TIM3重载计数周期值
- TIM_StructInit.TIM_Period = Period;
- //配置TIM3 预分频系数
- TIM_StructInit.TIM_Prescaler = Prescaler;
- //配置TIM3时钟分割
- TIM_StructInit.TIM_ClockDivision = TIM_CKD_DIV1;
- //向上计数模式
- TIM_StructInit.TIM_CounterMode = TIM_CounterMode_Up;
- //配置脉冲周期计数
- TIM_StructInit.TIM_RepetitionCounter = 0;
- //根据以上配置参数初始化 TIM3结构体成员参数
- TIM_TimeBaseInit(TIM3, &TIM_StructInit);
- //使能TIM3 NVIC中断优先级通道
- NVIC_StructInit.NVIC_IRQChannel = TIM3_IRQn;
- //配置TIM3 NVIC中断优先级
- NVIC_StructInit.NVIC_IRQChannelPriority = 1;
- //使能NVIC中断优先级
- NVIC_StructInit.NVIC_IRQChannelCmd = ENABLE;
- //根据配置的中断优先级参数初始化TIM3中断优先级
- NVIC_Init(&NVIC_StructInit);
- //TIM3计时之前清向上计数标志
- TIM_ClearFlag(TIM3, TIM_FLAG_Update);
- //使能TIM3向上计时中断
- TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
- //使能TIM3 工作
- TIM_Cmd(TIM3, ENABLE);
- }
(2)在bsp_timerx.c中编写TIM3定时中断5ms中断服务函数,代码如下所示: - /**
- **************************************************************************************************************************
- * 函数名称:void TIM3_IRQHandler(void)
- * 函数功能:TIM3中断服务函数
- * 输入参数:无
- * 输出参数:无
- * 返回数值:无
- **************************************************************************************************************************
- */
- void TIM3_IRQHandler(void)
- {
- if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
- {
- TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
- //UART1多少ms允许判断接收完数据,10ms可根据具体情况更改超时时间
- if(UART1_Rx_TimeCnt > 0)
- {
- UART1_Rx_TimeCnt--;
- if(UART1_Rx_TimeCnt == 0)
- {
- UART1_Rx_Flag = true;
- }
- }
- //UART2多少ms允许判断接收完数据,15ms可根据具体情况更改超时时间
- if(UART2_Rx_TimeCnt > 0)
- {
- UART2_Rx_TimeCnt--;
- if(UART2_Rx_TimeCnt == 0)
- {
- UART2_Rx_Flag = true;
- }
- }
- }
- }
(3)在bsp_timerx.h中编写头文件,包含TIM3定时中断5ms初始化函数声明,UART头文件包含,代码如下所示: - #ifndef __BSP_TIMX__H__
- #define __BSP_TIMX__H__
- #include "mm32_device.h"
- #include "hal_conf.h"
- #include "bsp_uartx.h"
- //初始化TIM3
- void Bsp_TIM3_Init(u16 Prescaler,u16 Period);
- #endif
(4)在bsp_uartx.c中编写处理UART1接收数据函数 - /**
- ***********************************************************************************************************************
- *@函数名称:void Bsp_UART1_Recv_Task(void)
- *@功能描述:处理UART1接收任务
- *@输入参数:None
- *@返回参数:None
- ***********************************************************************************************************************
- */
- void Bsp_UART1_Recv_Task(void)
- {
- //UART1接收标志
- if(UART1_Rx_Flag == true)
- {
- UART1_Rx_Flag = false;
- //UART1接收到0x55 0xAA 0xEE
- if((UART1_Rx_Buf[0] == 0x55) && (UART1_Rx_Buf[1] == 0xAA) && (UART1_Rx_Buf[2] == 0xEE))
- {
- //UART1原样返回接收到的数据
- Bsp_UART_SendBytes(UART1,UART1_Rx_Buf,UART1_Rx_Cnt);
- }
- //清UART1接收计数
- UART1_Rx_Cnt = 0;
- //清UART1接收缓存
- memset(UART1_Rx_Buf,0,sizeof(UART1_Rx_Buf));
- }
- }
(5)在bsp_uartx.c中编写处理UART2接收数据函数 - /**
- ***********************************************************************************************************************
- *@函数名称:void Bsp_UART2_Recv_Task(void)
- *@功能描述:处理UART2接收任务
- *@输入参数:None
- *@返回参数:None
- ***********************************************************************************************************************
- */
- void Bsp_UART2_Recv_Task(void)
- {
- //UART2接收标志
- if(UART2_Rx_Flag == true)
- {
- UART2_Rx_Flag = false;
- //UART2接收到0xAA 0xBB 0xCC
- if((UART2_Rx_Buf[0] == 0xAA) && (UART2_Rx_Buf[1] == 0xBB) && (UART2_Rx_Buf[2] == 0xCC))
- {
- //UART2原样返回接收到的数据
- Bsp_UART_SendBytes(UART2,UART2_Rx_Buf,UART2_Rx_Cnt);
- }
- //清UART2接收计数
- UART2_Rx_Cnt = 0;
- //清UART2接收缓存
- memset(UART2_Rx_Buf,0,sizeof(UART2_Rx_Buf));
- }
- }
(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核心板或开发板中。 - #include "delay.h"
- #include "bsp_timerx.h"
- #include "bsp_uartx.h"
- /**
- ***********************************************************************************************************************
- *@函数名称:int main(void)
- *@功能描述:main函数,主函数入口代码在这里开始执行
- *@输入参数:None
- *@返回参数:int:0(和编译器有关)
- ***********************************************************************************************************************
- */
- int main(void)
- {
- //SysTick Init
- DELAY_Init();
- //Delay 1000ms
- DELAY_Ms(1000);
- //TIM3 Init Config 5ms
- Bsp_TIM3_Init(SystemCoreClock/100000-1,500-1);
- //UART1 Init Baudrate 115200
- Bsp_UART1_Init_Config(UART1_BAUD_RATE);
- //UART2 Init Baudrate 115200
- Bsp_UART2_Init_Config(UART2_BAUD_RATE);
- while(1)
- {
- //处理UART1接收任务
- Bsp_UART1_Recv_Task();
- //处理UART2接收任务
- Bsp_UART2_Recv_Task();
- }
- }
|