첫 번째 질문은 여기에 있습니다. 양해 해 주셔서 감사합니다.STM32F4에서 PLL이 메인 프로그램의 나머지 부분을 손상 시키므로 왜 메인 클럭 소스를 설정합니까?
StdPeriph 라이브러리 v1.8.0을 사용하는 STM32F446VET6 기반 보드 (STMicroelectronics의 ST-B96B-F446VE)에 문제가 있습니다.
가;722 RCC->CFGR |= RCC_CFGR_SW_PLL;
; RCC->CFGR = 0x9400
; RCC_CFGR_SW_PLL = 0x02
ldr r2, [pc, #36] ; (0x80005a8 <SetSysClock+284>)
ldr r3, [pc, #36] ; (0x80005a8 <SetSysClock+284>)
ldr r3, [r3, #8]
orr.w r3, r3, #2
str r3, [r2, #8] ; r2 = 0x40023800, r3 = 0x9402
명령 결과를 설정하기 위해, RCC-> CFGR (SW1)의 제 2 비트가 1로 설정하는 것이되어야한다 : I는 SetSysClock 함수에 str
명령에 문제가 좁혀 한 PLL을 주 클록 소스로 사용합니다.
대신에 비트는 0으로 유지되며 플래시의 0x08000000보다 큰 코드가 덮어 씁니다. 같은 다시, 다시 좀 더 덮어 쓰는 일이 보여
; SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
bic.w r3, r3, #262144 ; 0x40000
str r3, [r2, #0]
ldr r3, [pc, #24] ; (0x8000494 <SetSysClock+8>)
이 상태에서 프로그램 실행셔서 및 일시 중지 : 예를 들어, SystemInit이 선() :
; SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
ldr r3, [pc, #12] ; (0x8000484 <SystemInit+96>)
mov.w r2, #134217728 ; 0x8000000
str r2, [r3, #8]
는 끝으로 다시 작성 줄 :
; SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
b.n 0x8000476 <SystemInit+86>
subs r0, #0
ands r2, r0
및 보조 및 ands 지침에 응답하지 않습니다.
덧붙여 말하면 RCC->CFGR |= RCC_CFGR_SW_PLL;
을 RCC->CFGR |= RCC_CFGR_SW_HSE;
으로 바꾸면 문제가 해결됩니다. 손상은 발생하지 않으며 main()이 제대로 실행됩니다. 그러나 이제는 다른 클럭 소스를 사용하고 있으며 이것이 어떤 영향을 미치는지 전혀 알지 못합니다.
플래시 손상을 주 클럭 소스로 PLL을 사용하는 기본 상태로 복귀하고, 피할 수있는 방법이 있습니까?
재설정 후 첫 번째 명령 (종종 'Reset_Handler'라고하는 어셈블리 레이블)에서 중단하고 플래시를 검사하면이 문제가 발생한 후에도 다음 실행에서 플래시가 손상됩니까? 만약 (내가 강력하게 의심하는)이 코드는 런타임 오류가 발생했을 때 플래시가 깨지게 만드는 즉, 플래시 읽기가 실패하는 것을 가리 킵니다. PLL을 전환 할 때 PLL은 어떤 주파수입니까? 안정되어 있습니까? 또한 큐브로 전환하는 것을 고려하십시오. – unwind
또한, 많은 디버거는 사용자가 직접 클럭 소스를 변경할 때이를 적용하지 못합니다. – Lundin
그냥 해냈어. 실제로 플래시가 더 이상 손상되지 않습니다. 무엇이 이것을 일으킬 수 있습니까? PLL의 주파수를 따라 잡지 못하는 플래시일까요? 플래시 대기 상태를 6 대신 11 사이클로 올리려고했지만 아무 소용이 없습니다. PLL 안정성을 테스트하려면 어떻게해야합니까? 큐브를 살펴 보겠습니다. – MBr