在keil5中用stm32f103c8t6 实现pwm呼吸灯的代码
时间: 2023-09-07 12:12:05 浏览: 26
以下是使用Keil5和STM32F103C8T6微控制器实现PWM呼吸灯的示例代码:
首先,在主函数中调用PWM_Configuration函数进行初始化:
```c
int main(void) {
PWM_Configuration();
while (1) {
for (uint16_t duty_cycle = 0; duty_cycle <= 1000; duty_cycle++) {
TIM_SetCompare1(TIM2, duty_cycle);
for (int i = 0; i < 1000; i++);
}
for (uint16_t duty_cycle = 1000; duty_cycle >= 0; duty_cycle--) {
TIM_SetCompare1(TIM2, duty_cycle);
for (int i = 0; i < 1000; i++);
}
}
}
```
然后,在PWM_Configuration函数中进行TIM2定时器的初始化,设置输出通道1为PWM模式:
```c
void PWM_Configuration(void) {
GPIO_InitTypeDef GPIO_InitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// 使能TIM2和GPIOA的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置GPIOA.1为复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置TIM2
TIM_TimeBaseStructure.TIM_Prescaler = 71; // 时钟预分频,72MHz/72=1MHz
TIM_TimeBaseStructure.TIM_Period = 999; // 定时器计数器上限,1MHz/1000=1kHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 配置TIM2输出通道1为PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; // PWM占空比的初始值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_Cmd(TIM2, ENABLE); // 使能TIM2定时器
}
```
以上示例代码中,通过改变PWM输出通道1的占空比,实现了呼吸灯的效果。具体来说,先从0逐渐增加到1000,再从1000逐渐减小到0,然后不断重复这个过程。其中休眠1000次循环,可以控制呼吸灯的闪烁速度。
相关推荐
















