|
使用STM32CubeMX 4.20.1配置STM32F103C8,在RCC中配置使用HSE和LSE,生成相关代码如下:) m T& ?* R. B' Z% j8 h+ K5 Y RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON;% o$ G/ D4 M/ Z$ D$ U6 G R0 |! R RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.HSIState = RCC_HSI_ON;% g! h) Z, @% p7 w% Y" C" j( | RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;( u# e& H# h z( q5 U- P% z RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {8 }( W/ O q+ E, b+ Z ..... }% t F1 Q/ J% P j% u* @9 s, ^& j .... 编译后运行HAL_RCC_OscConfig(&RCC_OscInitStruct)返回HAL_ERROR,致使程序陷入Error_Handler(void)函数死循环中, R8 S" h5 ?, u% _3 V 而使用STM32CubeMX 4.14生成的程序时钟设置代码如下: RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; d+ ?" Z. |- P9 Y. G' I RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.LSIState = RCC_LSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;! J# _ E+ g8 c0 B RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;8 `+ g/ U9 [, R( V/ a$ l RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler();! {- V9 ^9 b$ b# O2 {# M }1 n6 l8 G, [! j# M* ^. A 软件成功设置时钟,正确运行,两个版本生成的代码相差就为上面的红色部分 仔细检查过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官网下载软件问题解决
微信公众号
手机版
*/! }! C; ^7 s. _8 k0 B% N, K
void SystemClock_Config(void)
{( K/ ?) U' q" [# }1 b
/ q0 c9 @% r2 i7 h% ~
RCC_OscInitTypeDef RCC_OscInitStruct;" _" c9 o0 B. b0 S2 x
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInit;
/**Initializes the CPU, AHB and APB busses clocks 3 S) Y* R9 _$ w) G6 i/ l
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE;9 u/ g$ t3 s* {: {1 I
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.LSEState = RCC_LSE_BYPASS;9 ]8 @: f- |9 [/ g# [9 Z
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;! y# [3 R/ P& g0 B" ~. _7 M
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{4 t& \8 R; Z7 @
Error_Handler();: R2 ?3 t) d0 `! W& l; w+ n V" D* o6 i
}* q' z) W! u9 W" \; k: c& r
/**Initializes the CPU, AHB and APB busses clocks 8 _; h3 P. |5 Y9 Y1 I, E' w
*/
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& C' ^3 a5 {0 ^0 @, _0 D
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;1 p. ]+ c o: g u8 b3 K1 [
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)+ Q6 s! k k# t9 ?* e) L
{
Error_Handler();
}- i3 x% l$ Y2 D" ~) D2 _3 ^
3 ~3 Z9 Q9 z# b/ i8 u8 |, L8 Y# I+ a# e
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;+ b$ h2 |" ^2 W3 P3 K; X: W% a# x
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
if (HAL_RCCEx_PeriphCLKConfig(&
{) z) d* L7 B# S* Y$ |
Error_Handler();
}3 p8 J& ?6 w. u$ D
/**Configure the Systick interrupt time 6 q6 _2 q3 z0 N* d7 ~
*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);" b8 N* X) b5 F3 h0 ]" a
/**Configure the Systick
*/
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);! M3 k8 \* f/ U* [5 P6 L
/* SysTick_IRQn interrupt configuration */( b7 F2 z. T7 H2 b8 d, Z o3 }! z
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
这里确实不对,软件修改完了难道ST的开发人员不自己测试一下吗?
# l( S* `! s" U1 b- |! s! E
/* RTC init function */( c: K5 y% ?7 b# r# G% m. D) b S
static void MX_RTC_Init(void)
{; ?9 y5 l+ @$ m* _; W4 P( G
) u" V9 K# F9 w7 E1 C0 t8 y. I4 w
RTC_TimeTypeDef sTime;
RTC_DateTypeDef DateToUpdate;8 t; N- q6 ?! Q ^" |5 t
. v. j3 B0 s4 O5 @
/**Initialize RTC Only
*/
hrtc.Instance = RTC;( S1 a5 p' m0 a0 u2 ^5 k
hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;; r w" P( d0 p8 G, {
hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{, q% _3 v0 X) S6 s9 O4 A" `; u* x
Error_Handler();
}: B' n5 t; m/ V5 m* o( a
- [& m( F5 l) B0 r- F
/**Initialize RTC and set the Time and Date
*/
if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x32F2){
sTime.Hours = 0x1;& d, o) I- K' a& b
sTime.Minutes = 0x0;
sTime.Seconds = 0x0;$ K9 i0 Y) m* R/ Q8 E6 g
# K2 l; O) ]5 E* R, o. E8 ]( M `
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)7 s1 I7 O% b6 G5 t6 ]2 C5 N" [
{" [! ^: r, g7 W# j* G' b* I
Error_Handler();
}7 D2 {1 J) d. l$ E4 Z
DateToUpdate.WeekDay = RTC_WEEKDAY_MONDAY;' u" l0 x3 g- C+ [1 w. P! W
DateToUpdate.Month = RTC_MONTH_JANUARY;: S$ g q/ N( Z4 d4 p* N
DateToUpdate.Date = 0x1;
DateToUpdate.Year = 0x0;. q4 L% F1 K7 B f3 D
/ e, @! R! }! E
if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK)
{1 C1 S! b8 I+ @: Q
Error_Handler();
}) M! t/ n/ W# `
& B0 p$ ?( {8 k; K
HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,0x32F2);/ C/ I$ h' z0 X U9 D4 R
}
}; _6 t1 s0 a3 E. [2 Y) R6 b
自动生成了上述红色的代码,没有考虑到RTC_BKP_DR1做了其它用途,这一生成,把这个值直接改了。。。不靠谱啊。。。要不然你直接在UI上让用户选择配置在哪个备份寄存器上,这样直接默认生成到了备份寄存器1上。
{' ^8 Y L: @. o$ R& m% N" o. Y
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInit;
/**Initializes the CPU, AHB and APB busses clocks
*/- A) W! s- v/ B( Y3 f) E! R- d
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;/ v+ s% i. O9 w, J6 w$ c
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;2 a& P' u: j/ N ^7 f% u
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;3 H3 {' B5 g0 L$ t# X( ?
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)) f% r9 Q5 n; e' j
{! h" H( D: c, S& J
Error_Handler();3 Z, ?3 P& ]8 K/ x# ~$ A2 o7 C
}7 y- L+ t0 X* T; p! r
这是生成的代码
这个是F1系列的吗?用的MCU是哪一款?
以后用的时候留意一下是不是有这个问题
用的是STM32F105VCTx,备份寄存器1我作了Boot升级的判断条件。1 C: F$ r' l7 J. A; O! p
现在这个 v4.20.1 页还没有解决5 ^# m, c- w' Z" L" f) N
0 k5 G! n5 Y! n" C+ \
估计看到 H7 系列的单片机时能否正真解决哟,真准备下载来试试,看到你发出的bug,还是不下载了,免得浪费时间,之前的 v4.16 貌似使用是非常好的,估计他们现在换人了啊