您的位置:首页 > 其它

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

2017-09-19 18:59 691 查看
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,持续去获取直到跳出循环
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: