二、寄存器说明
1、TIMx_CCMR1 寄存器
2、TIMx_CCER 寄存器
3、PSC 与 ARR 相关设置
寄存器映射情况如下:
一、代码实现部分
1、main.c 源文件内容
#include "stm32f4xx.h" // Device header
#include "Led.h"
#include "Key.h"
#include "usart.h"
#include <string.h>
#include "Delay.h"
#include "Timer.h"
#include "Pwm.h"
uint8_t buffer[100];
uint8_t size = 0;
uint8_t Over_Flag = 0; //串口接收完成标志
uint8_t Pwm_Dir = 0; //Pwm方向。0表示增长,1表示减少
uint8_t Duty = 0;
int main(void)
{
// Led_Init(); //使用PWM的时候要注释这行代码不然PF9会冲突
Key_Init();
Usart_Init();
Pwm_Init();
Pwm_Start();
while(1)
{
if (Pwm_Dir == 0)
{
Duty += 1;
if (Duty >= 99)
{
Pwm_Dir = 1;
}
}
else
{
Duty -= 1;
if (Duty <= 0)
{
Pwm_Dir = 0;
}
}
Tim14_SetDuty(Duty);
Delay_ms(20);
}
}
2、PWM.c 实现代码
#include "Pwm.h"
void Pwm_Init(void)
{
RCC->APB1ENR |= RCC_APB1ENR_TIM14EN; //开启定时器14时钟
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOFEN; //开启GPIOF时钟
//配置PF9为复用推挽输出
GPIOF->MODER |= GPIO_MODER_MODER9_1; //配置为复用功能
GPIOF->OTYPER |= (0x00 << 18); //配置为推挽输出
GPIOF->AFR[1] |= (0x09 << 4); //配置PF9的复用引脚(AF9)
//定时器配置
TIM14->PSC = 8400-1; //配置预分频值
TIM14->ARR = 100-1; //配置自动重装载值
TIM14->CR1 &= ~TIM_CR1_DIR; //配置为向上自增模式
TIM14->CCR1 = 0; //设置通道1的初始CCR值
TIM14->CCMR1 &= ~TIM_CCMR1_CC1S; //配置通道1为输出模式
//配置通道1为PWM模式1(O1CM为:110)
TIM14->CCMR1 |= TIM_CCMR1_OC1M_2;
TIM14->CCMR1 |= TIM_CCMR1_OC1M_1;
TIM14->CCMR1 &= ~TIM_CCMR1_OC1M_0;
TIM14->CCER |= TIM_CCER_CC1E; //使能输出通道
}
void Pwm_Start(void)
{
TIM14->CR1 |= TIM_CR1_CEN;
}
void Pwm_Stop(void)
{
TIM14->CR1 &= ~TIM_CR1_CEN;
}
void Tim14_SetDuty(uint8_t Duty)
{
TIM14->CCR1 = Duty;
}
3、Delay.c 延时函数实现
#include "Delay.h"
void Delay_us(uint16_t us)
{
SysTick -> LOAD = 168 * us;
// SysTick -> CTRL = 0x05;//配置:采用系统时钟(1),计数结束不产生中断(0),使能定时器(1)
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk; //采用系统时钟(168Mhz)
SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; //计时结束不产生中断
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能滴答定时器
while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk))//等待计数完成(归零)
{
}
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk; //关闭定时器
}
void Delay_ms(uint16_t ms)
{
while (ms--)
{
Delay_us(1000);
}
}

雷达卡


京公网安备 11010802022788号







