基于STM32F103使用8路灰度的源程序库函数版本
时间: 2024-03-19 18:41:08 浏览: 16
以下是基于STM32F103使用8路灰度的源程序库函数版本示例代码:
```c
#include "stm32f10x.h"
#define LEDS_PORT GPIOB
#define LEDS_PIN GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10
void TIM2_PWM_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//开启GPIOB和TIM2时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//PB0、PB1、PB5、PB6、PB7、PB8、PB9、PB10设置为复用推挽输出模式
GPIO_InitStructure.GPIO_Pin = LEDS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LEDS_PORT, &GPIO_InitStructure);
//设置TIM2的时基参数
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; //PWM周期为1ms
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; //时钟预分频为72
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
//设置TIM2通道1~8的PWM参数
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_OC4Init(TIM2, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_OC4Init(TIM2, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
//使能TIM2
TIM_Cmd(TIM2, ENABLE);
}
int main(void)
{
uint16_t duty[8] = {0, 100, 200, 300, 400, 500, 600, 700};
uint8_t i;
TIM2_PWM_Init();
while(1)
{
//循环调整PWM占空比,实现灰度控制
for(i = 0; i < 8; i++)
{
TIM_SetCompare1(TIM2, duty[(0+i)%8]);
TIM_SetCompare2(TIM2, duty[(1+i)%8]);
TIM_SetCompare3(TIM2, duty[(2+i)%8]);
TIM_SetCompare4(TIM2, duty[(3+i)%8]);
TIM_SetCompare1(TIM2, duty[(4+i)%8]);
TIM_SetCompare2(TIM2, duty[(5+i)%8]);
TIM_SetCompare3(TIM2, duty[(6+i)%8]);
TIM_SetCompare4(TIM2, duty[(7+i)%8]);
Delay(10);
}
}
}
//简单的延时函数
void Delay(uint32_t count)
{
for(uint32_t i = 0; i < count; i++);
}
```
该程序和前一个程序的主要区别在于使用了STM32F10x标准库函数,例如`GPIO_Init`、`TIM_TimeBaseInit`、`TIM_OCInit`等函数。这些函数可以更加方便地进行GPIO和TIM的初始化和配置,使程序更加简洁易懂。
需要注意的是,为了使用标准库函数,需要在工程的文件夹中添加`stm32f10x.h`和`stm32f10x_tim.h`头文件,并在工程属性中的C/C++编译器选项中添加`-DUSE_STDPERIPH_DRIVER`宏定义。