打印
[其他]

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

[复制链接]
595|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
提要:

学习MM32F0140 UART1中断接收和UART1中断发送数据,通过上位机串口助手发送8字节的十六进制数据:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55;下位机MM32F0140的UART1中断接收到一帧:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55 共8字节数据后,通过UART1中断发送函数,把UART1中断接收到的数据原样发送到串口助手显示出来。


使用特权

评论回复
沙发
喂什么玩意|  楼主 | 2022-7-31 22:16 | 只看该作者
内容:

1、MM32F0140简介:

(1)MM32F0140微控制器是基于Arm® Cortex®-M0内核,最高工作频率可达72MHz;

(2)供电电压支持:2.0V - 5.5V;

(3)多达64KB的Flash,8KB的SRAM;

(4)1个I2C;

(5)3个UART;

(6)1个12位共13通道的ADC;

(7)2个I2C或I2S;

(8)1个16位高级定时,1个16位和1个32位的通用定时器,3个16位的基本定时器;

(9)1个FlexCAN接口;

(10)1个IWDG和1个WWDG看门狗。

使用特权

评论回复
板凳
喂什么玩意|  楼主 | 2022-7-31 22:17 | 只看该作者
初始化MM32F0140 UART1和NVIC中断:

MM32F0140 UART1的GPIO初始化,根据MM32F0140的DS数据手册选择PA9:UART1_TX,PA10:UART1_RX做为UART1的发送和接收数据的引脚,具体配置步骤,及其初始化如下所示:

(1)使能GPIOA外设时钟;

(2)配置IO管脚GPIO_AFx复用为UART1功能;

(3)配置UARTx IO的管脚;

(4)配置GPIO的输出速度;

(5)配置IO管脚的工作模式;

(6)根据GPIOA配置的参数整体初始化GPIO各管脚的成员参数。

使用特权

评论回复
地板
喂什么玩意|  楼主 | 2022-7-31 22:18 | 只看该作者
static void Bsp\_UART1\_GPIO\_Init(void)
{
GPIO\_InitTypeDef GPIO\_InitStruct;

//Enable GPIOA Clock
RCC\_AHBPeriphClockCmd(RCC\_AHBENR\_GPIOA, ENABLE);
GPIO\_PinAFConfig(GPIOA, GPIO\_PinSource9, GPIO\_AF\_1);
GPIO\_PinAFConfig(GPIOA, GPIO\_PinSource10, GPIO\_AF\_1);

//PA9:UART1\_TX
    GPIO\_StructInit(&GPIO\_InitStruct);
GPIO\_InitStruct.GPIO\_Pin = GPIO\_Pin\_9;
GPIO\_InitStruct.GPIO\_Speed = GPIO\_Speed\_50MHz;
GPIO\_InitStruct.GPIO\_Mode = GPIO\_Mode\_AF\_PP;
GPIO\_Init(GPIOA, &GPIO\_InitStruct);

//PA10:UART1\_RX
    GPIO\_InitStruct.GPIO\_Pin = GPIO\_Pin\_10;
GPIO\_InitStruct.GPIO\_Mode = GPIO\_Mode\_IPU;
GPIO\_Init(GPIOA, &GPIO\_InitStruct);
}

使用特权

评论回复
5
喂什么玩意|  楼主 | 2022-7-31 22:24 | 只看该作者
MM32F0140 UART1和NVIC中断优先级初始化,具体配置步骤,及其初始化如下所示:

(1)使能UART1外设时钟;

(2)调用之前配置的UART1 GPIO初始化函数;

(3)调配置UART1通信波特率为115200;

(4)配置UART1字长为8位;

(5)配置UART1收发数据为1位停止位;

使用特权

评论回复
6
喂什么玩意|  楼主 | 2022-7-31 22:28 | 只看该作者
(6)配置UART1收发数据为无奇偶校验位;

(7)配置UART1允许串口收发数据;

(8)根据以上配置参数初始化UART1结构体成员;

(9)使能UART1中断接收功能;

(10)配置UART1的NVIC中断优先级为0,并使能和初始化NVIC中断(优先级为0-3均可,参数越小优先级越高)。

使用特权

评论回复
7
喂什么玩意|  楼主 | 2022-7-31 22:31 | 只看该作者
根据以上配置参数,初始化UART1并使能UART1,则UART1初始化代码如下所示:

