
1、使用cube配置NIVC中断,配置一下串口的中断; y4 V/ ~( m _- {% \![]() 2、配置串口 ![]() ; W% s8 \/ @! T! M# n9 b+ y, { 3、如果要在线仿真,要记得配置SYS2 D. N" E) k2 r( n3 o% a ![]() 4、使用函数: HAL_UART_Transmit(&huart1,testbuff,10,0xFFFF);进行串口发送, s! C$ c# K* y* w/ ]* P 5、过程中发现直接配置好的串口无法进入中断- @6 O5 @7 b9 |7 N7 _* o 在主函数加上 下面这两句就可以了- v4 Z. Q2 s- g, E __HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);* s7 T" r/ R5 k1 h __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);, t/ _" H& m+ p 6、最后注意,主控程序加了以后,只能进去一次中断 在中断程序最后也要加上。完成了/ o6 M& }( o8 N: }0 E8 f __HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);. ?' H8 @6 N5 }; S __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE); 6 K2 P, x+ l) E9 ? DMA传输的串口通讯 1、配置基础上加DMA。DMA设置—ADD–选择–添加即可。把接受和发送都加上 ![]() . Q5 Z3 o+ F7 v6 ` 2、发送使用函数:HAL_UART_Transmit_DMA(&huart1,TxBuffer1,sizeof(TxBuffer1)); 接收使用函数: void USART1_IRQHandler(void) F, @& }5 \2 s. {5 W1 S {2 l8 e; |2 [+ g8 y+ b HAL_UART_Receive_DMA(&huart1,RxBuffer1,10);1 g5 u- k& o2 v HAL_UART_IRQHandler(&huart1); }" i' \4 a& z6 m! o7 ?* X+ p9 p8 e% y , z. h0 a1 t V: x+ D9 w 3、使用注意事项 HAL_UART_Receive_DMA(&huart1,RxBuffer1,10);这个函数应该在串口初始化就定义一次,告知我们中断接收长度,之前理解错误,放在串口中断里边才第一次定义,结果每次都收不到第一个字节。* s4 o; p8 z) M5 B 另外:使用DMA传输中发现,串口发送时候会进入void USART1_IRQHandler(void)这个函数,如果不进行是否是接收中断判断,会造成错误。后来把串口接收数据部分放入DMA的IRQHandler里边,也就是DMA的接收中断里边,就什么也不需要判断了,非常简单。7 D: C, a: S! f9 b' r5 g. T, C; y 4、另外在使用cube配置完成可能会出现串口只能发一次的情况 stm32f4xx_it.c(我这里以f4位例,其余系列按照芯片进入对应文件)中找到对应TX DMA的中断函数,我这里是DMA2_Stream7_IRQHandler函数,在代码中加入对串口的重新初始化 HAL_DMA_IRQHandler(&hdma_usart1_tx); HAL_UART_Init(&huart1); ,(使用串口几选择串口几,我这里是串口1)如下:. i- o8 w6 E/ q$ d/ | ![]() 解决只能发一次的问题3 w, A9 ?* i8 N5 S" g" S 5、不能进入接收DMA中断DMA2_Stream2_IRQHandler(void),需要在主函数里边加入这两句话。" x% ^$ e$ P: ^% h2 `5 b HAL_UART_Receive_DMA(&huart1, Usart_Rx_Buf, 20); 6、关于中断函数,如果这个里边不加入画线那句,能进入这个函数,但是自己不会跳到回调函数,具体为啥不知道,不知道哪里问题。3 V, c) b% K: [) b: y/ U9 i 后来又发现不放进来回调函数,回调函数也能进去了,不着调是cube哪里配置的问题,已经懵掉 ; P) N+ b6 a! o: W' t* u) Z" a ![]() 5 [5 J* s/ {' X5 o$ U5 Y0 B 7、上操作系统,调试中还出现过奇葩的,串口在一个线程里边发送数据,延时600ms。结果出现1次执行发送两次的情况。后发现是由于该线程的栈大小设置过小造成的 * ~/ W) p h7 g+ y0 [% Y+ l/ m 8、使用回调函数的一点自我感受。使用cube配置的,DMA传输功能的。如果要使用空闲总线中断,使用前加入这两句话。/ |' i6 K1 E/ c3 K W& M/ G __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);) F# S5 {5 T* C HAL_UART_Receive_DMA(&huart1, Usart_Rx_Buf, 10); 串口中断里边加入这些。因为我们进入HAL_UART_AbortReceive_IT(&huart1);会发现里边调用了回调函数HAL_UART_AbortReceiveCpltCallback。所以我们加入下面的以后,我们只需要在我们的文件中加入此回调函数,做串口数据处理。这样就完成了串口接收。 if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)' B- n& g7 @. I8 W% X/ e { s! n% x3 b2 c4 r; H2 p HAL_UART_AbortReceive_IT(&huart1);0 R0 |& a& {% O5 w7 |7 } __HAL_UART_CLEAR_IDLEFLAG(&huart1); } 串口回调函数的一个数据处理举例如下6 Z7 [2 n- l! c# [$ t4 |, C ![]() ————————————————6 X( m4 G4 ~- r- ^/ [$ ?2 x 版权声明:冬麻麻 " F6 o# I' d8 T |
OpenBLT移植到STM32F405开发板
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
【NUCLEO-WB09KE评测】STM32WB09KE的内部BootLoader使用
11111111111111111111111111111111111
STM32芯片ISP串口程序一键下载—FlyMcu
如何使用CubeMX实现STM32的串口通信以及对printf等函数的重定向
基于STM32串口中断之缓存区溢出卡死经验分享
基于STM32 Azure USBx 开发的经验分享
NUCLEO-U545RE-Q评测】4. 串口实用收发测试
NUCLEO-U545RE-Q板卡评测 (第二篇外传)UART的单线半双工的上拉电阻问题