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,持续去获取直到跳出循环
这里有个坑,当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学习笔记 5】
- 优先级反转实验,使用信号量实现【RT-Thread学习笔记 5】
- 【RT-Thread学习笔记 5】优先级反转实验,使用信号量实现
- RT—thread 上的1588协议在stm32上实现代码及说明
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
- 使用VS配置管理器实现不同版本的输出
- C# Windows Form 下通过MethodInvoker 实现异步调用 (不使用thread)
- JSP使用输入流和输出流实现文件上传示例
- PHP使用zlib扩展实现页面GZIP压缩输出
- 使用Visual FoxPro 8.0的成员类和Excel实现自定义报表输出
- 使用Log4j为项目配置日志输出应用详解以及示例演示的实现分析
- PHP使用zlib扩展实现页面GZIP压缩输出
- 关于一道J笔试或者机试题的Java实现:从键盘输入一串字符,翻转后输出(要求不使用string相关类即对象)
- 华人操作系统项目列表 使用SkyEye来模拟运行RT-Thread
- Android 使用Handler实现Thread间通信
- 基于STM32 8通道ADC采样实现源代码(转) 以后设计参考使用
- 使用ASP.NET 2.0 输出缓存替换的功能实现Donut Caching
- C函数调用-不使用函数返回值,而用参数实现输入/输出的4种模式
- 技巧和诀窍:使用ASP.NET 2.0 输出缓存替换的功能实现“甜圈缓存(Donut Caching)”
- PHP使用zlib扩展实现页面GZIP压缩输出