使用特权

评论回复
8
喂什么玩意|  楼主 | 2022-7-31 22:32 | 只看该作者
void Bsp\_UART1\_NVIC\_Init(u32 baudrate)
{
UART\_InitTypeDef UART\_InitStruct;
NVIC\_InitTypeDef NVIC\_InitStruct;

//Enable UART1 Clock
RCC\_APB2PeriphClockCmd(RCC\_APB2ENR\_UART1, ENABLE);

Bsp\_UART1\_GPIO\_Init();

UART\_StructInit(&UART\_InitStruct);
UART\_InitStruct.BaudRate = baudrate;
//The word length is in 8-bit data format.
    UART\_InitStruct.WordLength = UART\_WordLength\_8b;
UART\_InitStruct.StopBits = UART\_StopBits\_1;
//No even check bit.
    UART\_InitStruct.Parity = UART\_Parity\_No;
//No hardware data flow control.
    UART\_InitStruct.HWFlowControl = UART\_HWFlowControl\_None;
UART\_InitStruct.Mode = UART\_Mode\_Rx | UART\_Mode\_Tx;
UART\_Init(UART1, &UART\_InitStruct);

UART\_ITConfig(UART1,UART\_IT\_RXIEN, ENABLE);

//UART1 NVIC
    NVIC\_InitStruct.NVIC\_IRQChannel = UART1\_IRQn;
NVIC\_InitStruct.NVIC\_IRQChannelPriority = 0;
NVIC\_InitStruct.NVIC\_IRQChannelCmd = ENABLE;
NVIC\_Init(&NVIC\_InitStruct);

UART\_Cmd(UART1, ENABLE);
}

使用特权

评论回复
9
喂什么玩意|  楼主 | 2022-7-31 22:33 | 只看该作者
编写MM32F0140 UART1使能中断发送函数

(1)定义与UART1中断发送相关的缓存、变量,代码如下所示:
//UART1 Tx Buffer
u8 gUART1\_Tx\_Buf[UART1\_TXD\_LEN] = {0x00};
//UART1 Tx Lenth
u8 gUART1\_Tx\_Lenth = 0;
//UART1 Tx Count
u8 gUART1\_Tx\_Real\_Cnt = 0;
//UART1 Tx OK Flag
u8 gUART1\_Tx\_OK\_Flag = 0;

使用特权

评论回复
10
喂什么玩意|  楼主 | 2022-7-31 22:35 | 只看该作者
)根据以上步骤(1)中定义,编写MM32F0140 UART1使能中断发送函数,代码如下所示:
void Bsp\_UART1\_Interrupt\_Send\_Data(UART\_TypeDef* Uart, u8 *pBuf,u8 data\_lenth)
{
gUART1\_Tx\_Real\_Cnt = 0;
gUART1\_Tx\_Lenth = data\_lenth;
memcpy(gUART1\_Tx\_Buf,pBuf,data\_lenth);
UART\_ITConfig(Uart, UART\_IT\_TXIEN, ENABLE );
}

使用特权

评论回复
11
喂什么玩意|  楼主 | 2022-7-31 22:35 | 只看该作者
编写MM32F0140 UART1中断接收和中断发送函数:

MM32F0140 UART1中断接收和中断发送函数代码如下所示,当UART1中断发送完数据后需失能中断发送,当UART1中断发送数据时再次使能中断发送即可。

使用特权

评论回复
12
喂什么玩意|  楼主 | 2022-7-31 22:36 | 只看该作者
void UART1\_IRQHandler(void)
{
u8 Recv;

if(UART\_GetITStatus(UART1, UART\_IT\_RXIEN) != RESET)
{
UART\_ClearITPendingBit(UART1, UART\_IT\_RXIEN);

Recv = UART\_ReceiveData(UART1);

gUART1\_Rx\_Buf[gUART1\_Rx\_Cnt] = Recv;

if(gUART1\_Rx\_Cnt < UART1\_RXD\_LEN-1)
{
gUART1\_Rx\_Cnt++;
}
else
{
gUART1\_Rx\_Cnt = 0;
}
if(gUART1\_Rx\_Cnt == 8)
{
UART1\_Rx\_Flag = true;
}
}
if(UART\_GetITStatus(UART1, UART\_IT\_TXIEN) != RESET)
{
UART\_ClearITPendingBit(UART1, UART\_IT\_TXIEN);

if(gUART1\_Tx\_Real\_Cnt < gUART1\_Tx\_Lenth)
{
UART\_SendData(UART1,(u8)gUART1\_Tx\_Buf[gUART1\_Tx\_Real\_Cnt]);
gUART1\_Tx\_Real\_Cnt++;
}
else
{
UART\_ITConfig(UART1, UART\_IT\_TXIEN, DISABLE);
gUART1\_Tx\_OK\_Flag = 1;
}
}
}

