이상하게 행동하는 stm32 라이브러리에 코드 조각이 있습니다. 그러나 할당 TIMx->ARR = 33919
후,할당 중 예기치 않은 캐스팅
/* Set the Autoreload value */
TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ;
나는했습니다 TIM_Period = 1999999
:이 타이머 자동 리로드 레지스터에 초기화 구조로 만든 과제입니다. 숫자가 작을수록 일반적으로 오버플로가 발생하므로 (1999999-33919)/65536 = 30
을 확인했습니다. 이것은 16 비트 데이터 유형에서 넘버가 30 번 넘쳤 음을 의미하지만 두 변수 모두 32 비트 부호없는 정수입니다. TIMx를 들어
: TIM_TimeBaseInitStruct를 들어
__IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */
: 구조 선언에서 추출
uint32_t TIM_Period; /*!< Specifies the period value to be loaded into the active
Auto-Reload Register at the next update event.
This parameter must be a number between 0x0000 and 0xFFFF. */
__IO
는 volatile
로 정의되는 경우.
이 그 과제의 분해입니다 :
여기에 무슨 일이 일어나고 무엇296 TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ;
0800c37c: ldr r3, [r7, #0]
0800c37e: ldr r2, [r3, #4]
0800c380: ldr r3, [r7, #4]
0800c382: str r2, [r3, #44] ; 0x2c
이 ..이 외부의 어떤 값이 오버 플로우의 원인이 될 수 있을까? 내가 코드 최적화없이 ST-Link를 통해 실제 하드웨어에서 디버깅을하고 있음을 주목하십시오.
Cortex-M4 MCU가있는 STM32F3-Discovery 보드 인 경우를 대비하여 체크 인 데이터 시트를 점검 할 것입니다. – Raven
'이 매개 변수는 0x0000에서 0xFFFF 사이의 숫자 여야합니다. '라고 표시하는 것 같습니다. 또한 문서를 찾고 : –
참조를 찾았습니다. 지금 업데이트 중입니다. –