灵动微电子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

灵动微电子ARM Cortex M0 MM32F0010 UART1和UART2中断接收数据的更多相关文章

  1. 灵动微电子ARM Cortex M0 MM32F0010 Timer定时器中断定时功能的配置

    灵动微电子ARM Cortex M0 MM32F0010 Timer定时器中断定时功能的配置 目录: 1.Timer1高级定时器Timer3通用定时器Timer14基本定时器简介 2.Timer1高级 ...

  2. 灵动微电子ARM Cortex M0 MM32F0010 GPIO 的配置驱动LED灯

    灵动微电子ARM Cortex M0 MM32F0010 GPIO的配置 目录: 1.前言 2.学习方法简要说明 3.要点提示 4.注意事项 5.MM32F0010系统时钟的配置 6.MM32F001 ...

  3. ARM Cortex M0 程序映像和启动流程

  4. MM32F0140 UART1空闲中断接收

    目录: 1.MM32F0140简介 2.初始化MM32F0140 UART1空闲中断和NVIC中断 3.编写MM32F0140 UART1中断接收和空闲中断函数 4.编写MM32F0140 UART1 ...

  5. MM32F0020 UART1空闲中断接收

    目录: 1.MM32F0020简介 2.初始化MM32F0020 UART1空闲中断和NVIC中断 3.编写MM32F0020 UART1中断接收和空闲中断函数 4.编写MM32F0020 UART1 ...

  6. MM32F0020 UART1中断接收

    目录: 1.MM32F0020简介 2.初始化MM32F0020 UART1和NVIC中断 3.编写MM32F0020 UART1中断接收函数 4.编写MM32F0020 UART1发送字节和ASCI ...

  7. MM32F0020 UART1中断接收和UART1中断发送

    目录: 1.MM32F0020简介 2.初始化MM32F0020 UART1和NVIC中断 3.编写MM32F0020 UART1使能中断发送函数 4.编写MM32F0020 UART1中断接收和中断 ...

  8. MM32F0140 UART1中断接收和UART1中断发送

    目录: 1.MM32F0140简介 2.初始化MM32F0140 UART1和NVIC中断 3.编写MM32F0140 UART1使能中断发送函数 4.编写MM32F0140 UART1中断接收和中断 ...

  9. MM32F0140 UART1 DMA RX and TX 中断接收和发送数据

    目录: 1.MM32F0140简介 2.DMA工作原理简介 3.初始化MM32F0140 UART1 4.配置MM32F0140 UART1 DMA接收 5.配置MM32F0140 UART1 DMA ...

随机推荐

  1. Day11_58_增强for循环

    增强for循环 * 语法 : for(数据类型 变量名:数组名/集合名) * 集合如果要使用增强for循环需要先使用泛型来确定元素类型,如果没有使用泛型就使用foreach,那么变量类型设置为Obje ...

  2. HTTP/1.1、HTTP/2、HTTP/3 演变

    HTTP/1.1 相比 HTTP/1.0 提高了什么性能? 针对 HTTP/1.1 的性能瓶颈,HTTP/2 做了什么优化? HTTP/2 有哪些缺陷?HTTP/3 做了哪些优化? HTTP/1.1 ...

  3. 测试报告模板:HTMLTestRunner.py(新版)

    报告样式效果: 报告源码:HTMLTestRunner.py 1 """ 2 A TestRunner for use with the Python unit test ...

  4. hdu1526 二分匹配+ floyd

    题意: 有N个插座,M个用电器,和K种转换器(每种有无限个),问最少多少个用电器无法充电. 思路 :  总的电器数 减去 电器和插座的最大匹配数 我有的是map去映射每一个串,根据转换器建边,然后跑一 ...

  5. 感染性的木马病毒分析之样本KWSUpreport.exe

    一.病毒样本简述 初次拿到样本 KWSUpreport_感染.exe.v 文件,通过使用PE工具,并不能辨别出该样本是那种感染类型,使用了一个比较直接的方法,从网上查资料,获取到了该样本的正常EXE文 ...

  6. UVA11078开放式学分制(前面-后面的最大值)

    题意:       给你一个长度为n的整数序列a0 a1 a2..找出两个整数ai,aj(i<j),使得ai-aj最大. 思路:       简单题目,想象一下,对于每一个数我们只要用他前面的最 ...

  7. CTFHub-easy_search

    easy_search 玩了好些天,今天做道题找找状态,明天开始肝了 打开是一个登录框 用amdin/admin尝试了一下,提示登陆失败 这里肯定不会是暴力破解,我猜是sql注入,试了万能密码or 1 ...

  8. JDBC相关配置和操作

    获取数据库连接的几种方式 ps.数据库URL : String url = "jdbc:mysql://localhost:3306/dailytext?useSSL=false&s ...

  9. 三、多线程之Thread与Runnable的区别

    Thread与Runnable的区别(用三个窗口同时出售10张车票为例子) 运行代码 运行结果 分析 System.out.println("开始测试多线程");class MyT ...

  10. helium的浏览器启动及option配置 - 1

    helium的浏览器启动及option配置 前言 helium只支持chrome和firefox两个浏览器,其中option配置是基于selelium来配置的,所以所调用的也是seleium的配置方式 ...