使用STM32 Nucleo-L053R8开发板,基于HAL库做开发,中断方式做串口收发数据,会出现数据丢失或者错误的情况,如下图:0 J. V: S4 [% z6 Q& a
2 ~7 e+ G9 Y$ f9 P 后来收到了论坛做活动优惠购买的STM32 Nucleo_F072RB,这两者,F072是ARM Cortex-M0,内核,L053是ARM Cortex-M0+内核,但是因为我的代码是用兼容的HAL库写的,所以很容易就移植到了F072RB平台编译通过。下载到F072RB上运行发现,串口数据丢失或者错误的问题完全消失。" n+ e7 e3 W1 X1 r 请教了一位有ARM核MCU开发经验的朋友,朋友说中断方式操作串口最好使用FIFO。但是STM32的这两个MCU都没有串口FIFO,且这也解释不了为何F072运行正常,而L053运行出错。朋友再次指出查看一下时钟配置。 发现L053的程序代码中给串口配的时钟频率只有2.097Mhz,但是F072的达到了48Mhz。4 n- F5 X8 w. s/ d, E
重新配置L053的串口时钟为32Mhz,然后运行程序,串口数据丢失的现象消失。' a; H! {" B7 {
相关时钟配置代码的代码: RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_PeriphCLKInitTypeDef PeriphClkInit;& A0 S. D9 ]" k4 X* R __PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); . n8 Z8 S8 o4 y5 {+ ]6 T0 }* X RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = 16; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;! c3 h( S- @0 U) X) k# E7 w% P RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;# o1 O7 X% }- I RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4; RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2; HAL_RCC_OscConfig(&RCC_OscInitStruct);7 @ o) s1 P0 _% f: @2 w& J" l RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);# ~9 ?# o. N3 X3 P" y9 Y! ` ( w7 u2 u: a' p& ], }3 C! V PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2;7 y9 m" d) w" }' q PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2; PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);( E) G( M) I5 T2 h4 ]( s2 P& y __SYSCFG_CLK_ENABLE();. I8 j- `& ^; |" U* i0 | + J! E; M. \0 v" n. ^ |
微信公众号
手机版
不是时钟配置不对,是时钟频率相对于自己代码中串口的频繁操作相对偏慢了。我在代码中用中断方式,只要串口有一个字符进来,就立刻产生一个中断。
之前配的那个串口时钟频率,其实用来实现很多坛友们发帖分享的什么串口输出hello world之类,不会有任何问题。
STM32F401 USB与USART不能同时使用。