我使用SW4STM32工具链,我想在溢出时使用timer2进行bliking,在STM32103RET中, 这是我转向领导的功能。
void TurnOnLed(){
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET);
}
void TurnOffLed()
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_RESET);
}
timer2初始化已由stm32 cube mx设置,但我不知道当timer2溢出时调用了哪个函数?
答案 0 :(得分:5)
您需要按功能启动计时器
HAL_TIM_Base_Start_IT(&htimX);
第一次实现名为HAL_TIM_PeriodElapsedCallback
的回调函数:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIMx) {
}
}
如果您对HAL_Driver一无所知,可以从以下网址找到大量信息:
HAL Driver
C:/Users/%USERNAME%/STM32Cube/Repository/
目录中找到它)stm32f?xx_hal_tim.c
并查看有哪些功能,请参阅他们的评论以了解您正在做什么。并查看从HAL_TIM_IRQHandler
调用哪些函数以了解如何命名回调。答案 1 :(得分:2)
首先,您必须配置计时器:
while(cout << "Enter a positive integer: " &&
(!(cin >> anInteger) || anInteger < 0))
{
cout << "Enter a positive integer.\n";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
while(cout << "Read or write (r/w): " &&
(!(cin >> rw) || (rw != 'r' && rw != 'w')))
{
cout << "Enter r or w.\n";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
第二次使用此函数来处理中断:
/* TIM2 init function */
static void MX_TIM2_Init(void)
{
TIM_SlaveConfigTypeDef sSlaveConfig;
TIM_MasterConfigTypeDef sMasterConfig;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 10000;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 1000;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;
sSlaveConfig.InputTrigger = TIM_TS_ITR0;
if (HAL_TIM_SlaveConfigSynchronization(&htim2, &sSlaveConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
}
不要忘记在main()函数中启用中断:
void TIM2_IRQHandler(void)
{
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_10);
__HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE); //clear interrupt flag
//HAL_Delay(500);
}