【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串口中断配置


相关文章
|
3月前
STM32中断与事件的理解
STM32中断与事件的理解
46 0
|
4月前
STM32外中断
STM32外中断
34 0
|
4月前
【STM32】通用定时器TIM2-TIM5中断配置方式+继电器控制
【STM32】通用定时器TIM2-TIM5中断配置方式+继电器控制
111 0
|
4月前
【STM32】高级定时器TIM1计数中断配置
【STM32】高级定时器TIM1计数中断配置
237 0
|
8月前
STM32的HAL库开发系列 - TIM定时器中断
STM32的HAL库开发系列 - TIM定时器中断
181 0
|
8月前
|
存储
STM32的HAL库开发系列 - ADC中断
STM32的HAL库开发系列 - ADC中断
175 0
|
8月前
|
编译器
STM32的HAL库开发系列 - GPIO中断/外部中断EXTI
STM32的HAL库开发系列 - GPIO中断/外部中断EXTI
369 0
|
10月前
|
传感器
STM32小项目总结2:(内含:1.对射式红外传感器计次+2.旋转编码器计次+3.定时器定时中断+4.定时器外部中断+5.笔记)
STM32小项目总结2:(内含:1.对射式红外传感器计次+2.旋转编码器计次+3.定时器定时中断+4.定时器外部中断+5.笔记)
157 0
STM32小项目总结2:(内含:1.对射式红外传感器计次+2.旋转编码器计次+3.定时器定时中断+4.定时器外部中断+5.笔记)
|
10月前
STM32:定时器定时中断
STM32:定时器定时中断
93 0
STM32:定时器定时中断
|
10月前
|
开发工具 git
STM32:定时器定时中断软件篇(内含:1.实验现象+2.代码编写思路+3.代码部分+4.定时器常用库函数详解)
STM32:定时器定时中断软件篇(内含:1.实验现象+2.代码编写思路+3.代码部分+4.定时器常用库函数详解)
348 0
STM32:定时器定时中断软件篇(内含:1.实验现象+2.代码编写思路+3.代码部分+4.定时器常用库函数详解)
推荐文章
更多