.用systick模块,实现蓝灯亮2秒,红灯亮4秒,绿灯亮6秒的交替循环变化
时间: 2024-11-14 15:24:38 浏览: 12
要使用STM32Cube库中的SysTick定时器模块来实现这种交替点亮LED灯的功能,首先你需要做的是:
1. 初始化 SysTick 定时器:在你的STM32程序中,通常会在系统启动时初始化 SysTick。它是一个高精度定时器,可以用于定期触发中断。
```c
void SysTick_Config(uint32_t ticks) {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SYSCFG, ENABLE); // 使能SYSCFG时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); // 使能TIM4时钟
TIM_TimeBaseInitTypeDef.TIM_TimeBaseStructure = {0};
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); // 启用更新事件中断
TIM_Cmd(TIM4, ENABLE); // 开启TIM4计数器
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; // 设置中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 优先级配置
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 子优先级配置
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 启动该中断
NVIC_Init(&NVIC_InitStructure);
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); // 设置 SysTick 频率源为 HCLK
SysTick_Config(ticks); // 设置定时周期,单位为sysTick周期
}
```
2. 使用中断服务函数处理时间:当 SysTick 中断发生时,你可以编写一个中断服务函数,在其中改变 LED 的状态。
```c
void TIM4_IRQHandler(void) {
static uint8_t led_state = 0;
if (ITStatus == IT_Rising) {
led_state = (led_state + 1) % 3; // 循环切换三种颜色
switch (led_state) {
case 0: // 蓝色
GPIO_SetBits(GPIOB, GPIO_Pin_0); // 点亮蓝色LED
break;
case 1: // 红色
GPIO_ResetBits(GPIOB, GPIO_Pin_0); // 关闭蓝色LED,点亮红色LED
GPIO_SetBits(GPIOB, GPIO_Pin_1); // 点亮红色LED
break;
case 2: // 绿色
GPIO_ResetBits(GPIOB, GPIO_Pin_1); // 关闭红色LED,点亮绿色LED
GPIO_SetBits(GPIOB, GPIO_Pin_2); // 点亮绿色LED
break;
}
ITStatus = RESET; // 清除中断标志
}
}
```
3. 结束部分:
在主循环中设置定时器中断,并启用它:
```c
int main(void) {
// ... 其他初始化操作 ...
SysTick_Config(SysTickCycle * 2000); // 设定一个周期为2秒(这里假设SysTickCycle为系统时钟频率的一半)
while (1) {
// 主循环...(在这里添加其他功能)
}
}
```
阅读全文