打印
[APM32F4]

APM32F4XX GPIO模拟USART应用

[复制链接]
475|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1455555|  楼主 | 2023-9-4 09:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1 引言
在系统使用过程中,可能会遇到系统资源不够等情况,此时可以使用IO口模拟串口,实现同样的功能。本应用笔记提供如何在APM32F4xx系列上通过外部中断和定时器完成IO口对串口的模拟
2 APM32F4xx USART简介
USART(通用同步异步收发器)是一个可以灵活地与外部设备进行全双工、半双工数据交换的串行通信设备,且同时满足外部设备对工业标准 NRZ 异步串行数。据格式的要求。USART 还提供宽范围的波特率选择,且支持多处理器通信。 USART 不仅支持标准的异步收发模式,也支持一些其他的串行数据交换模式,如 LIN 协议、智能卡协议、IrDA SIR ENDEC 规范和硬件流控制模式。USART 还支持使用 DMA 功能,以实现高速数据通信。
2.1 串口分类
串行通讯是指将数据逐位顺序传送的通信方式。串口分为同步串行接口和异步串行接口。
同步模式:一次传输的数据块中包含的数据较多,所以接收时钟与发送进钟严格同步,比异步模式多了一个可以输出同步时钟的信号线 USART_CK。适用于大批量数据需要传输的情况。
下图为USART 同步发送时序图,分别给出极性和相位自由组合成的四种情况,图1为USART_CTRL1寄存器的DBLCFG=0,对应1位起始位,8位数据为,一位停止位的情况,图2USART_CTRL1寄存器的DBLCFG=1,对应1位起始位,9位数据位,1位停止位的情况。其中USART_CK 的时钟极性由 USART_CTRL2 寄存器的 CPOL 位决定:CPOL 0时,CK 引脚的空闲状态为低电平;CPOL 1时,CK 引脚的空闲状态为高电平。USART_CK 的相位由 USART_CTRL2 寄存器的 CPHA 位决定:CPHA0时,表明在第1个时钟边沿进行采样;CPOL 1时,表明在第2个时钟边沿进行采样。

图1 USART 同步发送时序图(DBLCFG=0)

2 USART 同步发送时序图(DBLCFG=1)
异步模式是串行,异步,全双工的通信。通过收发双方约定相同波特率实现同步通信,数据以相同的帧格式进行发送。通常运用在短距离、速率不高的工业实际应用中。本文主要讨论异步串口通信情况。
2.2 UART协议概述
异步通信需要收发双方约定好波特率,确定每位比特位的持续时间,以保证双方的时序同步。其中,波特率是指单位时间内传送的码元的符号个数。
串口的报文格式为:起始位(1bit)+ 数据位(5~8 bits)+ 奇偶校验位(0/1 bit)+停止位(0.5~1.5 bits)。起始位:使用串口时,在发送有效,自动产生1bit的低电平起始位。
数据位:通信时有效数据的长度,通常为5~8位。在进行数据收发前,应先完成相应的配置。
奇偶校验位:增加校验位以检验传输过程中是否因干扰出现数据传输错误的情况。设置为奇校验,确保传输数据逻辑高位的个数为奇数;设置为偶校验,确保传输数据逻辑高位的个数为偶数。
停止位:有效数据发送完毕后,发送设定位数的高电平,表示一帧数据传输结束。
空闲位:在下一个起始位逻辑低位到来之前,数据线一直保持高位状态。空闲位不属于报文内容。
具体情况如下图所示。

图3 串口帧结构图(含空闲位)

