RT-Thread串口驱动分析(一)

笔记


2016年12月9日10:19:00




串口配置在Drivers\rt_hw_uart.c->rt_hw_uart_init->rt_hw_serial_register()
这里可以设置串口的工作模式,中断接收还有DMA发送.


具体设置在rt_serial_init()函数里




分析下串口初始化代码是怎么被调用的
首先
main()->
->hardware_init()
->assert_init()
->rt_hw_uart_init() //硬件在这里被初始化了,但未使能
->rt_hw_serial_register()
->rt_device_register();
->rt_object_init()
->rt_device_open(_console_device, RT_DEVICE_OFLAG_RDWR);
->if (!(dev->flag & RT_DEVICE_FLAG_ACTIVATED))
-> result = dev->init(dev); //这个init在rt_hw_serial_register()里绑定好了就是对应rt_serial_init
->rt_serial_init() //使能串口



分析下串口是怎么把数据发送出去的:
rt_kprintf()->
->rt_device_write(_console_device, 0, rt_log_buf, length);
->write = dev->write;
->if (write != RT_NULL)
->{
-> return write(dev, pos, buffer, size);
->}

这里的wirte就是rt_serial_write
rt_serial_write()->
->/* polling mode */
->if (dev->flag & RT_DEVICE_FLAG_STREAM)
->{
while (!(uart->uart_device->SR & USART_FLAG_TXE));
      uart->uart_device->DR = (*ptr & 0x1FF); //最终还是调用底层的USART_SendData()
->}




void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data)); 
    
  /* Transmit Data */
  USARTx->DR = (Data & (uint16_t)0x01FF);
}







































































  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值