STM32 实现PWM 寄存器版
上一篇实现PWM 库函数版本 点我
这一篇实现寄存器版本使用通道1 CH1 控制PC6小灯
原理在库函数中做了相关介绍,这里就不过多说明,它的配置步骤是一样的
所以直接上码观看
代码如下
#include "pwm.h"
// pre 自动重转载值 psc预分频数
void TIM3_PWM_Init(u16 pre,u16 psc)
{
RCC->APB1ENR |= 1 << 1; //定时器3 时钟
RCC->APB2ENR |= 1 << 4; //GPIO C
RCC->APB2ENR |= 1 << 0; //AFIO使能
GPIOC->CRL &= 0xF0FFFFFF;
GPIOC->CRL |= 0x0B000000; //复用推挽 50Mhz
AFIO->MAPR &= 0xFFFFF3FF;
AFIO->MAPR |= 0x00000C00; ///定时器3 完全重映射 PC 6
TIM3->ARR = pre;
TIM3->PSC = psc;
//捕获/比较模式寄存器
TIM3->CCMR1 |= 7 << 4; //输出比较模式1
TIM3->CCMR1 |= 1 << 3; //输出比较1预装载使能
//捕获/比较 使能寄存器
TIM3->CCER |= 1 << 0; //OC1输出使能
//CR1 控制寄存器
TIM3->CR1 = 0x0080; //ARPE 重装载使能
TIM3->CR1 |= 1; //使能
}
头文件要加这句(控制关键)
//控制CCR1 来控制占空比
#define LED_PWM TIM3->CCR1
主函数如下
#include "stm32f10x.h"
#include "Usart.h"
#include "SysTick.h"
#include "Led.h"
#include "pwm.h"
void SystemInit()
{
}
int main()
{
// 10:20:20
u32 indata = 0,i = 1;
Stm32_Clock_Init(9);
Led_Init();
Delay_Init();
//Led_Init();
//PWM = (72000 ) / psc*(pre + 1) = 30KHz
TIM3_PWM_Init(899,0);
while(1)
{
Delay_ms(10);
if(i == 1)
{
indata++;
}
else
{
indata--;
}
if(indata == 300)
{
i = 0;
}
if(indata == 0)
{
i = 1;
}
LED_PWM = indata;
}
}