使用STM32 Nucleo-L053R8开发板,基于HAL库做开发,中断方式做串口收发数据,会出现数据丢失或者错误的情况,如下图:* V! A; w C, B
, B2 h4 z$ G/ g$ Z/ a 后来收到了论坛做活动优惠购买的STM32 Nucleo_F072RB,这两者,F072是ARM Cortex-M0,内核,L053是ARM Cortex-M0+内核,但是因为我的代码是用兼容的HAL库写的,所以很容易就移植到了F072RB平台编译通过。下载到F072RB上运行发现,串口数据丢失或者错误的问题完全消失。% A# b" T# J7 L- X" x O6 R 请教了一位有ARM核MCU开发经验的朋友,朋友说中断方式操作串口最好使用FIFO。但是STM32的这两个MCU都没有串口FIFO,且这也解释不了为何F072运行正常,而L053运行出错。朋友再次指出查看一下时钟配置。. J l% t! h. X6 y$ G" m 发现L053的程序代码中给串口配的时钟频率只有2.097Mhz,但是F072的达到了48Mhz。" ~( I' U: n2 W/ y2 t1 w; s6 R
, E9 G; K/ |. [, K: r/ ~6 x" Y
/ Z w6 Q- c% |2 E! [ A O 重新配置L053的串口时钟为32Mhz,然后运行程序,串口数据丢失的现象消失。
相关时钟配置代码的代码: RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_PeriphCLKInitTypeDef PeriphClkInit;7 U" X0 A2 a2 y) b9 p __PWR_CLK_ENABLE();6 X7 a1 s0 J9 m9 I$ L __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);" f6 G4 u2 c1 N! F( k/ z RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;9 N( f% x, V* ~1 _( e RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = 16;+ r5 K/ b+ w {9 g9 [ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;1 e6 d- d8 O3 c7 | RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2; HAL_RCC_OscConfig(&RCC_OscInitStruct);' v( y& z) O( l x. H9 b RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;" E- o2 J3 _* A3 | RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;# B, V$ M4 B; ^6 q2 ^; d/ D; ~ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;; C) Q/ p) ] L& }) Y4 | HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);9 g: v7 r7 q( q) w % o" a0 E1 W7 S- m: Y5 o, i PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2;- _- b- G( Y/ c) H% u* ]3 B PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;) W* R0 W" C8 j; _# I$ u PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;1 c* M; y8 I# g/ R$ }/ w4 r HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);, C) J& x$ H L3 W6 D( C: f$ D, u __SYSCFG_CLK_ENABLE();* n8 f# V# a$ u, c3 v8 ~4 W2 r |
微信公众号
手机版
不是时钟配置不对,是时钟频率相对于自己代码中串口的频繁操作相对偏慢了。我在代码中用中断方式,只要串口有一个字符进来,就立刻产生一个中断。
之前配的那个串口时钟频率,其实用来实现很多坛友们发帖分享的什么串口输出hello world之类,不会有任何问题。
STM32F401 USB与USART不能同时使用。