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);
}







































































你可能感兴趣的:(单片机编程)