模拟串口--基于STM8普通IO口的模拟串口驱动程序

基于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
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值