stm32在rt-thread上使用uart4实现gps的输出

1.  使用之前创建的工程,应该是没有uart4的,依葫芦画瓢添加uart4串口,很容易就实现了中断接收(INT_RX)gps的数据

这里有个坑,当gps吐出的数据大时,打印不全且含有"\0",修改RT_CONSOLEBUF_SIZE的值

2.  进一步想实现gps的dma发送和接收,把rt-thread的串口逻辑看了一遍,总算明白了,里面的dma_transmit只有接口没有实现,这尼玛..  后面参考了公司开发写的一些代码,不使用这个接口了,自己实现.


3.  还有个坑,gps吐出频率为200ms时,会出现空闲中断不及时的问题,找了很久,最后发送gps的波特率是9600,每秒1200字节,200ms 240个字节,如果gps全吐出会大于240字节..  坑呀..


代码下载地址:http://pan.baidu.com/s/1i46tPVR


串口和dma的配置步骤简单说下(按照rt-thread来的,个人理解)

1. RCC_Configuration();
    时钟配置 --> 开启串口时钟和IO的时钟
    
2. GPIO_Configuration();
    配置usart的IO模式和speed


3. NVIC_Configuration(&uart1);
    配置usart中断


4. stm32_configure()
    usart串口的初始化
    


如使用DMA发送和接收
1. NVIC_DMA_Config();
    开启DMA的时钟
    配置DMA发送和接收的中断 --> 比如dma接收为循环接收,达到buff_size上限时将会产生一次中断


2. DMA_Configuration();
    DMA发送和接收的配置
    
    
usart串口dma发送和接收的理解
1. usart串口的中断与dma的中断互不干扰
2. 使用dma发送,发送完成后,进入dma发送的中断函数 DMA2_Channel4_5_IRQHandler
3. 使用usart中断发送 --> 不支持吧,默认是轮询发送模式
4. 使用dma接收,串口使能空闲中断,接收完成后,串口进入中断函数 UART4_IRQHandler; dma进入中断函数(如有必要已配置) DMA2_Channel3_IRQHandler
    UART4_IRQHandler中处理rx_buffer的get_index和put_index,以便读取
5. 使用usart中断接收,进入stm32_getc,读取内容; 进入serial_ringbuffer_putc 保存内容到rx_buffer,持续去获取直到跳出循环

你可能感兴趣的:(RT-thread)