|
本帖最后由 D5Power 于 2017-11-16 16:45 编辑 总结下这几天踩过的坑 一、第一个坑,中断设置 一直天真的以为,串口的中断是可以“无需人工设置,自主自发自动”进行的。结果自然是被打脸了。无论如何调试,也进不到中断里去。查阅资料后发现,依然是需要在STM32CubeMX中设置好。设置的位置就在Configuration中的USART2设置(对应你自己要用的串口),如下图所示,将NVIC Setting中的USART2 global interrupt 勾选Enabled,启用中断。英语学习时间:NVIC= Nested Vectored Interrupt Controller ,即嵌套中断向量控制器。
二、第二个坑 波特率 如笔记五所记录的内容,在使用开发板发数据到电脑的时候(通过printf方法),数据完全正常,没有任何问题。而当我试着把电脑发送过来的数据进行解析时,却发现开发板收到的数据一直和接收的数据不一致。猜测是波特率不符的原因。但是从表面上看,开发板和SSCOM设置的波特率都是115200,应该没错。想起自己没有设置时钟频率,又跑去STM32CubeMX中,把时钟频率设置成了80MHz,依旧无效。最后考虑是不是达不到这么高的波特率,在把波特率降低到4800后,终于成功了。 根据网上查到的资料,波特率和时钟频率是有关系的,至于具体的关系是怎样的,现在没有去深究。或许不久就会回过头来继续研究这个问题。 三、波特率和HAL_UART_Transmit HAL_UART_Transmit的第三个参数,用来指定最大的发送时间。如果超过这个发送时间还没有发送成功,那么就会返回发送超时。更郁闷的是,如果产生了发送超时,那么后面连接收中断都不会触发了(本问题有待深究)。 由于我设置的波特率是4800,也就是说,每秒可以发送4800Bit数据,也就是600字节(Byte)。那么,发送1个字节所需要的时间即为1000/600,大约为1.6毫秒。所以,如果我的传送代码直接复制网上的代码: HAL_UART_Transmit(&huart,(uint8_t *)p,1); 给定1毫秒的最大发送时间,那么必然会进入超时。结果就是数据发送出去了,但不会再触发接收中断。因此,需要针对波特率进行调整。代码如下: #define BAUDRATE 4800 #define SEND_TIME_PER_BYTE 2 定义波特率和发送1个字节所需要的最小时间(2毫秒) void send(uint8_t *p,uint8_t size) { HAL_UART_Transmit(&huart2,p,size,size*SEND_TIME_PER_BYTE); } 定义一个发送方法,自动根据发送的数据尺寸来计算最小发送时间。但是我觉得这只能算是个临时的方法,最终还是要解决超时而导致接收中断不能触发的问题。这笔暂且记下。 ----------------我是淫荡的分割线---------------- 编写中的笔记会在我个人的公众号进行,请各位高手斧正。
关于单片机、H5游戏开发和微信小程序 |
| 学习 |
| 设置串口全局中断后,资源占用一下多了3.4k,导致FLASH不够用了,有解吗? |
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
[转]stm32控制NFC模块(PN532)源码(P2P,模拟卡,读写卡等
STM32G070RB+LVGL移植
微信公众号
手机版