|
使用STM32CubeMX 4.20.1配置STM32F103C8,在RCC中配置使用HSE和LSE,生成相关代码如下:- C: `% [& y* G9 p1 C RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;& N, k8 }% |6 ?6 x, j; o2 \7 f RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;( U/ P7 D/ |( j5 d6 h+ {# o$ A8 s if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)$ ?8 c; v8 u1 W& Q# u( W: w & K1 P; i* A, _8 L$ ?3 ` { .....6 i7 k2 a: s. g* i# N( P } .... 编译后运行HAL_RCC_OscConfig(&RCC_OscInitStruct)返回HAL_ERROR,致使程序陷入Error_Handler(void)函数死循环中7 y# p: X) m k" |! \ 而使用STM32CubeMX 4.14生成的程序时钟设置代码如下:1 t8 Z% K9 \7 F" d RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;# ^$ i! z0 ~, m# N8 K8 a RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.LSIState = RCC_LSI_ON;$ q0 D& U, D" U) ?; M% u( D RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;+ m! h/ l' K: x RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;9 O8 N8 m/ {6 A2 _ RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)+ T- x! @6 U1 f2 v% K A { Error_Handler(); } 软件成功设置时钟,正确运行,两个版本生成的代码相差就为上面的红色部分 仔细检查过stm32f1xx_hal_rcc.c文件,两个版本的STM32CubeMX 使用的stm32f1xx_hal_rcc.c完全一致 |
【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官网下载软件问题解决
微信公众号
手机版
*// u- W6 P# T6 s
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;5 p U2 G1 w$ R9 n
RCC_PeriphCLKInitTypeDef PeriphClkInit;
/**Initializes the CPU, AHB and APB busses clocks
*/, j; L# R8 B |
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE;3 F& |1 B) J1 D* J) L2 b
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.LSEState = RCC_LSE_BYPASS;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;5 V/ O- A7 {$ v$ Z! _. h5 M
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;/ }1 i! h [! m: U
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();# z; t; J) A1 C U9 ~8 `
}
/**Initializes the CPU, AHB and APB busses clocks * [$ Q* r7 f' d
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK- B2 d* v# L; Z. D/ r' g
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;) @) ~1 o3 \) r4 o
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;4 r: ^" r- c e( g l4 I
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
+ f7 c1 @( g, @# x
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
if (HAL_RCCEx_PeriphCLKConfig(&
{ i2 E3 M0 D; a: k% Z, K1 h
Error_Handler();+ W% {, u# H% l" L' Q
}
/**Configure the Systick interrupt time
*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);9 i X1 F, b* _! d& F; j
/**Configure the Systick
*/" k9 }. ]# G. @4 G* o% _
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);% V8 ^+ T; [5 X
/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}, w! E9 f% i: F9 ?, n% H E
这里确实不对,软件修改完了难道ST的开发人员不自己测试一下吗?
) D7 q5 g0 ~4 @5 k8 h7 P5 o1 i
/* RTC init function */
static void MX_RTC_Init(void)+ o, S. b/ [( e
{
9 q$ b, B. b2 g& N/ Q3 C
RTC_TimeTypeDef sTime;& E- B% E Y6 P( ~
RTC_DateTypeDef DateToUpdate;
& }! [+ |) ]; H
/**Initialize RTC Only 0 I$ o+ l; W- _2 x1 e7 n* N+ z5 |
*/ F# W% j8 P$ |* j5 J
hrtc.Instance = RTC;$ o: A' W# F; s% J& O8 _# V5 F: C' y
hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;/ g, A/ z, C* P
hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
}+ D4 O& X" t0 w. A5 ^( h
/**Initialize RTC and set the Time and Date
*/
if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x32F2){, R. V5 H' \! X" d: K
sTime.Hours = 0x1;! M' q1 M. c$ U' n% I+ T4 _
sTime.Minutes = 0x0;
sTime.Seconds = 0x0;" W' N# ^/ s, S0 T6 V3 ~4 a& c
7 g* Z/ }& r: ]3 B! n8 Q( z u
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)4 E% I& W! k, U5 \% C7 |4 R
{: s5 P& I$ `' e2 _* I4 @+ j
Error_Handler();2 O! W8 F- ~4 Q+ \2 {
}
DateToUpdate.WeekDay = RTC_WEEKDAY_MONDAY;
DateToUpdate.Month = RTC_MONTH_JANUARY;
DateToUpdate.Date = 0x1;3 G# H! q: _& h
DateToUpdate.Year = 0x0;2 `$ U! K) o, o" I5 v$ r8 {
( u+ A6 }0 O1 J) p! z) A) i
if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}0 v0 L5 h; r- S. i; h
HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,0x32F2);
}
}+ a3 ~& K9 @ s$ A$ K6 G/ j
自动生成了上述红色的代码,没有考虑到RTC_BKP_DR1做了其它用途,这一生成,把这个值直接改了。。。不靠谱啊。。。要不然你直接在UI上让用户选择配置在哪个备份寄存器上,这样直接默认生成到了备份寄存器1上。
{- w9 \% \$ ?% L* T3 f# Y2 j
" }" S* H8 J5 D6 j8 N- Y6 z8 G
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;3 e( y& l1 j: r) ]. u
RCC_PeriphCLKInitTypeDef PeriphClkInit;7 s: S9 u7 ? g" Y- j
: F9 ]. t' x8 [8 j* ?7 c
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE; v0 y) C% o' c {
RCC_OscInitStruct.HSEState = RCC_HSE_ON;3 Q0 [" T4 C! p
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;3 U# S2 u6 V) ]9 b
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;7 A+ F) i% {! [5 ^" J
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) f% a: O5 ^3 f" l1 C1 ]
{! Q# i# a- q( t5 j G: |9 e
Error_Handler();
}
这是生成的代码
这个是F1系列的吗?用的MCU是哪一款?+ {( ^0 O) O" {8 V3 Z$ v& P4 x
以后用的时候留意一下是不是有这个问题
用的是STM32F105VCTx,备份寄存器1我作了Boot升级的判断条件。- U+ {6 D7 ^/ O A. w& r1 q
现在这个 v4.20.1 页还没有解决9 t1 d* a. f: n) y$ x
& \- e- Y$ `( @2 S8 M
估计看到 H7 系列的单片机时能否正真解决哟,真准备下载来试试,看到你发出的bug,还是不下载了,免得浪费时间,之前的 v4.16 貌似使用是非常好的,估计他们现在换人了啊