2017-12-06 37 views
0

첫 번째 질문은 여기에 있습니다. 양해 해 주셔서 감사합니다.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을 사용하는 기본 상태로 복귀하고, 피할 수있는 방법이 있습니까?

+0

재설정 후 첫 번째 명령 (종종 'Reset_Handler'라고하는 어셈블리 레이블)에서 중단하고 플래시를 검사하면이 문제가 발생한 후에도 다음 실행에서 플래시가 손상됩니까? 만약 (내가 강력하게 의심하는)이 코드는 런타임 오류가 발생했을 때 플래시가 깨지게 만드는 즉, 플래시 읽기가 실패하는 것을 가리 킵니다. PLL을 전환 할 때 PLL은 어떤 주파수입니까? 안정되어 있습니까? 또한 큐브로 전환하는 것을 고려하십시오. – unwind

+0

또한, 많은 디버거는 사용자가 직접 클럭 소스를 변경할 때이를 적용하지 못합니다. – Lundin

+0

그냥 해냈어. 실제로 플래시가 더 이상 손상되지 않습니다. 무엇이 이것을 일으킬 수 있습니까? PLL의 주파수를 따라 잡지 못하는 플래시일까요? 플래시 대기 상태를 6 대신 11 사이클로 올리려고했지만 아무 소용이 없습니다. PLL 안정성을 테스트하려면 어떻게해야합니까? 큐브를 살펴 보겠습니다. – MBr

답변

1

나는 SetSysClock 기능의 STR 명령에 문제가 좁혀했습니다 : 보통 이전에 플래시의 대기 상태를 설정하는 것을 잊었다 의미

합니다. 플래시 메모리는 다소 느리다. 보통 많은 MCU의 대기 상태없이 약 20MHz 정도이다. 너무 빨리 실행하면 쓰레기를 읽습니다.

참조 매뉴얼 및 데이터 시트에는 플래시 액세스에 타겟 주파수가 필요한 대기 상태 수를 나타내야합니다. 참고 : 최대 대기 상태에서 플래시를 실행하는 것이 안전합니다 (느리지 만).

+0

이 특정 부분은 제로 대기 상태에서 최대 클록 30MHz를 지정하고 3.3V를 공급합니다. (매뉴얼 6.3.1 테이블 17 장) – Lundin

+0

클럭 소스와 플래시 대기 시간은 system_stm32f4xx.c에 설정되어 있습니다 (아직 작성하지 않았습니다). 오류를 일으키는 행 위의 두 행에서 소스는 다음과 같습니다.'FLASH-> ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_LATENCY_5WS;'FLASH_ACR_LATENCY_15WS'를 사용해 보았습니다. 아무 소용이 없습니다. – MBr