【STM32】串口通讯USART串口中断配置

简介: 【STM32】串口通讯USART串口中断配置

STM32 USART 简介

1. STM32的USART通用同步异步收发器是一个串行通信设备,可以灵活的与外部设备进行全双工数据交换。

1. 有别于USART,还有一个UART,它在USART基础上裁减掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是UART。

1. 串口通信一般是以帧格式传输数据,即一帧一帧传输,每帧包含有起始信号、数据信息、停止信息,可能还有校验信息。

1. USART满足外部设备对工业标准NRZ异步串行数据格式的要求,并且使用了小数波特率发生器,可以提供多种波特率,使得它的应用更加广泛。

1. USART支持同步单向通信和半双工发单线通信;还支持同步单向通信和半双工单线通信;还支持局域互连网络LIN、智能卡(SmartCard)协议与 IrDA(红外线数据协会) SIR ENDEC规范。

1. USART支持使用DMA,可实现高速数据通信。

d34330ea2c47f2293431370bf8895ec9_efc13118fb0847fb9ec4132a5c8e0b56.png


TXD和RXD交叉相连,两边共地!

03829ee9a4858a5f5e73d82d14d9c685_2f4be5e2e4724da4a7809fb4115767b0.png

STM32F103ZET6有三个串口

串口12345都挂载在APB2总线上


程序编写

本次使用USART1   PA9 + PA10

GPIOA和串口1都挂载在APB2总线,开启时钟要注意不要开错了,串口属于复用功能,要开启复用时钟

TXD和RXD一个是输出一个是输入,要分别配置

PA9是TXD,输出端口,配置复用推挽输出!配置输出速率10MHz即可

PA10是RXD,输入端口,模式配置上拉输入或浮空输入,不需要配置输出速率

串口配置

设置一个形参,传入波特率

1位停止位,8位数据位,不使用奇偶校验,不使用硬件流控制,模式配置:发送和接收

NVIC配置

36d8d8d6c7c82d6f8079a4adbcceb4e6_c4071f8c641d4c418f6fba27352f8c79.png

USART_FLAG_TXE 发送数据寄存器空标志位

USART_IT_RXNE 接收数据寄存器非空标志位

串口1初始化函数,形参是波特率

1. //BaudRate = 9600  115200
2. void USART1_Init(uint32_t BaudRate)
3. {
4.  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //GPIOA在APB2总线上
5.  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);  //串口1在APB2总线上
6.  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  //串口属于复用功能,要开启复用时钟
7. 
8.  GPIO_InitTypeDef  GPIO_InitStructure;
9.  USART_InitTypeDef USART_InitStructure;
10.   NVIC_InitTypeDef  NVIC_InitStructure;
11. 
12.   //PA9 TXD配置
13.   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;  //配置复用推挽输出!
14.   GPIO_InitStructure.GPIO_Pin   = TXD;  //output
15.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
16.   GPIO_Init(USART_PORT, &GPIO_InitStructure);
17. 
18.   //PA10 RXD配置
19.   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;  //上拉输入 或 浮空输入 都行
20.   GPIO_InitStructure.GPIO_Pin   = RXD;  //input
21.   //不需要输出速率
22.   GPIO_Init(USART_PORT, &GPIO_InitStructure);
23. 
24.   USART_DeInit(USART1);//先初始化一下
25.   USART_InitStructure.USART_BaudRate = BaudRate;//波特率设置 由形参传入
26.   USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位 1位
27.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据位 8位
28.   USART_InitStructure.USART_Parity = USART_Parity_No;//校验位 不使用奇偶校验
29.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//不使用硬件流控制
30.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //模式配置:发送和接收
31.   USART_Init(USART1, &USART_InitStructure);
32. 
33.   USART_ClearFlag(USART1, USART_FLAG_TXE);//开启中断之前,要先清空一下中断标志位
34.   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//接收数据
35.   USART_Cmd(USART1, ENABLE);
36. 
37.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //中断优先级分组
38.   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //中断入口
39.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
40.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
41.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //只有一个中断,这两个还是随便写,没有冲突
42.   NVIC_Init(&NVIC_InitStructure);
43. }

 

串口1的中断服务函数

