作业:
蜂鸣器/马达/风扇三个硬件工作,上传CSDN
一、代码
1.1 pwm.c
#include "pwm.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_tim.h"
void pwm_fengming_init()
{
//使能GPIOB组时钟
RCC->MP_AHB4ENSETR |=(0x1 << 1);
//使能TIM4定时器时钟
RCC->MP_APB1ENSETR |=(0x1 << 2);
//设置PB6引脚为复用功能
GPIOB->MODER &=(~(0x3 << 12));
GPIOB->MODER |=(0x1 << 13);
//设置PB6引脚为复用功能模式TIM4_CH1
GPIOB->AFRL &=(~(0xF << 24));
GPIOB->AFRL |=(0x1 << 25 );
//设置TIM4寄存器
//设置分频器 209HZ
TIM4->PSC &=(~(0xffff << 0));
TIM4->PSC |=(0xd0 << 0);
//设置PWM方波最终周期为1000HZ 对自动重载计数器进行赋值1000
TIM4->ARR &=(~(0xffff << 0));
TIM4->ARR |=(0x3e8 << 0);
//设置PWM占空比 对比较/捕获器进行赋值 300
TIM4->CCR1 &=(0xffff << 0);
TIM4->CCR1 |=(0x2bc << 0);
//设置TIM4_CH1为PWM1模式
//设置TIM4_CH1为预加载使能
//设置TIM4_CH1为输出模式
TIM4->CCMR1 &=(~(0x1 << 16));
TIM4->CCMR1 &=(~(0x7 << 4));
TIM4->CCMR1 |=(0x3 << 5);
TIM4->CCMR1 |=(0x1 << 3);
TIM4->CCMR1 &=(~(0x3 << 0));
//设置TIM4_ CH1通过输出模式极性高电平
//设置TIM4__CH1通道比较捕获寄存器输出使能
//设置TIM4_CH1通道自动重载计数器预加载使能
TIM4->CCER |=(0x1 << 3);
TIM4->CCER &=(~(0x3 << 0));
TIM4->CCER |=(0x1 << 0);
//设置TIM4__CH1通道采用边沿对齐方式
//设置TIM4_ CH1通道采用递减计数方式
//设置TIM4CH1通道计数器使能
TIM4->CR1 |=(0x1 << 7);
TIM4->CR1 &=(~(0x3 << 5));
TIM4->CR1 |=(0x1 << 4);
TIM4->CR1 |=(0x1 << 0);
}
void pwm_mada_init()
{
//使能GPIOF组时钟
RCC->MP_AHB4ENSETR |=(0x1 << 5);
//使能TIM4定时器时钟
RCC->MP_APB2ENSETR |=(0x1 << 3);
//设置PF6引脚为复用功能
GPIOF->MODER &=(~(0x3 << 12));
GPIOF->MODER |=(0x1 << 13);
//设置PB6引脚为复用功能模式TIM16_CH1
GPIOF->AFRL &=(~(0xF << 24));
GPIOF->AFRL |=(0x1 << 24);
//设置TIM16寄存器
//设置分频器 209HZ
TIM16->PSC &=(~(0xffff << 0));
TIM16->PSC |=(0xd0 << 0);
//设置PWM方波最终周期为1000HZ 对自动重载计数器进行赋值1000
TIM16->ARR &=(~(0xffff << 0));
TIM16->ARR |=(0x3e8 << 0);
//设置PWM占空比 对比较/捕获器进行赋值 300
TIM16->CCR1 &=(0xffff << 0);
TIM16->CCR1 |=(0x2bc << 0);
//设置TIM16_CH1为PWM1模式
//设置TIM16_CH1为预加载使能
//设置TIM16_CH1为输出模式
TIM16->CCMR1 &=(~(0x1 << 16));
TIM16->CCMR1 &=(~(0x7 << 4));
TIM16->CCMR1 |=(0x3 << 5);
TIM16->CCMR1 |=(0x1 << 3);
TIM16->CCMR1 &=(~(0x3 << 0));
//设置TIM16_CH1通过输出模式极性高电平
//设置TIM16_CH1通道比较捕获寄存器输出使能
//设置TIM16_CH1通道自动重载计数器预加载使能
TIM16->CCER |=(0x1 << 3);
TIM16->CCER &=(~(0x3 << 0));
TIM16->CCER |=(0x1 << 0);
//设置TIM16_CH1通道采用边沿对齐方式
//设置TIM16_CH1通道采用递减计数方式
//设置TIM16_CH1通道计数器使能
TIM16->CR1 |=(0x1 << 7);
TIM16->CR1 &=(~(0x3 << 5));
TIM16->CR1 |=(0x1 << 4);
TIM16->CR1 |=(0x1 << 0);
//马达专属
TIM16->BDTR |=(0x1 << 15);
}
void pwm_fengshan_init()
{
//使能GPIOB组时钟
RCC->MP_AHB4ENSETR |=(0x1 << 4);
//使能TIM4定时器时钟
RCC->MP_APB2ENSETR |=(0x1 << 0);
//设置PF9引脚为复用功能
GPIOE->MODER &=(~(0x3 << 18));
GPIOE->MODER |=(0x1 << 19);
//设置PF9引脚为复用功能模式TIM1_CH1
GPIOE->AFRH &=(~(0xF << 4));
GPIOE->AFRH |=(0x1 << 4);
//设置TIM4寄存器
//设置分频器 209HZ
TIM1->PSC &=(~(0xffff << 0));
TIM1->PSC |=(0xd0 << 0);
//设置PWM方波最终周期为1000HZ 对自动重载计数器进行赋值1000
TIM1->ARR &=(~(0xffff << 0));
TIM1->ARR |=(0x3e8 << 0);
//设置PWM占空比 对比较/捕获器进行赋值 300
TIM1->CCR1 &=(0xffff << 0);
TIM1->CCR1 |=(0x2bc << 0);
//设置TIM1_CH1为PWM1模式
//设置TIM1_CH1为预加载使能
//设置TIM1_CH1为输出模式
TIM1->CCMR1 &=(~(0x1 << 16));
TIM1->CCMR1 &=(~(0x7 << 4));
TIM1->CCMR1 |=(0x3 << 5);
TIM1->CCMR1 |=(0x1 << 3);
TIM1->CCMR1 &=(~(0x3 << 0));
//设置TIM1_ CH1通过输出模式极性高电平
//设置TIM1__CH1通道比较捕获寄存器输出使能
//设置TIM1_CH1通道自动重载计数器预加载使能
TIM1->CCER |=(0x1 << 3);
TIM1->CCER &=(~(0x3 << 0));
TIM1->CCER |=(0x1 << 0);
//设置TIM1__CH1通道采用边沿对齐方式
//设置TIM1_ CH1通道采用递减计数方式
//设置TIM1CH1通道计数器使能
TIM1->CR1 |=(0x1 << 7);
TIM1->CR1 &=(~(0x3 << 5));
TIM1->CR1 |=(0x1 << 4);
TIM1->CR1 |=(0x1 << 0);
//风扇专属
TIM1->BDTR |=(0x1 << 15);
}
1.2 pwm.h
#ifndef __PWM_H__
#define __PWM_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_tim.h"
void pwm_fengming_init();
void pwm_mada_init();
void pwm_fengshan_init();
#endif
1.3 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(void)
{
pwm_mada_init();
pwm_fengshan_init();
pwm_fengming_init();
while(1)
{
}
return 0;
}