本实验所要实现的功能是:通过TIM3的CH1输出一个PWM信号,控制D7指示
灯由暗变亮,再由亮变暗,类似于人的呼吸。程序框架如下:
(1)初始化PC6管脚为PWM输出功能
(2)PWM输出控制程序
本实验的硬件电路非常简单,只使用到开发板上的LED(D7),因为D7指
示灯接在PC6管脚,而通过对TIM3_CH1复用功能完全重映射就可以映射到
PC6脚。所以可以通过TIM3的CH1输出PWM信号,实现D7指示灯呼吸灯的控
制。
main.c
#include "system.h"
#include "led.h"
#include "SysTick.h"
#include "pwm.h"
/* 通过TIM3的CH1输出一个PWM信号,控制D7指示
灯由暗变亮,再由亮变暗,类似于人的呼吸。程序框架如下:
(1)初始化PC6管脚为PWM输出功能
(2)PWM输出控制程序
*/
int main()
{
u16 i=0;
u8 fx=0;
SysTick_Init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组
LED_Init();
TIM3_CH1_PWM_Init(500,72-1);//PWM频率设为2KHZ
while(1)
{
if(fx==0)
{
i++;
if(i==300)
{
fx=1;
}
}
else
{
i--;
if(i==0)
{
fx=0;
}
}
TIM_SetCompare1(TIM3, i); //修改TIMx_CCRx的值控制占空比
delay_ms(100);
}
}
pwm.c
#include "pwm.h"
#include "led.h"
void TIM3_CH1_PWM_Init(u16 period,u16 prescaler)
{
GPIO_InitTypeDef GPIO_InitStructure; //为将PC6引脚初始化而声明的结构体变量
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定时器初始化的结构体变量声明
TIM_OCInitTypeDef TIM_OCInitStructure; //初始化PWM输出各参数的结构体变量声明
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能PC端口的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟以便进行端口映射
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6; //
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;// PC6为复用功能输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//将通用定时器3的通道1的输出从PA6引脚重映射到PC6引脚
TIM_TimeBaseInitStructure.TIM_Period=period; //装入函数传过来的自动装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=prescaler; //装入函数传过来的分频系数
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//1分频(没有分频)
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式:从0开始计数到自动重载值后溢出产生中断
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3各参数:自动重装值、分频系统、计数方式等
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OC1Init(TIM3,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能TIMx在CCRx上的预装载寄存器
TIM_ARRPreloadConfig(TIM3, ENABLE);//使能 TIMx 在 ARR 上的预装载寄存器允许位
TIM_Cmd(TIM3, ENABLE);//开启定时器
}
pwm.h
#ifndef _pwm_H
#define _pwm_H
#include "system.h"
void TIM3_CH1_PWM_Init(u16 period,u16 prescaler);
#endif
实际在开发板上测试,因为开发板上不是接的LED,而是接到一个数码管的一段,呼吸灯的效果不明显。
改为下述参数后,呼吸灯的效果就很明显了。