利用定时器 T1 和 GPIO 口编写程序控制 LED 灯控制程序。要求:LED1 亮 1 秒,灭 0.5 秒后,LED2 亮 1 秒,灭 1 秒.交替闪烁。
时间: 2024-06-09 14:07:50 浏览: 13
下面是一个基于STM32的示例代码,使用定时器T1和GPIO控制LED灯交替闪烁,LED1亮1秒,灭0.5秒后,LED2亮1秒,灭1秒后,再循环执行。
```c
#include "stm32f10x.h"
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //LED1和LED2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50MHz输出速度
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB
}
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能TIM1时钟
TIM_TimeBaseStructure.TIM_Period = 999; //计数器周期为1000,即1ms
TIM_TimeBaseStructure.TIM_Prescaler = 71; //预分频器为72,即72MHz/72=1MHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频为1
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //初始化TIM1
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //输出PWM脉冲宽度为0
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性为高
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //初始化TIM1的OC1
TIM_OC2Init(TIM1, &TIM_OCInitStructure); //初始化TIM1的OC2
TIM_Cmd(TIM1, ENABLE); //使能TIM1
}
int main(void)
{
GPIO_Configuration(); //初始化GPIO
TIM_Configuration(); //初始化TIM
while (1)
{
GPIO_SetBits(GPIOB, GPIO_Pin_0); //LED1亮
GPIO_ResetBits(GPIOB, GPIO_Pin_1); //LED2灭
TIM_SetCompare1(TIM1, 1000); //设置TIM1的OC1的PWM脉冲宽度为1000,即1ms
TIM_SetCompare2(TIM1, 0); //设置TIM1的OC2的PWM脉冲宽度为0
Delay(1000); //延时1秒
GPIO_ResetBits(GPIOB, GPIO_Pin_0); //LED1灭
GPIO_SetBits(GPIOB, GPIO_Pin_1); //LED2亮
TIM_SetCompare1(TIM1, 0); //设置TIM1的OC1的PWM脉冲宽度为0
TIM_SetCompare2(TIM1, 1000); //设置TIM1的OC2的PWM脉冲宽度为1000,即1ms
Delay(1000); //延时1秒
GPIO_SetBits(GPIOB, GPIO_Pin_0); //LED1亮
GPIO_ResetBits(GPIOB, GPIO_Pin_1); //LED2灭
TIM_SetCompare1(TIM1, 1000); //设置TIM1的OC1的PWM脉冲宽度为1000,即1ms
TIM_SetCompare2(TIM1, 0); //设置TIM1的OC2的PWM脉冲宽度为0
Delay(500); //延时0.5秒
GPIO_ResetBits(GPIOB, GPIO_Pin_0); //LED1灭
GPIO_SetBits(GPIOB, GPIO_Pin_1); //LED2亮
TIM_SetCompare1(TIM1, 0); //设置TIM1的OC1的PWM脉冲宽度为0
TIM_SetCompare2(TIM1, 1000); //设置TIM1的OC2的PWM脉冲宽度为1000,即1ms
Delay(1000); //延时1秒
}
}
void Delay(__IO uint32_t nCount)
{
for(; nCount != 0; nCount--);
}
```
在上面的代码中,使用了定时器TIM1和两个GPIO口(GPIOB0和GPIOB1)来控制LED灯交替闪烁。在GPIO_Configuration函数中,初始化了GPIOB的0号和1号引脚为推挽输出模式,输出速度为50MHz。在TIM_Configuration函数中,初始化了TIM1的计数器周期为1000,预分频器为71,时钟分频为1,向上计数模式,输出PWM模式1,输出极性为高,同时将TIM1的OC1和OC2初始化为0。在main函数中,先将LED1亮,LED2灭,并将TIM1的OC1设置为1000,OC2设置为0,然后延时1秒。接着将LED1灭,LED2亮,并将TIM1的OC1设置为0,OC2设置为1000,然后延时1秒。再将LED1亮,LED2灭,并将TIM1的OC1设置为1000,OC2设置为0,然后延时0.5秒。最后将LED1灭,LED2亮,并将TIM1的OC1设置为0,OC2设置为1000,然后延时1秒。以上操作将循环执行。注意:在上面的代码中,Delay函数是为了延时用的,实际应用中应该使用更为准确的延时方法,例如定时器中断等。