pwm.h
#ifndef __PWM_H__
#define __PWM_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_tim.h"
//蜂鸣器 PB6---->TIM_CH1
void hal_pwm_beep_init();
#endif
pwm.c
#include "pwm.h"
//蜂鸣器 PB6---->TIM_CH1
void hal_pwm_beep_init()
{
//RCC章节初始化
//1.使能TIM组控制器
RCC->MP_APB1ENSETR |= (0x01 <<2);
//2.使能GPIOB组控制器
RCC->MP_AHB4ENSETR |= (0x01 << 1);
//GPIO章节初始化
//1.设置PB6引脚为复用功能模式
GPIOB->MODER |= (0x01 << 13);
GPIOB->MODER &= (~(0x01 << 12));
//2.设置PB6引脚复用功能为TIM_CH1模式
GPIOB->AFRL &= (~(0xF << 24));
GPIOB->AFRL |= (0x1 << 25);
//TIM章节的初始化 PWM频率方波为1000HZ
//系统提供的时钟源为209MHZ
//1.设置预分频器为209
TIM4->PSC =208;
//2.自动重载计数器为1000
TIM4->ARR = 1000;
//3.捕获比较寄存器为300
TIM4->CCR1 = 300;
//4.使能
//自动重载计数器有缓冲区
TIM4->CR1 |= (0x01 << 7);
//边沿对齐模式
TIM4->CR1 &= (~(0x3 << 5));
//计数器使能
TIM4->CR1 |= 0x1;
//输出/捕获1模式
TIM4->CCMR1 &= (~(0x7 << 4));
TIM4->CCMR1 |= (0x3 << 5);
TIM4->CCMR1 &= (~(0x1 << 16));
//输出比较预加载使能
TIM4->CCMR1 |= (0x1 << 3);
//配置通道一为输出模式
TIM4->CCMR1 &= (~(0x3));
//设置输出极性
TIM4->CCER |= (0x1 << 3);
//设置输出极性初始的高低电平
TIM4->CCER |= (0x1 << 1);
//使能输出极性
TIM4->CCER |= (0x1);
//5.设置递减
TIM4->CR1 |= (0x1 << 4);
}
main.c
#include "pwm.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
int i,j;
for(i = 0; i < ms;i++)
for (j = 0; j < 1800; j++);
}
int main()
{
hal_pwm_beep_init();
while(1)
{
}
return 0;
}
pwm蜂鸣器实验
最新推荐文章于 2024-09-01 21:17:35 发布