使用特权

评论回复
13
喂什么玩意|  楼主 | 2022-7-31 22:37 | 只看该作者
编写MM32F0140 UART1处理中断接收和UART1使能中断发送函数:

MM32F0140 UART1处理中断接收和使能中断发送数据函数如下所示,当上位机串口助手发送8字节的十六进制数据:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55;下位机MM32F0140的UART1中断接收到一帧:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55 共8字节数据后,通过UART1使能中断发送函数,原样发送UART1中断接收到的数据到串口助手,代码如下所示:

使用特权

评论回复
14
喂什么玩意|  楼主 | 2022-7-31 22:38 | 只看该作者
void Bsp\_UART1\_Recv\_Task(void)
{
if(UART1\_Rx\_Flag == true)
{
UART1\_Rx\_Flag = false;

if((gUART1\_Rx\_Buf[0] == 0xAA) && (gUART1\_Rx\_Buf[1] == 0x01) && (gUART1\_Rx\_Buf[2] == 0x02) && (gUART1\_Rx\_Buf[3] == 0x03) && \
(gUART1\_Rx\_Buf[4] == 0x04) && (gUART1\_Rx\_Buf[5] == 0x05) && (gUART1\_Rx\_Buf[6] == 0x06) && (gUART1\_Rx\_Buf[7] == 0x55))
{
Bsp\_UART1\_Interrupt\_Send\_Data(UART1,gUART1\_Rx\_Buf,gUART1\_Rx\_Cnt);
}
gUART1\_Rx\_Cnt = 0;
memset(gUART1\_Rx\_Buf,0,sizeof(gUART1\_Rx\_Buf));
}
}

使用特权

评论回复
15
喂什么玩意|  楼主 | 2022-7-31 22:41 | 只看该作者
MM32F0140 UART1中断发送UART1中断接收到的数据到上位机串口助手:

当上位机串口助手发送8字节的十六进制数据:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55;下位机MM32F0140的UART1中断接收到一帧:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55 共8字节数据后,通过UART1使能中断发送函数,采用UART1中断发送函数原样发送UART1中断接收到的数据到串口助手显示。

使用特权

评论回复
16
喂什么玩意|  楼主 | 2022-7-31 22:43 | 只看该作者
在main函数中调用UART1 NVIC初始化函数;

使用特权

评论回复
17
喂什么玩意|  楼主 | 2022-7-31 22:44 | 只看该作者
在main函数的while(1)主循环中调用UART1处理中断接收到的数据函数,循环检测UART1的接收中断是否接收到上位机串口助手下发的数据,如有收到就调用UART1使能中断发送函数,原样发送UART1中断接收到的数据到上位机串口助手上显示出来,代码如下所示,串口助手发送和接收数据如下图1所示:

使用特权

评论回复
18
喂什么玩意|  楼主 | 2022-7-31 22:45 | 只看该作者
int main(void)
{
//UART1 NVIC Init Baudrate:115200
Bsp\_UART1\_NVIC\_Init(UART1\_BAUDRATE);

while(1)
{
//Test UART1 RX TX
Bsp\_UART1\_Recv\_Task();
}
}

使用特权

评论回复
19
喂什么玩意|  楼主 | 2022-7-31 23:01 | 只看该作者

使用特权

评论回复
20
喂什么玩意|  楼主 | 2022-7-31 23:02 | 只看该作者
总结:

学习MM32F0140 UART1中断接收和UART1中断发送数据,通过上位机串口助手发送8字节的十六进制数据:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55;下位机MM32F0140的UART1中断接收到一帧:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55 共8字节数据后,通过UART1中断发送函数,把UART1中断接收到的数据原样发送到串口助手显示出来。数据发送和接收的数据帧长度用户可根据实际应用自行编写应用逻辑。
————————————————

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

416

帖子

0

粉丝