2013-07-31 6 views
3

이상하게 행동하는 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. */ 

__IOvolatile로 정의되는 경우.

이 그 과제의 분해입니다 :

여기에 무슨 일이 일어나고 무엇
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를 통해 실제 하드웨어에서 디버깅을하고 있음을 주목하십시오.

답변

4

칩에 16 비트 타이머 레지스터가 있다고 추측합니다. 즉, 여전히 32 비트 레지스터 일 수 있지만 유용한 비트가 16 개뿐입니다. 같은

뭔가 : 향후 확인

31    16 15    0 
+--------------------+------------------+ 
|  RESERVED  | Auto-reload value| 
+--------------------+------------------+ 

사실 (당신이 나를 도울 것 특정 부품 번호가있는 경우).

편집 :

enter image description here

편집 : 2 : 일부 문서 [PDF link]를 살펴보면, 내 생각 엔이 확인 될 것 같다 당신은 당신이 사용 된 칩 언급 한 이후, 나도 그 문서를 발견 [PDF link ]이 편리한 다이어그램을 포함하는 : 당신이 볼 수 있듯이

enter image description here

, 일부 타이머는 32 비트 자동 리로드가 있고, 일부는하지 않습니다. 선택한 타이머에 따라 표시되는 동작에 영향을 미칩니다.

+0

Cortex-M4 MCU가있는 STM32F3-Discovery 보드 인 경우를 대비하여 체크 인 데이터 시트를 점검 할 것입니다. – Raven

+0

'이 매개 변수는 0x0000에서 0xFFFF 사이의 숫자 여야합니다. '라고 표시하는 것 같습니다. 또한 문서를 찾고 : –

+0

참조를 찾았습니다. 지금 업데이트 중입니다. –