1、开发环境
目标单片机 : STM32F407VET6芯片,系统时钟高达168Mhz
开发平台:KEIL 5
编写程序借助ST公司的标准函数库,不过现在已经不更新这个写函数库了,大部分开发都STM32CubeMX软件直接生成代码使用。但旧的东西(标准函数库)仍然能够使用。
2、目标
PWM称为脉冲宽度调制,可通过修改占空比来控制LED灯的亮度(呼吸灯)
占空比:指在一个脉冲循环的周期内,通电时间相对于总时间所占的比例
配置单片机寄存器来产生PWM
使PA1引脚产生方波,
3、代码
pwm.c文件代码
- //TIM5 PWM部分初始化
- //PWM输出初始化
- //@arr:自动重装值
- //@psc:时钟预分频数 单片机168MHz经过系统时钟2分频,PWM外设时钟84MHz/(84-1+1)=1MHz 1us
- //功能:由PA1产生占空比50%的方波
- void TIM5_PWM_Init(u32 arr,u32 psc)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); //TIM5时钟使能
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能PORTA时钟
-
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM5); //GPIOA1复用为定时器5
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //GPIOA1
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
- GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA1
-
- TIM_TimeBaseStructure.TIM_Prescaler=psc; //16bit定时器分频 84Mhz/84 = 1MHz
- TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 1us * 500= 0.5ms溢出时间
- TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
- TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; // 时钟跳动1/168MHz
-
- TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);//初始化定时器5
-
- //初始化TIM5 Channe2
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
- TIM_OC2Init(TIM5, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM5 2OC1
- TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable); //使能TIM5在CCR1上的预装载寄存器
-
- TIM_ARRPreloadConfig(TIM5,ENABLE);//ARPE使能
-
- TIM_Cmd(TIM5, ENABLE); //使能TIM5
-
- TIM_SetCompare2(TIM5,arr/2); //修改比较值,修改占空比50%
- }
- void main(void)
- {
- TIM5_PWM_Init(1000-1,84-1); //arr=200 5KHz arr=1000 1Kh
- while(1)
- {
- /*什么也不做*/
- }
- }
复制代码
|