用stm32单片机编写一段一个灯亮两秒灭了两秒的循环程序
时间: 2024-11-13 18:18:56 浏览: 30
STM8-利用外部中断编写一个按键控制灯的亮灭
3星 · 编辑精心推荐
在STM32单片机上编写这种周期性的灯亮灭程序,通常会涉及到GPIO控制和定时器。假设我们使用的是HAL库,下面是一个基本示例:
```c
#include "stm32f10x_hal.h"
// GPIO初始化
GPIO_InitTypeDef GPIO_InitStruct;
void initialize_GPIO(GPIO_TypeDef* GPIOx, uint16_t Pin)
{
GPIO_InitStruct.Pin = Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL; //无拉力
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; //低速
HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
}
int main(void)
{
// 初始化GPIOA用于LED灯
initialize_GPIO(GPIOA, GPIO_PIN_1); //替换为你实际使用的LED引脚
// 定义定时器和中断
TIM_HandleTypeDef htim1;
htim1.Instance = TIM1;
htim1.Init.Prescaler = 8399; // 这里根据你的系统频率调整,通常是CPU频率/1000000 - 1
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 2000; // 设置周期为2s(单位是Timer的时钟周期)
HAL_TIM_Base_Init(&htim1);
// 开启定时器
HAL_TIM_Base_Start_IT(&htim1);
while (1) {
// 当定时器溢出时,灯亮
HAL_TIM_IRQHandler(&htim1);
HAL_GPIO_SetState(GPIOA, GPIO_PIN_1); // LED亮
// 暂停定时器,等待灯灭
HAL_Delay(2000); // 2s延迟
// 重新设置定时器开始计数
HAL_TIM_Base_Stop_IT(&htim1);
HAL_GPIO_ResetState(GPIOA); // LED灭
}
return 0;
}
```
别忘了根据你的实际硬件配置和需求调整相应的寄存器值和引脚。执行此程序时,灯会在每两个定时器周期(也就是4秒)内亮灭一次。
阅读全文