打印
[APM32F4]

APM32F4XX GPIO模拟USART应用

[复制链接]
1206|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1455555|  楼主 | 2023-9-4 09:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#有奖活动# #每日话题# #技术资源# #申请原创# 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实验现象
打开串口调试助手,设置波特率,起始位,数据位和停止位后,发送字符,成功回显。



使用特权

评论回复
评论
forgot 2023-10-12 11:44 回复TA
赞,来学习一下! 
沙发
happypcb| | 2023-9-4 13:41 | 只看该作者
USART 还提供宽范围的波特率选择,且支持多处理器通信。

使用特权

评论回复
板凳
1455555|  楼主 | 2023-9-4 17:43 | 只看该作者
happypcb 发表于 2023-9-4 13:41
USART 还提供宽范围的波特率选择,且支持多处理器通信。

是的 这个例程的可移植性还太低 后续会改进上传

使用特权

评论回复
地板
kai迪皮| | 2023-9-4 17:49 | 只看该作者
赞赞

使用特权

评论回复
5
goyhuan| | 2023-9-5 09:37 | 只看该作者
最高波特率可以达到多少?

使用特权

评论回复
6
juventus9554| | 2023-9-5 22:28 | 只看该作者
自动重装载值是怎么得出来的

使用特权

评论回复
7
1455555|  楼主 | 2023-9-11 11:17 | 只看该作者
juventus9554 发表于 2023-9-5 22:28
自动重装载值是怎么得出来的

通过计算可以知道9600波特率的位宽为104us(具体计算公式文中有写),配置时基为1us计数一次,自动重装载值就是104

使用特权

评论回复
8
tpgf| | 2023-10-9 16:38 | 只看该作者
普通的串口通讯有必要使用引脚进行模拟吗

使用特权

评论回复
9
drer| | 2023-10-9 16:50 | 只看该作者
如果使用io模拟的话  波特率会不会更加灵活?

使用特权

评论回复
10
wiba| | 2023-10-9 17:20 | 只看该作者
happypcb 发表于 2023-9-4 13:41
USART 还提供宽范围的波特率选择,且支持多处理器通信。

但是这样的话肯定会有一些波特率的时钟有便宜

使用特权

评论回复
11
kxsi| | 2023-10-10 16:24 | 只看该作者
可以使用四个引脚来模拟全双工的通讯方式吗

使用特权

评论回复
12
coshi| | 2023-10-10 16:47 | 只看该作者
是不是可以考虑使用引脚来模拟自己定义的任何一种通讯方式呢

使用特权

评论回复
13
qcliu| | 2023-10-10 17:33 | 只看该作者
coshi 发表于 2023-10-10 16:47
是不是可以考虑使用引脚来模拟自己定义的任何一种通讯方式呢

哈哈 按照你的说法 可以自己定义或者发明一种自己的协议了

使用特权

评论回复
14
1455555|  楼主 | 2023-10-27 00:02 | 只看该作者
tpgf 发表于 2023-10-9 16:38
普通的串口通讯有必要使用引脚进行模拟吗

开发中有时候会出现板载串口资源不够的情况,这个时候软件模拟还是有一定作用的

使用特权

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

本版积分规则

8

主题

17

帖子

1

粉丝