灵动微电子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. synchronized锁由浅入深解析

    一:几种锁的概念 1.1 自旋锁 自旋锁,当一个线程去获取锁时,如果发现锁已经被其他线程获取,就一直循环等待,然后不断的判断是否能够获取到锁,一直到获取到锁后才会退出循环. 1.2 乐观锁 乐观锁,是 ...

  2. day9.函数2

    一.函数对象 函数是第一类对象,第一等公民,函数对象即函数可以被当作变量去用. 具体分为四个方面: 1.可以被赋值 def func(): print('from func') f = func pr ...

  3. Jenkins 自定义构建结果

    1. Jenkins 构建原理 2. 脚本执行失败立即停止执行 3. 脚本执行失败继续后面的执行但最终的结果是构建失败 1. Jenkins 构建原理 Jenkins 的构建成功和脚本执行成功是两个事 ...

  4. json 标准库

    1. 序列化的简单概念 2. json 标准库 2.1 json.dumps() 2.2 json.loads() 2.3 json.dump() 2.4 json.load() 1. 序列化的简单概 ...

  5. sublime常用快键键

    ---------------最常用的1.新建文件-输入"html:xt"后  按"Ctrl+E键"或 "tab键" ,可快速生成xhtml ...

  6. 1.1.08- Python变量的关联,绑定,引用

    Python中关联.绑定,引用的含义: 在Python中,变量没有类型 关联/绑定/引用都是指变量和一个对象的关联关系. 在交互模式下查看变量的绑定关系: >>>help(" ...

  7. hdu1316 大数

    题意:      给你一个区间,问这个区间有多少个斐波那契数. 思路:      水的大数,可以直接模拟,要是懒可以用JAVA,我模拟的,打表打到1000个就足够用了... #include<s ...

  8. Android so加固的简单脱壳

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78077603 Android应用的so库文件的加固一直存在,也比较常见,特地花时间 ...

  9. Redis—简单动态字符串(SDS)

    目录 Redis-简单动态字符串(SDS) SDS的定义 SDS与C字符串的区别 1. 常数复杂度获取字符串长度: 2. 杜绝缓冲区溢出: 3. 减少修改字符串时带来的内存重分配次数 4. 二进制安全 ...

  10. JavaScript 包管理器 -Yarn

    Fast, reliable, and secure dependency management. 官网地址 Github 特性 离线模式:如果您之前下载了软件包,则可以在没有任何互联网连接的情况下安 ...