
本帖最后由 D5Power 于 2017-11-16 16:45 编辑 ! L6 d! B$ F3 U( [ " F6 e9 g& p# I. {& G7 v2 H 总结下这几天踩过的坑 一、第一个坑,中断设置 一直天真的以为,串口的中断是可以“无需人工设置,自主自发自动”进行的。结果自然是被打脸了。无论如何调试,也进不到中断里去。查阅资料后发现,依然是需要在STM32CubeMX中设置好。设置的位置就在Configuration中的USART2设置(对应你自己要用的串口),如下图所示,将NVIC Setting中的USART2 global interrupt 勾选Enabled,启用中断。英语学习时间:NVIC= Nested Vectored Interrupt Controller ,即嵌套中断向量控制器。 ![]() 二、第二个坑 波特率 如笔记五所记录的内容,在使用开发板发数据到电脑的时候(通过printf方法),数据完全正常,没有任何问题。而当我试着把电脑发送过来的数据进行解析时,却发现开发板收到的数据一直和接收的数据不一致。猜测是波特率不符的原因。但是从表面上看,开发板和SSCOM设置的波特率都是115200,应该没错。想起自己没有设置时钟频率,又跑去STM32CubeMX中,把时钟频率设置成了80MHz,依旧无效。最后考虑是不是达不到这么高的波特率,在把波特率降低到4800后,终于成功了。 根据网上查到的资料,波特率和时钟频率是有关系的,至于具体的关系是怎样的,现在没有去深究。或许不久就会回过头来继续研究这个问题。 $ O, V8 }5 i8 ^1 C5 a: X' Q3 W7 E8 b三、波特率和HAL_UART_Transmit ; z! |# y/ g7 oHAL_UART_Transmit的第三个参数,用来指定最大的发送时间。如果超过这个发送时间还没有发送成功,那么就会返回发送超时。更郁闷的是,如果产生了发送超时,那么后面连接收中断都不会触发了(本问题有待深究)。 , j* {% B, M4 t由于我设置的波特率是4800,也就是说,每秒可以发送4800Bit数据,也就是600字节(Byte)。那么,发送1个字节所需要的时间即为1000/600,大约为1.6毫秒。所以,如果我的传送代码直接复制网上的代码: 5 Z6 P) F. a, W& B# b: n+ ~. ?8 XHAL_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); } 定义一个发送方法,自动根据发送的数据尺寸来计算最小发送时间。但是我觉得这只能算是个临时的方法,最终还是要解决超时而导致接收中断不能触发的问题。这笔暂且记下。 4 Q+ D: H( x) X. X ----------------我是淫荡的分割线---------------- ' z& z3 g9 f$ |编写中的笔记会在我个人的公众号进行,请各位高手斧正。 ![]() 关于单片机、H5游戏开发和微信小程序- N* Y" S3 D9 X |
学习 |
设置串口全局中断后,资源占用一下多了3.4k,导致FLASH不够用了,有解吗? |
NUCLEO-H723ZG开发板试用 ——串口点灯测试
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
MultiButton移植到STM32F103战舰开发板
汇编浮点库qfplib移植STM32F769I-DISCO开发板与硬件浮点运算性能测试对比
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
S2LP 的 sniff 模式如何同时满足通讯和低功耗要求
双证齐发!移远通信通过ISO 26262功能安全流程认证及产品认证
意法半导体 STHV200超声波 IC单片简化设计
了解NFC技术优势与应用场景
基于STM32软件实现底层函数经验分享—IIC通信