【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月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
170 0
|
1月前
STM32CubeMX 串口收发一帧数据
STM32CubeMX 串口收发一帧数据
33 9
|
1月前
|
芯片
STM32CubeMX 串口数据收发
STM32CubeMX 串口数据收发
23 2
|
1月前
|
监控
stm32f407探索者开发板(十八)——串口通信实验讲解(USART_RX_STA流程图详解)
stm32f407探索者开发板(十八)——串口通信实验讲解(USART_RX_STA流程图详解)
|
1月前
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
|
1月前
|
数据安全/隐私保护
STM32F103C8T6实现简易密码锁(CubeMax配置)(一),Oled显示。
项目功能:实现设置密码,登陆密码,后期还可以通过E2PROM实现掉电不丢失数据。通过Oled的显示去判断我们是否设置或者登陆成功。
|
2月前
|
芯片
【STM32】详解RTC实时时钟的概念和配置&示例代码
【STM32】详解RTC实时时钟的概念和配置&示例代码
|
2月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
158 2
|
3月前
|
传感器
|
2月前
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
294 4