本次是基于STM32F103VET6野火指南者,选用的是外设是TIM3和PB0绿灯,因为根据引脚定义表查得PB0对应的是TIM3_CH3,也就是通道3的TIM3,PB0的通道3
/*
* PWM初始化
* 第一步:RCC开启时钟,把要用的TIM外设和GPIO外设的时钟打开* 第二步:配置时基单元,包括时钟源选择和PSC预分频器,CNT计数器,ARR自动重装器
* 第三步:配置输出比较单元,包括:CCR的值,输出比较模式,极性选择,输出使能
*第四步:配置GPIO,把PWM对应的GPIO口,初始化为复用推免输出的配置
*第五步:运行控制,启动计数器,这样就能输出PWM
*/
PWM.c
#include "PWM.h" // Device header
void PWM_Init(void)
{
/*
* PWM初始化
* 第一步:RCC开启时钟,把要用的TIM外设和GPIO外设的时钟打开
* 第二步:配置时基单元,包括时钟源选择和PSC预分频器,CNT计数器,ARR自动重装器
* 第三步:配置输出比较单元,包括:CCR的值,输出比较模式,极性选择,输出使能
* 第四步:配置GPIO,把PWM对应的GPIO口,初始化为复用推免输出的配置
* 第五步:运行控制,启动计数器,这样就能输出PWM
*/
//第一步:RCC开启时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//第四步
/*第一步:使用RCC开启GPIO时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
/*第二步:使用GPIO_Init函数初始化GPIO*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
//一开始全是关闭状态
//GPIO_SetBits(GPIOB,GPIO_Pin_5 | GPIO_Pin_1);
//第二步:选择时基单元的时钟源,内部时钟
TIM_InternalClockConfig(TIM3);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器模式--向上计数
TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;//APR自动重装器
TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;//PSC预分频器
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器的值
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
//第三步:配置输出比较单元,包括:CCR的值,输出比较模式,极性选择,输出使能
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//输出比较模式
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出比较极性
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出比较使能
TIM_OCInitStructure.TIM_Pulse = 0;//CCR 实现呼吸灯,就是要不断更改CCR值
//要使用的是PB0端口,所以选TIM3的OC3也就是TIM3_CH3
TIM_OC3Init(TIM3,&TIM_OCInitStructure);
//第六步:启动定时器
TIM_Cmd(TIM3,ENABLE);
}
/*
* TIM_SetCompare3这个函数是用来单独更改通道3的CCR的值,通过引脚定义表查看得到
* 用下面函数封装一下
*/
void PWM_SetCompare3(uint16_t Compare)
{
TIM_SetCompare3(TIM3,Compare);
}
PWM.h
#ifndef __PWM_H
#define __PWM_H
#include "stm32f10x.h" // Device header
void PWM_Init(void);
void PWM_SetCompare3(uint16_t Compare);
#endif
main.c
#include "stm32f10x.h" // Device header
#include "LED.h"
#include "OLED.h"
#include "PWM.h"
#include "./delay.h"
uint8_t i;
int main(void){
OLED_Init();
PWM_Init();
delay_init();
while(1)
{
/*只需要在主循环里,不断调用PWM_SetCompare3这个函数,
*更改CCR的值,就可以完成LED呼吸灯的效果
*/
for(i=0;i<=100;i++)
{
PWM_SetCompare3(i);
delay_ms(10);
}
for(i=0;i<=100;i++)
{
PWM_SetCompare3(100-i);
delay_ms(10);
}
}
}