楼主: sunny@susu
43 0

基于STM32F407的PWM呼吸灯实验(寄存器实现) [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-8-22
最后登录
2018-8-22

楼主
sunny@susu 发表于 2025-11-24 12:17:23 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

二、寄存器说明

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);
	}
	
}
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:PWM STM 寄存器 include enable

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-5 17:36