本帖最后由 会笑的星星 于 2020-4-5 09:44 编辑
有时由于单片机的硬件串口不够用,在要求不高的情况下,比如发送一些调试信息,我们就可以使用I/O口模拟一个串口以完成要做的事情。要自己模拟串口,我们必须要知道串口时序图,如下图所示。
知道时序图,我们就可以编写代码。下面代码是我写的一个模拟串口,波特率取决于你的要求,但模拟串口不宜使用高波特率,一般而言推荐9600以下会比较好,另外该模拟串口没有奇偶校验位。
首先来看看sim_uart.h文件。
- //sim_uart.h
- #ifndef _SIM_UART_
- #define _SIM_UART_
- #include "stm8s.h" //替换成自己的头文件
- #define SIM_UART_IO_H GPIOA->ODR |= 0x08 //拉高,需要更换成你自己的管脚
- #define SIM_UART_IO_L GPIOA->ODR &= ~0x08//拉低,需要更换成你自己的管脚
- //把每一个数据按照时序图发送出去。为保证实时性,这个函数需要在中断中调用,调用
- //间隔取决于串口波特率。比如我需要的串口波特率是9600bps,那么传送一bit所要的时
- //间就是104us,此时中断的调用间隔就是104us
- void app_sim_uart_transmit(void );
- //把一个字节的数据复制到串口缓冲区,这相当于把数据放到硬件串口的数据缓冲区
- void app_sim_uart_tx_set_data(unsigned char data);
- //查询一个串口缓冲区的数据是否发送完成,如果完成返回0,否则返回1
- unsigned char app_sim_uart_get_tx_state(void );
- //初始化模拟串口模块的参数
- void app_sim_uart_init(void );
- #endif
再看看sim_uart.c文件。
|