|
使用STM32CubeMX 4.20.1配置STM32F103C8,在RCC中配置使用HSE和LSE,生成相关代码如下: RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON;; }" z w" d! W T/ q: c RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;& l' @: K) m' S RCC_OscInitStruct.HSIState = RCC_HSI_ON;3 ?* i+ |" p( }" i RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;! v4 O' u! B# C6 A if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)! g) _* n q5 j- }: V: P * _0 k0 O ~( X {3 z5 d2 t" ]# P: S& v1 Y p$ Z .....% V, s1 J, Q$ @" \ }# [2 p) l0 I9 s+ p, f. f .... 编译后运行HAL_RCC_OscConfig(&RCC_OscInitStruct)返回HAL_ERROR,致使程序陷入Error_Handler(void)函数死循环中 而使用STM32CubeMX 4.14生成的程序时钟设置代码如下: RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.LSIState = RCC_LSI_ON;; H. x% i8 l7 J( G/ ~( E1 A9 A RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)/ V7 o$ O: K; X3 n6 H" h8 X6 { {! M( s5 f' _* c Error_Handler();' I) B, \7 R; V* \3 V4 Q9 ` } 软件成功设置时钟,正确运行,两个版本生成的代码相差就为上面的红色部分" D9 B; @3 Y& d 仔细检查过stm32f1xx_hal_rcc.c文件,两个版本的STM32CubeMX 使用的stm32f1xx_hal_rcc.c完全一致8 l! [, Z& P# n+ @7 \4 [ a( a9 a |
【STM32H5 评测】ADC 电压表
【STM32H5 评测】基础硬件加密与随机数性能 - STM32H5E5实测硬件AES加解密、HASH运算、TRNG真随机数输出速率与稳定性
【STM32H5 评测】NUCLEO-H5E5ZJ 使用 TrustZone 安全分区系统实践测试
【STM32H5 评测】CPU核心性能 - STM32H5E5跑 RTOS,观察任务切换速度、中断响应快慢
【STM32H5 评测】介绍、环境搭建、工程测试
#双节活动 1.在CubeMX中引用touchGFX出现的问题与解决
如何将STM32CubeMX生成的CMake工程导入STM32CubeIDE
【 逢7发帖赢大礼】1、利用CubeMX生成正点原子H7R7开发板的STM32CubeIDE工程
STM32CubeCLT 1.22.0新版本发布
【下载问题解决】关于ST官网下载软件问题解决
微信公众号
手机版
*/
void SystemClock_Config(void)
{$ k- @9 _. p5 _) U; m( A; `
* c- n% W; B$ X6 O
RCC_OscInitTypeDef RCC_OscInitStruct;, N& S0 k5 D' N3 j) e0 ^3 _( l
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInit;; d9 [( i' J' H3 G) [8 b7 P
& I! R8 E& `& k
/**Initializes the CPU, AHB and APB busses clocks J- L( M7 J: i1 W8 n
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE;* g2 _! Z# V* {5 F. U& r
RCC_OscInitStruct.HSEState = RCC_HSE_ON;7 C! S6 t7 }# T/ G0 a2 Y8 f7 t% c
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.LSEState = RCC_LSE_BYPASS;; K2 g, A1 B- q% E+ ?+ G* Y/ N
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;2 E/ Q* u" M! G$ R t: x5 _; g
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;3 q+ c4 [; r8 R4 B- f/ `4 u
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;0 D- k0 e: u* \% v+ S3 \
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{! n! g: Q5 t! [
Error_Handler();
}
/**Initializes the CPU, AHB and APB busses clocks O2 _8 D% e2 O* P; f9 s$ H
*/9 i( ~2 {8 v6 D" G( r' N* X4 s
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;+ W; j- d4 G: H5 z
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;/ h- o4 t% f& K! \4 L3 `
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)( ]% z" b5 W4 h; V
{% C) Y2 t3 \2 _# B
Error_Handler();
}' v# T% U) m" G& u: G% V5 x5 o
7 T1 M- Z1 \# C! H; g* J
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;4 X4 c8 S6 N2 q' A$ S6 v
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;3 S- Q' J. x9 `' O& r) j8 v
if (HAL_RCCEx_PeriphCLKConfig(&
{) }' V3 I& B, C* ^3 u/ Q& \" Z, E1 Q
Error_Handler();6 D- f! p; L2 H' ]7 W
}" t5 h. i. b3 ^4 ]- D5 G
# N/ j$ Z3 y: h* L
/**Configure the Systick interrupt time 3 ^8 K/ z% I. v& p) s1 f
*/$ u7 [1 N& A4 k6 S% U
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
/**Configure the Systick
*/
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);5 m o) o# e# a* |, Q
/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);9 r1 z8 I2 [7 ?7 E/ l
}
这里确实不对,软件修改完了难道ST的开发人员不自己测试一下吗?
+ F7 m- h; m% T2 N- G. S3 K
/* RTC init function */
static void MX_RTC_Init(void)
{
RTC_TimeTypeDef sTime;) Q! a8 P" @6 B g: r9 t$ r' a
RTC_DateTypeDef DateToUpdate;
. r; A' m4 h+ C) t# E/ o
/**Initialize RTC Only ) T6 X; Z7 a8 Y4 p& S3 {
*/
hrtc.Instance = RTC;
hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;" F; v9 b0 [2 U7 W
hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{0 j3 |: M6 C( R- a7 | n! o( T
Error_Handler();4 Z0 }4 m( g* T) x; I* R$ J
}
, U- |: P+ N# q0 z# n" A& p
/**Initialize RTC and set the Time and Date
*/
if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x32F2){
sTime.Hours = 0x1;
sTime.Minutes = 0x0;; X5 T" G/ n* _5 g
sTime.Seconds = 0x0;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)6 M& J& v4 S0 p% b
{4 S0 P6 r3 P5 |9 {
Error_Handler();
}
* [( H x D9 K$ t9 N0 Y
DateToUpdate.WeekDay = RTC_WEEKDAY_MONDAY;/ l+ r) h$ [1 h x
DateToUpdate.Month = RTC_MONTH_JANUARY;3 A) K% v g, W
DateToUpdate.Date = 0x1;
DateToUpdate.Year = 0x0;
if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK)
{( [8 F& ^9 h4 d
Error_Handler();4 n! q4 m1 l, g3 s0 y2 D
}
. w' T+ X* H4 m, h2 V1 J/ F
HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,0x32F2);; x5 b- R. R* i, [' ^7 t8 i6 y5 |7 x
}
9 s3 j* c4 @ f. |( t
}
自动生成了上述红色的代码,没有考虑到RTC_BKP_DR1做了其它用途,这一生成,把这个值直接改了。。。不靠谱啊。。。要不然你直接在UI上让用户选择配置在哪个备份寄存器上,这样直接默认生成到了备份寄存器1上。
{, S8 z2 |) d: {+ O4 C
+ e1 `$ j" C6 }. E4 b
RCC_OscInitTypeDef RCC_OscInitStruct;. W' D( \/ y- o; Q) I
RCC_ClkInitTypeDef RCC_ClkInitStruct;- A$ w( x5 ^: ~9 i1 a4 n& a" ?/ \
RCC_PeriphCLKInitTypeDef PeriphClkInit;
3 d' t7 Q2 [& m+ [6 `; c
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;& x1 }% A6 \8 t( @" Q! h5 E( v
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;' k5 {% x1 c2 `. J- L
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{3 ?) W& m1 A' B6 Z4 B4 Q
Error_Handler(); F6 z' ~/ o2 d
}: @7 `# d2 C Z, x+ S- Q/ `
这是生成的代码
这个是F1系列的吗?用的MCU是哪一款?
以后用的时候留意一下是不是有这个问题
用的是STM32F105VCTx,备份寄存器1我作了Boot升级的判断条件。$ {/ M4 K) ]* Y5 z+ [% X! @
' u i: A' _2 r$ X
现在这个 v4.20.1 页还没有解决: s2 @ F! S% G0 I
估计看到 H7 系列的单片机时能否正真解决哟,真准备下载来试试,看到你发出的bug,还是不下载了,免得浪费时间,之前的 v4.16 貌似使用是非常好的,估计他们现在换人了啊