stm32中,在定时器写入一个标志位,当标志位为1时候,LED灯亮,当标志位为0时候,LED灯灭,而在外部中断函数里面改变这个标志位的状态,用标准库写
时间: 2023-10-01 17:09:52 浏览: 60
6. LED闪烁(使用位带操作)_LED闪烁_STM32F103_STM32位带操作_源码
假设LED灯连接到STM32的PB0引脚,我们可以按照如下方式编写代码:
首先,需要初始化定时器和GPIO引脚,启用中断:
```c
/* 定义标志位 */
volatile uint8_t flag = 0;
int main(void) {
/* 初始化定时器和GPIO引脚 */
TIM_HandleTypeDef tim;
tim.Instance = TIM2;
tim.Init.Prescaler = 1000 - 1;
tim.Init.CounterMode = TIM_COUNTERMODE_UP;
tim.Init.Period = 1000 - 1;
tim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&tim);
GPIO_InitTypeDef gpio;
gpio.Pin = GPIO_PIN_0;
gpio.Mode = GPIO_MODE_OUTPUT_PP;
gpio.Pull = GPIO_NOPULL;
gpio.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &gpio);
/* 启用定时器中断 */
HAL_TIM_Base_Start_IT(&tim);
/* 启用外部中断 */
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
while(1) {
/* 在主循环中处理标志位 */
if(flag == 1) {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
} else {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
}
}
}
```
接着,我们需要编写定时器中断处理函数,在其中设置标志位:
```c
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
flag = 1;
}
```
最后,我们需要编写外部中断处理函数,在其中清除标志位:
```c
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
flag = 0;
}
```
这样,当定时器中断发生时,标志位被设置为1,LED灯亮;当外部中断发生时,标志位被设置为0,LED灯灭。
阅读全文