1. void USART1_IRQHandler (void)
2. {
3.  //判断中断是否进入 (只要不等于0,就说明产生中断事件了)
4.  if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET )
5.  {
6.    USART_SendData(USART1, USART_ReceiveData(USART1));//发送数据,发送串口1接收的数据
7. 
8.    //清除中断事件
9.    USART_ClearITPendingBit(USART1, USART_IT_RXNE);
10. 
11.     //如果==0,就一直在这循环等待,直到等于1才跳出循环,这个标志位是1的时候,代表发送完成了
12.     //while ( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//USART_FLAG_TC标志位 运行不稳定
13.     while ( USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);    
14.   }
15. }

串口2、串口3配置也是一样的

 

然后插上开发板,打开串口调试助手,打开串口,打开串口,打开串口,打开串口,打开串口,打开串口,打开串口,打开串口,打开串口,打开串口,诶嘿,打不开呢~_~

没接USB转TTL当然检测不到串口了!!!

没接USB转TTL当然检测不到串口了!!!

没接USB转TTL当然检测不到串口了!!!


 

硬件接线

参考江科大自化协up主的接线图

362712110b7a716d1bdd17e4562dec78_bbcebdff49054899a5a164faac50f270.png

USB转串口的RXD接(ZET6)单片机的TXD(PA9),TXD接单片机的RXD(PA10)

单片机和USB转TTL模块共地连接,单片机上电,USB转串口也上电

然后就可以打开串口了!

串口配置,根据上述代码勾选,接收区以ASCII码模式接收

在下边的框里输入要发送给单片机的数据,勾选发送新行、自动发送

效果图如下:

8025752c16325435d20052d0d7f59a67_04398d4c98304bfbac07b371e3a0ff74.png


 

实际波形

再用逻辑分析仪抓取一下波形

逻辑分析仪也连接单片机的TXD --- PA9 发送引脚

PA9就一个引脚

这里我用一根杜邦线引出来PA9接到下面这种板子上嘛,逻辑分析仪就可以接到PA9上了(做小车共用VCC和GND的板子~)

d03e467563d3bb1f00aee42faa62cc11_b6fb7fa4d2364fd0b068f227192f719f.png

我连接的是通道7,然后在USBee软件里双击通道7,弹出下面的窗口,串口波形具体配置如下:

184c7540a577e72cd163bf77fc48badd_df24af8d04d943078e6366bc4a8003a5.png

RXD不需要看波形,暂时不接线,不设置

单击Save,可以看到通道7波形变成这样了

523bade6f1217d808db36c192ee050cb_eef10b6bbc9449c89a5705606f6f7c42.png

 

抓取2s波形(500ms定时发送),大概能看4个波形

7889954f4940a8f559c334f5f2673607_827d6538cd9240698a50c896d49b3c30.png

挑选一个波形,放大看看

afa3a809ffcce9cde8ee66c8c0a2e28c_7d9e4b7d6b5a4101b893e76313e49779.png

后两个[D][A]是换行

去掉自动换行再抓取一次波形

7e2d1c373ab5ccc33f47a14f4276b510_06414d6bbccb4093ab34e230440c1d7f.png

这样也能看到波形对应电平状态,电平状态是根据波特率和周期计算的

学习视频链接:

STM32串口通讯USART串口中断配置


相关文章
|
1月前
|
开发者
STM32中断详解及其编程实践
STM32中断详解及其编程实践
179 1
|
17天前
|
传感器
【经典案例】STM32F407使用HAL库配置I2C详解
STM32F407是一个强大的微控制器,广泛应用于嵌入式系统中。在许多应用中,我们需要使用I2C总线来与传感器、EEPROM、显示屏等外设进行通信。本文将详细介绍如何使用STM32 HAL库来配置和使用I2C接口。
30 2
|
11天前
|
芯片
【STM32】详解RTC实时时钟的概念和配置&示例代码
【STM32】详解RTC实时时钟的概念和配置&示例代码
|
11天前
|
芯片
【STM32】STM32简述中断的基础知识
【STM32】STM32简述中断的基础知识
|
1月前
STM32CubeMX配置时钟无法使用高速外部时钟HSE
STM32CubeMX配置时钟无法使用高速外部时钟HSE
|
1月前
|
存储 缓存 芯片
STM32--USART串口
STM32--USART串口
|
1月前
|
Java C语言
STM32使用printf重定向到USART(串口)并打印数据到串口助手
STM32使用printf重定向到USART(串口)并打印数据到串口助手
97 0
|
17天前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
63 2