UART通信协议(三)GPIO模拟串口

本文介绍了如何使用GPIO模拟UART串口通信,包括模拟前的准备工作,如选择异步全双工模式,设定数据帧格式和波特率,以及传输时间计算。接着详细讲解了发送和接收一个字节数据的步骤,并提到了监听TX和RX状态变化的重要性。在实践中,可能会遇到波特率匹配、中断定时和引脚电阻等问题,这些问题会影响模拟串口的稳定性和数据准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:上一篇文章中说到了UART的数据帧格式以及它的几种工作模式,在实际应用场合中,UART协议大多通过集成在MCU模块中的硬件逻辑来实现。为了更好的理解UART,在这里写篇文章用软件模拟串口通信,加深印象。

一、模拟前的准备

1.工作模式的选择

  • 这里选择最常见异步全双工模式,无校验位,即TX和RX分别用于收发数据,可同时进行。因为这种模式相比其他的最具有代表性,也比较容易模拟,毕竟学东西都是由易到难的模式 :)

2.数据的格式

  • 这里设定的数据帧格式为1位起始位+8位数据位+1位停止位 = 10位数据位。

3.波特率的选择

  • 这里的波特率选择4800Bd/s,之前说过UART下,码元的状态只有0或1两种,所以此时波特率=比特率,即此时比特率为4800bps。

4.传输时间的计算

  • 按上述所说,1s可以传输4800个bit,所以传输一个Bit的时间是1/4800s = 208us。

5.程序模式的设计

  • 为了便于理解和模拟,这里采用定时器计数轮询的方法,只要含有定时器的可编程芯片都能轻易实现。

6.数据结构的设计

  • 1)状态控制
uint8_t UART_SCON;  //模拟控制寄存器,可控制UART是否有效
#define RIEN (1<<0)
#define TIEN (1<<1)

uint8_t UART_ISR; //模拟状态寄存器
#define RI_Bit (1<<0) //标志传送或接收一个字节的过程中
#define TI_Bit (1<<1)
#define RI_Byte (1<<2) //标志传送或接收一个字节完成
#define TI_Byte (1<<3)

#define UART_TXD_Port M0P_GPIO->P3OUT  //定义传送或接收引脚
#define UART_RXD_Port M0P_GPIO->P3IN
#define UART_TXD_Pin  1<<5
#define UART_RXD_Pin  1<<6

#define UART_BitNum   10  //1bit起始位+8bit数据位+1bit停止位 = 10
#define UART_BitCnt   13 //7 9600 //52 1200 //13 4800

:上述代码中的UART_BitCnt是传送一个Bit需要多少个计数周期。笔者使用的定时器为16us定时器,4800的波特率,计算方法为1/4800*1000000/16 = 13,表示传送一个Bit需要的13个16us的时间。

  • 2)发送数据
typedef struct{
   
   
 uint8_t BitNum;  //用于计数传送了第几个Bit
 uint8_t BitCnt;  //用于计数每个Bit传送需要时间
 uint16_t BitSndBuf; //存储要传送的Bit,包括起始位、数据位和停止位
 uint8_t SBUF;  //要发送的一个字节数据的缓存
}UART_Tran;
  • 3)接收数据
typedef struct{
   
   
 uint8_t BitNum;  //计数接受的Bit数
 uint8_t BitCnt
### 关于RK3562芯片的资源分配 对于Rockchip系列中的RK3562芯片,其具体的技术规格并未在当前引用材料中明确提及。然而,通过类比同一系列其他型号(如RK3576和RK3568),可以推测出一些可能的设计特点[^1]。 #### SRAM大小 通常情况下,嵌入式处理器会配备一定量的内部SRAM用于高速缓存操作。虽然具体的数值未被直接提供,但基于同类产品的设计模式,预计RK3562可能会拥有约512KB至1MB范围内的SRAM容量[^3]。 #### CAN通道数量 CAN总线接口广泛应用于工业控制领域尤其是汽车行业之中。尽管没有确切数据表明RK3562支持多少路CAN控制器实例,但从相似架构来看,至少应该具备双路独立CAN模块来满足多节点通信需求。 #### UART通道数目 串口外设作为基础I/O功能之一,在大多数SoC设计方案里都会保留多个实例以便灵活连接外围设备。参照已知资料可得结论认为该款产品大概率设置有四个或者更多可用UART端口选项可供开发者选用[^2]. #### GPIO引脚数目的估计值 通用输入/输出管脚是任何微控制系统不可或缺组成部分;它们允许硬件工程师实现各种定制化交互逻辑电路构建工作流程。考虑到目标市场定位以及实际应用环境因素影响下,预测本机型应当能够提供不少于六十个GPIO信号源供最终用户自由编程调用. --- ### 汽车MCU的相关配置概述 现代汽车电子系统依赖高性能且可靠的微控单元(MCU)完成众多核心任务处理职责。以下是几个关键方面考量: - **存储器结构**: 高速运行所需的RAM空间往往达到几百K字节级别甚至更大规模以适应复杂算法执行要求; 同时还需要较大只读内存区域用来存放固件程序代码及相关常量表项等内容. - **网络互联能力**: 支持多种标准协议栈比如Ethernet AVB (Audio Video Bridging), FlexRay 和上述提到过的经典CAN bus形式等等从而促进不同子系统的无缝协作. - **模拟数字转换性能**: 提升ADC分辨率有助于更精确采集传感器反馈回来的数据进而改善整体决策质量水平. - **安全机制建设**: 实施全面防护措施防止恶意攻击行为破坏正常运作秩序成为当今趋势所在——这包括但不限于加密引擎集成、身份验证框架搭建等方面努力成果展示出来给外界看得到的效果表现如何呢? ```c // 示例代码片段展示了如何初始化一个典型的汽车 MCU 的 GPIO 引脚 void initialize_gpio() { // 假设我们正在使用某种特定平台上的库函数 gpio_set_direction(GPIO_PIN_1, OUTPUT); // 设置为输出方向 gpio_write_level(GPIO_PIN_1, HIGH_LEVEL); // 输出高电平 gpio_set_interrupt_mode(GPIO_PIN_2, RISING_EDGE); // 配置中断触发条件 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值