图4 串口帧结构图(不含空闲位)
3 软件模拟串口
3.1 硬件设计
本次设计使用APM32F407ZGT6GPIO PB9,PB10分别模拟串口的发送线TX和接收线RX。借助USBTTL线,将RX连接开发板的PB9TX连接PB10,同时将两边地线相连。
图5 硬件连接图
3.2 软件设计
本次设计实现功能为接收串口助手发送的数据后,发送相同数据进行回显。设置波特率为 9600 bps,起始位 1bit,数据位 8 bit,不设校验位,停止位 1bit。
设计思路为:将功能实现分为接收和发送两个部分。
接收功能的实现,需要以精确的延时为前提;从而获得正确的数据。例程使用通用定时器定时104us(t= 1/9600 s = 104us)进入中断,在中断服务函数中按位接收数据。
将接收到的数据存入缓存区,并将其发送到串口助手进行回显。
发送功能实现相对简单:将数据线置 0,模拟起始位;利用滴答定时器进行延时104us:利用for循环按位发送并延时。完成8位数据位传输后,将数据线置 1,模拟停止位。
图6 软件实现流程图
3.2.1 GPIO配置
函数完成了 GPIO PB9,PB10 的初始化配置。
将发送引脚 TX PB9 配置为推挽输出模式,输出速度为 50MHz。串口在空闲时,数据位为高电平状态,因此,完成配置后,需将 PB9 置 1。
将接收引脚 RX PB10配置为上拉输入模式,同时配置外部中断,數据开始传输前,一定会产生一个下降沿。因此将 PB10 中断触发方式设定为下降沿触发。
3.2.2 TMR配置
例程使用 TMR4 通用定时器。根据波特率 9600 bps 可知,每一位数据的持续时间为104.16us。配置一次计数时间为 1us,周期设定为 104 可达到所需定时效果。
TMR4 时钟线为 APB1,如图7,图8和图9 所示,根据用户手册和系统时钟初始化西数可知 APB1 为 AHB1 进行 4 分频后得到,最大频率为 42MHz。TMR 时钟频率为 42*2 =84MHz。
根据计算公式将预分频系数设置为 83,得到计数器驱动时钟为 84/ (83+1)=1MHZ,即计数一次时间为 1/1M s=1 us。一次中断产生的时间间隔为自动重装载值 104*计数一次所需时间 1us =104us。
图7 APB1PSC位域说明
图8 时钟树
3.2.3 GPIO模拟串口发送
根据图3可知,空闲时数据线处于高电平状态,由高电平跳变为低电平表示通信开始,因此在有效数据传输前将 pB9 置 0:发送起始位后,根据设置的波特率,延附 104s,利用for循环开始发送数据位。需要注意的是,串口由最低位开始发送。数据位发送结束,将引脚置 1,模拟停止位。

3.2.4 GPIO中断服务函数

当接收到低电平并且按收位超过或等于停止位时,此时重置按收状态为起始位,使能定时器,开始接收新一帧的数据。若接收状态未达到停止位,表示此时的下降沿由有效数据产生,并不表示新数据的到来,可直接跳出中断。

3.2.5 TMR中断服务函数
开启定时器后,每隔104us 触发中断。进入中断服务函数,完成数据的按位接收。由于串口发送数据时,由最低位开始发送,在按收一位数据后需通过移位,将其放置在正确的位置,保证接收数据的准确性。当读取到停止位时,将按收值存入缓存区。

3.2.6主函数
完成初始化后,持续发送接收到的数据。

3.3实验现象
打开串口调试助手,设置波特率,起始位,数据位和停止位后,发送字符,成功回显。


使用特权

评论回复
沙发
Addition| | 2024-3-16 11:17 | 只看该作者
老哥,这个有完整的代码吗?

使用特权

评论回复
板凳
timfordlare| | 2024-4-2 18:52 | 只看该作者
GPIO模拟USART的基本思路是按照串口协议进行操作。对于发送数据,需要计算出不同波特率下的延时时间,并据此发送数据。接收数据则相对复杂,通常通过外部中断检测接收管脚的下降沿来识别起始信号,随后启动定时器,定时器将按照设定的波特率定时产生中断,在中断服务程序中接收数据,每完成一个字节后关闭定时器。

使用特权

