基于STM8普通IO口的模拟串口驱动程序
标准串口通讯数据的格式为:起始位(1) + 数据位(8) + 校验位(1) + 停止位(1)
串口通讯另外一个重要的的部分是设置波特率,波特率就是1秒钟内串口所传输的Bit(位)数。
关于采样频率:为了较小读取或者发送串行数据的误差,我们采取了在N(我用的是4次)次中断中,取固定位置的读取的数据。
我以stm8中9600波特率计算的过程为例:(1秒钟传输9600位)
可以计算出传输1位所需要的时间 T1 = 1/9600 约为104us
由此可知,发送一位数据,定时器中断的时间间隔应为 104/4 = 26us(4倍采样频率)
stm8 内部晶振频率为16M,我采用8分频也就是2M,故MCU震荡周期为 1/2M = 0.5us
由上面的计算我们可以知道要发送一位数据,定时器中断的初值应设为为 26/0.5 =52
以上为相关数据的计算过程,下面是模拟串口驱动程序和注释:
定时器中断与IO口配置:
void TIM3_Configuration(void)
{
TIM3_DeInit();
TIM3_TimeBaseInit(TIM3_PRESCALER_8,52); //52 104
TIM3_ITConfig(TIM3_IT_UPDATE ,ENABLE);
TIM3_ARRPreloadConfig(ENABLE);
TIM3_Cmd(ENABLE); //DISABLE TIM3_Cmd(DISABLE)
}
//模拟串口引脚定义
#define SIM_UART_TX_PORT GPIOC
#define SIM_UART_TX_PIN GPIO_PIN_2
#define SimUartTxHigh() (SIM_UART_TX_PORT->ODR |= (u8)(SIM_UART_TX_PIN))
#define SimUartTxLow() (SIM_UART_TX_PORT->ODR &= (u8)(~SIM_UART_TX_PIN))
#define SIM_UART_RX_PORT GPIOC
#define SIM_UART_RX_PIN GPIO_PIN_3
#define SimUartRxStatus() (SIM_UART_RX_PORT->IDR & SIM_UART_RX_PIN)
GPIO_Init(SIM_UART_RX_PORT, SIM_UART_RX_PIN,GPIO_MODE_IN_PU_NO_IT);
GPIO_Init(SIM_UART