2016-12-21 2 views
0

Cube에서 코드를 생성하고 SYSCLK는 168MHz, APB1 타이머 클럭 42MHz, TIM6은 prescaler 1000을 가지고 62까지 카운트합니다. 다음 실험을합니다.DMA 작동 중에 STM32F4 TIM6 인터럽트가 발생하지 않습니다.

30 요소 배열과 일반 모드에서

__HAL_TIM_ENABLE_IT(&htim6, TIM_IT_UPDATE); 
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); 

시작 DAC_DMA에 의해 TIM6 중단을 사용합니다.

void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef *hdac) { 
    conversionCounter++; 
} 

내가 무엇을 기대 :

1) HAL_DAC_ConvCpltCallbackCh1가 (때문에) 비 원형 모드로 한 번이라고 많은 타이머 중단이 기능에

void TIM6_DAC_IRQHandler(void) { 

HAL_TIM_IRQHandler(&htim6); 
tim6Counter++; 
} 

설정 중단 점을 발생하는 방법

카운트 . 그건 진실이야. 이 tim6Counter라고

2)에 실험 tim6Counter 30. 1.

3) DAC가 완료된 후에는, TIM6 처리기 중단 점을 설정하고, DAC 데이터 버퍼의 길이가 30과 동일하게 보유 main while (1) 루프. 문제는 TIM6 처리기에 멈추는 것입니다.

질문 :

1) DMA는 TIM6 중단이 활성화되지 않은 경우에도 작동합니다. 그러나 활성화 된 경우 모든 DMA 요청 대신 단 한 번만 발생하는 이유는 무엇입니까?

2) 타이머 처리기가 정지되는 이유는 무엇입니까?

3) TIM6 SR 레지스터는 HAL 매크로 또는 HAL_TIM_IRQHandler에 의해 지워지지 않습니다. openOCD와 함께 Eclipse를 사용합니다. 그것은 도구의 문제입니까? 또는 처리기에 매달려 있기 때문에?

답변

1

문제는 디버그 일시 중지 중에도 타이머가 계속 계산된다는 것입니다. 타이머를 디버그 모드로 전환 한 후

__HAL_DBGMCU_FREEZE_TIM6(); 

이 제대로 작동합니다. 읽는 동안 참조 설명서의 20.3.4 절이 나에게 알려지지 않았습니다.

관련 문제