评论回复
地板
macpherson| | 2024-4-2 19:38 | 只看该作者
当硬件资源受限或者需要额外的串口时,GPIO模拟USART是一个很好的解决方案。例如,在某些开发板上,如果原生的UART接口已经被使用完毕,但需要更多的串口通信功能,就可以通过GPIO来扩展。

使用特权

评论回复
5
caigang13| | 2024-4-2 20:29 | 只看该作者
串口协议相对简单,不过用IO模拟效率有点低

使用特权

评论回复
6
chenjun89| | 2024-4-3 08:05 | 只看该作者
明明有硬件串口,为什么要用IO模拟呢?

使用特权

评论回复
7
xionghaoyun| | 2024-4-3 10:40 | 只看该作者
看得眼花 简单来说就是模拟串口发送

使用特权

评论回复
8
bestwell| | 2024-4-3 14:41 | 只看该作者
GPIO模拟USART(通用同步/异步接收/发送器)是一种常见的设计,它允许微控制器通过其通用输入/输出引脚来发送和接收串行数据,而不需要专门的USART模块。这种方法在资源有限或需要灵活接口的场合很有用。

使用特权

评论回复
9
bestwell| | 2024-4-4 10:26 | 只看该作者
接收相对复杂,需要精确地检测起始位,然后按照波特率采样数据线以获取每一位的数据。这通常需要用到外部中断或者定时器中断来实现同步。

使用特权

评论回复
10
sesefadou| | 2024-4-4 12:45 | 只看该作者
发送数据时,需要控制GPIO引脚的输出电平,以及在每个位之间保持适当的时间间隔。

使用特权

评论回复
11
sheflynn| | 2024-4-4 15:01 | 只看该作者
使用微控制器的定时器产生所需的波特率。定时器可以触发中断,以在正确的时刻发送或接收数据。

使用特权

评论回复
12
kmzuaz| | 2024-4-4 19:19 | 只看该作者
使用定时器中断来控制数据位的时序。

使用特权

评论回复
13
pixhw| | 2024-4-4 21:23 | 只看该作者
GPIO模拟USART的基本思路是按照串口协议进行操作。对于发送数据,需要计算好不同波特率对应的延时时间来发送数据。对于接收数据,过程稍微复杂一些,需要通过外部中断检测接收管脚的下降沿,检测到起始信号后开启定时器,定时器按照波特率设定好时间,每隔一段时间进入定时器中断接收数据,完成一个字节的接收后关闭定时器。

使用特权

评论回复
14
pl202| | 2024-4-5 20:47 | 只看该作者
使用定时器和IO口来生成起始位、数据位和停止位。根据设定的波特率计算出每位的时间间隔,然后通过GPIO端口按位发送数据。

使用特权

评论回复
15
uiint| | 2024-4-5 22:57 | 只看该作者
将选择的GPIO引脚配置为输出模式,用于发送数据,将接收引脚配置为输入模式,用于接收数据。

使用特权

评论回复
16
uytyu| | 2024-4-6 11:32 | 只看该作者
GPIO模拟的USART并非硬件实现的串口,因此在性能上可能无法达到硬件串口的水平,特别是在高波特率或大数据量传输的情况下。

使用特权

评论回复
17
deliahouse887| | 2024-4-6 13:30 | 只看该作者
模拟USART的实现也可能相对复杂,需要开发者对串口协议和GPIO操作有深入的理解。

使用特权

评论回复
18
yorkbarney| | 2024-4-6 15:47 | 只看该作者
USART通信需要精确的时序控制。使用定时器或时钟来管理发送和接收时序。

使用特权

评论回复
19
geraldbetty| | 2024-4-6 20:00 | 只看该作者
这种模拟方法在某些情况下是非常有用的,特别是当系统资源有限,无法直接添加额外的硬件串口时。

使用特权

评论回复
20
weifeng90| | 2024-4-7 08:07 | 只看该作者
GPIO模拟串口,效率太低了。

使用特权

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

本版积分规则

8

主题

17

帖子

1

粉丝