STM32F401呼吸灯实验

实验介绍

硬件资源

STM32F401re开发板,面包板,一个LED,飞线若干

实验原理

PWM

通过改变PWM的占空比实现LED的亮度变化

        PWM频率:Freq = CK_PSC (72M)/ (PSC+1)/(ARR+1)      ARR为重装值

        PWM占空比: Duty = CCR/(ARR +1)

        PWM分辨率: Reso = 1/(ARR +1)

引脚复用

对于普通输出,引脚控制权来自输出数据寄存器,
要用定时器控制,就要复用推挽输出,输出控制权转移给片上外设,即TIM2_CH

由引脚复用表,用TIM2——CH1时要选择PA0作为PWM的输出接口

实验实物图:

其中,PA00接到面包板上接LED正极(长)脚,负极脚接GND回到板子的GND

代码部分

PWM.c

我们把频率设置为1000Hz,由公式Freq = CK_PSC (72M)/ (PSC+1)/(ARR+1)=1000,所以设置ARR=100-1,PSC=720-1.

#include "stm32f4xx.h"                  // Device header

void PWM_Init(){
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
	//对于普通输出,引脚控制权来自输出数据寄存器,
	//要用定时器控制,就要复用推挽输出,输出控制权转移给片上外设,即TIM2_CH
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM2);//复用函数
	
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽输出
	GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	
	TIM_InternalClockConfig(TIM2);//选择内部时钟
	//初始化时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period = 100-1;	//ARR周期,自动重装值
	TIM_TimeBaseInitStruct.TIM_Prescaler = 720-1; //PSC预分频值
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;//重复计数器
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);//初始化时基单元
	
	TIM_OCInitTypeDef TIM_OCInitStruct;
	//给结构体各成员赋初始值,使其可以通用高级定时器	
	//TIM_OCStructInit(&TIM_OCInitStruct);
	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //设置输出比较模式为PWM1模式
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//设置输出比较极性
	TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//设置输出比较使能
	TIM_OCInitStruct.TIM_Pulse = 0;//设置CCR的值由函数封装
	TIM_OC1Init(TIM2,&TIM_OCInitStruct); //通道初始化
	
	TIM_Cmd(TIM2,ENABLE);//开启定时器
		
}

void PWM_SetCompare1(uint32_t ccr){
	TIM_SetCompare1(TIM2,ccr);//设置通道1的CCR值,来改变占空比
}

PWM.h

#ifndef PWM_H
#define PWM_H

void PWM_Init(void);//PWM初始化
void PWM_SetCompare1(uint32_t ccr);//设置CCR的值
	
#endif

main.c函数部分

#include "stm32f4xx.h"                  // Device header
#include "Delay.h"
#include "PWM.h"

uint8_t i;
int main(void){
	PWM_Init();
	while(1){
		
		for(i=0;i<=100;i++){
			PWM_SetCompare1(i);//设置CCR的值
			Delay_ms(10);
		}
		for(i=0;i<=100;i++){
			PWM_SetCompare1(100-i);
			Delay_ms(10);
		}
	}
}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值