[메모] 타이머 인터럽트에서 L 치카 (STM32L1-TIM2 사용)
8352 단어 STM32L치카MDK-ARMIoTSTM32CubeMX
개요
HAL_TIM_Base_Start_IT(&htim2);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
STM32L152C-DISCOVERY + STM32CubeMX + MDK-ARM Lite에서 L 치카를 해 보았다 (그 3 ~ L 치카 코드 실행) => 폴링에 의한 L 치카 (HAL_Delay)
STM32L152C-DISCOVERY + STM32CubeMX + MDK-ARM Lite로 L치카를 해보았다(그 4~FreeRTOS) => FreeRTOS에 의한 L 치카 (osDelay)
환경
절차
Discovery | STM32L152C-DISCO | STM32L152RCTx
를 선택하고 [OK] [Pinout]
RCC
=> High Speed Clock(HSE) : Bypass Clock SourcePC13-WKUP2
(IDD_CNT_EN과 함께)를 클릭하고 Reset StateTIM2
=> Clock Source : Internal Clock[Configuration] => [Control] => [TIM2] 클릭
=> TIM2에 공급되는 클럭을 (1000)으로 나눈 주기로, 16000 카운트하면 인터럽트 걸린다.
=> 32MHz ÷ 1000 ÷ 16000 => 2Hz => 500msec마다 인터럽트
main.c
에 ↓ 코드를 쓴다. 그리고는, 빌드하고[F7], 플래시에 구워서[F8], 디버그 Ctrl+[F5], 실행[F5]하면,이런 것이 나오지만, LED는 깜짝 놀랐다. STM이 잠들어가면 디버거가 끊어진다.
Application/user/main.c
/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static int ledOn = 0;
if (htim == &htim2)
{
#define LED_GPIO_PORT GPIOB
#define LED_GREEN_GPIO_PIN GPIO_PIN_7
#define LED_BLUE_GPIO_PIN GPIO_PIN_6
HAL_GPIO_WritePin(LED_GPIO_PORT, LED_GREEN_GPIO_PIN, (ledOn==0) ? GPIO_PIN_RESET : GPIO_PIN_SET);
ledOn = 1 - ledOn;
}
}
/* USER CODE END 0 */
int main(void)
{
....
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim2);
HAL_SuspendTick();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
}
/* USER CODE END 3 */
}
...
간단한 설명
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
HAL_TIM_Base_Start_IT(&htim2);
HAL_SuspendTick();
SysTick을 멈춘다. 1msec마다 SysTick의 인터럽트가 걸려 있는 것 같지만, 이번, SleepMode에 떨어뜨리기 위해, SysTick을 끊는다. 그렇지 않으면, 이 녀석에서 일어나 버린다. (같은 일이 코멘트에 쓰여졌다)
stm32l1xx_hal_pwr.c
/**
* @brief Enters Sleep mode.
* @note In Sleep mode, all I/O pins keep the same state as in Run mode.
* @param Regulator: Specifies the regulator state in SLEEP mode.
* This parameter can be one of the following values:
* @arg PWR_MAINREGULATOR_ON: SLEEP mode with regulator ON
* @arg PWR_LOWPOWERREGULATOR_ON: SLEEP mode with low power regulator ON
* @param SLEEPEntry: Specifies if SLEEP mode is entered with WFI or WFE instruction.
* When WFI entry is used, tick interrupt have to be disabled if not desired as
* the interrupt wake up source.
* This parameter can be one of the following values:
* @arg PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction
* @arg PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction
* @retval None
*/
void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry)
...
HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
Reference
이 문제에 관하여([메모] 타이머 인터럽트에서 L 치카 (STM32L1-TIM2 사용)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mt08/items/636a76deb2661392b98e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)