基于STM32MP157A的蜂鸣器,马达,震动马达PWM实验
PWM概念
1.PWM:脉冲宽度调制定时器
2.脉冲:方波信号,高低电平的变化产生方波信号
3.周期:高低电平变化所需要的时间,单位:ms
4.频率:周期和频率之间是倒数关系,1S钟可以产生的多少个方波信号,单位:HZ
5.占空比:高电平占整个周期的百分比
6.本次实验中:PWM/风扇/马达
代码实现
pwm.h
#ifndef __LED_H__
#define __LED_H__
#include "stm32mp1xx_tim.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
//pwm初始化
void pwm4_init(void);
//PWM初始化
void pwm1_init(void);
//PWM6初始化
void pwm16_init(void);
#endif
pwm.c
#include "pwm.h"
//pwm初始化
void pwm4_init(void)
{
/******RCC章节初始化****/
//1.使能GPIO控制器
RCC->MP_AHB4ENSETR |= (0x1<<1);
//使能TIM4定时器TR
RCC->MP_APB1ENSETR |= (0x1<<2);
/******GPIO章节初始化****/
//1.设置PB6引脚为复用功能模式
GPIOB->MODER &= (~(0x3<<12));
GPIOB->MODER |= (0x1<<13);
//2.设置pB6引脚的服用功能为TIME_CH1
GPIOB->AFRL &= (~(0xf<<24));
GPIOB->AFRL |= (0x1<<25);
/******TIM4章节初始化****/
//1.系统提供的时钟源为209MHZ,设置分频器的值为209-1
TIM4->PSC &= (~(0xffff));
//
TIM4->PSC |= (0xD<<4);
//2.产生一个方波,方波频率1000HZ,设置自动重载计数器值1000
TIM4->ARR &= (~(0xffff));
TIM4->ARR |= 0x3E8;
//3.设置方波占空比,设置比较捕获寄存器的值300
TIM4->CCR1 &= (~(0xffff));
TIM4->CCR1 |= 0x12C;
//4.设置TIM4_CH1通道为PWM模式
TIM4->CCMR1 &= (~(0x1<<16));
TIM4->CCMR1 &= (~(0x7<<4));
TIM4->CCMR1 |= (0x3<<5);
//5.设置TIME4_CH1通道捕获比较预加载使能
TIM4->CCMR1 |= (0x1<<3);
//6.设置TIME4_CH1通道为输出模式
TIM4->CCMR1 &= (~(0x3));
//7.设置TIM4_CH1通道为输出模式
TIM4->CCER &= (~(0x1<<3));
TIM4->CCER |= (0x1<<3);
//8.设置TIME_CH1通道输出极性起始状态为高电平
TIM4->CCER &= (~(0x1<<1));
//9.设置TIME_CH1比较捕获输出使能
TIM4->CCER |= 0x1;
//10.设置TIM4_CH1通道自动重载预加载使能
TIM4->CR1|= (0x1<<7);
//11.设置TIM4_CH1通道计数器采用沿边对齐方式
TIM4->CR1 &= (~(0x3<<5));
//TIM4->CR1 |= (0x1<<4);
//12.设置TIM4_CH1通道采用递减方式进行计数
TIM4->CR1 &= (~(0x1<<4));
TIM4->CR1 |= (0x1<<4);
//13.设置TIM4_CH1通道计数器使能
TIM4->CR1 |= (0x1);
}
//pwm1初始化
void pwm1_init(void)
{
/******RCC章节初始化****/
//1.使能GPIO控制器
RCC->MP_AHB4ENSETR |= (0x1<<4);
//使能TIM1定时器
RCC->MP_APB2ENSETR |= (0x1);
/******GPIO章节初始化****/
//1.设置PE9引脚为复用功能模式
GPIOE->MODER &= (~(0x3<<18));
GPIOE->MODER |= (0x1<<19);
//2.设置PE9引脚的服用功能为TIME_CH1
GPIOE->AFRH &= (~(0xf<<4));
GPIOE->AFRH |= (0x1<<4);
/******TIM1章节初始化****/
//1.系统提供的时钟源为209MHZ,设置分频器的值为209-1
TIM1->PSC &= (~(0xffff));
//
TIM1->PSC |= (0xD<<4);
//2.产生一个方波,方波频率1000HZ,设置自动重载计数器值1000
TIM1->ARR &= (~(0xffff));
TIM1->ARR |= 0x3E8;
//3.设置方波占空比,设置比较捕获寄存器的值300
TIM1->CCR1 &= (~(0xffff));
TIM1->CCR1 |= 0x2BC;
//4.设置TIM1_CH1通道为PWM模式
TIM1->CCMR1 &= (~(0x1<<16));
TIM1->CCMR1 &= (~(0x7<<4));
TIM1->CCMR1 |= (0x3<<5);
//5.设置TIM1_CH1通道捕获比较预加载使能
TIM1->CCMR1 |= (0x1<<3);
//6.设置TIM1_CH1通道为输出模式
TIM1->CCMR1 &= (~(0x3));
//7.设置TIM1_CH1通道为输出模式
TIM1->CCER &= (~(0x1<<3));
//TIM4->CCER |= (0x1<<3);
//8.设置TIME_CH1通道输出极性起始状态为高电平
TIM1->CCER &= (~(0x1<<1));
//9.设置TIM1_CH1比较捕获输出使能
TIM1->CCER |= 0x1;
//10.设置TIM1_CH1通道自动重载预加载使能
TIM1->CR1|= (0x1<<7);
//11.设置TIM1_CH1通道计数器采用沿边对齐方式
TIM1->CR1 &= (~(0x3<<5));
//TIM1->CR1 |= (0x1<<4);
//12.设置TIM1_CH1通道采用递减方式进行计数
TIM1->CR1 &= (~(0x1<<4));
TIM1->CR1 |= (0x1<<4);
//13.设置TIM1_CH1通道计数器使能
TIM1->CR1 |= (0x1);
//设置主输出使能
TIM1->BDTR |= (0x1<<15);
}
//pwm16初始化
void pwm16_init(void)
{
/******RCC章节初始化****/
//1.使能GPIO控制器
RCC->MP_AHB4ENSETR |= (0x1<<5);
//使能TIM16定时器
RCC->MP_APB2ENSETR |= (0x1<<3);
/******GPIO章节初始化****/
//1.设置PF6引脚为复用功能模式
GPIOF->MODER &= (~(0x3<<12));
GPIOF->MODER |= (0x1<<13);
//2.设置PF6引脚的服用功能为TIME_CH1
GPIOF->AFRL &= (~(0xf<<24));
GPIOF->AFRL |= (0x1<<24);
/******TIM16章节初始化****/
//1.系统提供的时钟源为209MHZ,设置分频器的值为209-1
TIM16->PSC &= (~(0xffff));
//
TIM16->PSC |= (0xD<<4);
//2.产生一个方波,方波频率1000HZ,设置自动重载计数器值1000
TIM16->ARR &= (~(0xffff));
TIM16->ARR |= 0x3E8;
//3.设置方波占空比,设置比较捕获寄存器的值300
TIM16->CCR1 &= (~(0xffff));
TIM1->CCR1 |= 0x2BC;
//4.设置TIM16_CH1通道为PWM模式
TIM16->CCMR1 &= (~(0x1<<16));
TIM16->CCMR1 &= (~(0x7<<4));
TIM16->CCMR1 |= (0x3<<5);
//5.设置TIM16_CH1通道捕获比较预加载使能
TIM16->CCMR1 |= (0x1<<3);
//6.设置TIM16_CH1通道为输出模式
TIM16->CCMR1 &= (~(0x3));
//7.设置TIM16_CH1通道为输出模式
TIM16->CCER &= (~(0x1<<3));
//TIM4->CCER |= (0x1<<3);
//8.设置TIM16_CH1通道输出极性起始状态为高电平
TIM16->CCER &= (~(0x1<<1));
//9.设置TIM16_CH1比较捕获输出使能
TIM16->CCER |= 0x1;
//10.设置TIM16_CH1通道自动重载预加载使能
TIM16->CR1|= (0x1<<7);
//11.设置TIM16_CH1通道计数器采用沿边对齐方式
// TIM16->CR1 &= (~(0x3<<5));
//TIM1->CR1 |= (0x1<<4);
//12.设置TIM16_CH1通道采用递减方式进行计数
// TIM16->CR1 &= (~(0x1<<4));
// TIM16->CR1 |= (0x1<<4);
//13.设置TIM_CH1通道计数器使能
TIM16->CR1 |= (0x1);
TIM16->BDTR |= (0x1<<15);
}
main.c`
在这里插#include "pwm.h"
#include "../common/include/stm32mp1xx_tim.h"
#include "../common/include/stm32mp1xx_rcc.h"
#include "../common/include/stm32mp1xx_gpio.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()
{
pwm4_init();
pwm1_init();
pwm16_init();
return 0;
}