ARM开发,stm32mp157a-A7核PWM实验(驱动蜂鸣器,风扇,马达工作)

1.分析框图;

2.比较捕获寄存器(产生PWM方波);

工作原理:

1、系统提供一个时钟源209MHZ,需要通过分频器进行分频,设置分频器值为209分频;

2、当定时器启动之后,自动重载计数器中的值,会自动加载到递减计数器中;

3、时钟信号驱动递减计数器进行工作;

4、每来一个时钟周期,递减计数器中的值,进行减1操作;

5、当递减计数器中的值,和捕获比较寄存器中的值相等之后,电平发生翻转;

6、递减计数器中的值减到0之后;

7、自动重载计数器中的值,会再次自动加载到递减计数器中,开启下个时钟周期;

3.代码;

---pwm.h头文件---
复制代码
#ifndef __PWM_H__
#define __PWM_H__

#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_tim.h"

//PB6  TIM4_CH1  蜂鸣器初始化
void hal_beep_init();

//PF6  TIM16_CH1  马达初始化
void hal_monitor_init();

//PE9  TIM1_CH1  风扇初始化
void hal_fan_init();




#endif
---pwm.c函数实现---
复制代码
#include "pwm.h"

//PB6  TIM4_CH1 蜂鸣器
void hal_beep_init()
{
	//RCC章节初始化
	//1.使能GPIOB组控制器
	RCC->MP_AHB4ENSETR |= (0x1 << 1);

	//2.使能TIM4组控制器
	RCC->MP_APB1ENSETR |= (0x1 << 2);
	
	//GPIO章节初始化
	//1.PB6引脚复用功能 [13:12]=10
	GPIOB->MODER &= (~(0x3 << 12));
	GPIOB->MODER |= (0x2 << 12);

	//2.复用功能为TIM4_CH1功能 [27:14]=0010
	GPIOB->AFRL &= (~(0xF << 24));
	GPIOB->AFRL |= (0x2 << 24);

	//TIM4章节初始化
	//1.系统时钟源为209MHZ,进行分频209-1
	TIM4->PSC = 209 -1;
	
	//产生PWM方波频率1000HZ
	//2.自动重载计数器 1000
	TIM4->ARR = 1000;
	
	//3.捕获寄存器值
	TIM4->CCR1 = 300;	
	
	//4.CCER 设置比较寄存器默认输出极性
	TIM4->CCER &= (~(0x1 << 1));   //输出极性高电平
	TIM4->CCER &= (~(0x1 << 3));   
	TIM4->CCER |= (0x1 << 0);   //比较寄存器使能

	//5.CCMR1 配置比较捕获寄存器
	TIM4->CCMR1 &= (~(0x1 << 16));   //PWM模式
	TIM4->CCMR1 &= (~(0x7 << 4));   
	TIM4->CCMR1 |= (0x6 << 4);
	TIM4->CCMR1 |= (0x1 << 3);   //比较寄存器预加载使能
	TIM4->CCMR1 &= (~(0x3 << 0));   //通道1输出

	//6.CR1 初始化寄存器相关操作
	TIM4->CR1 |= (0x1 << 7);    //自动重载预加载使能
	TIM4->CR1 &= (~(0x3 << 5));   //设置边沿对齐模式
	TIM4->CR1 |= (0x1 << 4);   //设置递减计数方式
	TIM4->CR1 |= 0x1;   //设置计数器使能
	
}

//PF6  TIM16_CH1 马达
void hal_monitor_init()
{
	//RCC章节初始化
	//1.使能GPIOF组控制器
	RCC->MP_AHB4ENSETR |= (0x1 << 5);

	//2.使能TIM16组控制器
	RCC->MP_APB2ENSETR |= (0x1 << 3);
	
	//GPIO章节初始化
	//1.PF6引脚复用功能 [13:12]=10
	GPIOF->MODER &= (~(0x3 << 12));
	GPIOF->MODER |= (0x2 << 12);

	//2.复用功能为TIM16_CH1功能 [27:24]=0001
	GPIOF->AFRL &= (~(0xF << 24));
	GPIOF->AFRL |= (0x1 << 24);

	//TIM16章节初始化
	//1.系统时钟源为209MHZ,进行分频209-1
	TIM16->PSC = 209 -1;
	
	//产生PWM方波频率1000HZ
	//2.自动重载计数器 1000
	TIM16->ARR = 1000;
	
	//3.捕获寄存器值
	TIM16->CCR1 = 300;	
	
	//4.CCER 设置比较寄存器默认输出极性
	TIM16->CCER &= (~(0x1 << 1));   //输出极性高电平
	TIM16->CCER &= (~(0x1 << 3));   
	TIM16->CCER |= (0x1 << 0);   //比较寄存器使能

	TIM16->CR1 &= (~(0x3 << 5));   //设置边沿对齐模式
	TIM16->CR1 |= (0x1 << 4);   //设置递减计数方式

	//5.CCMR1 配置比较捕获寄存器
	TIM16->CCMR1 &= (~(0x1 << 16));   //PWM模式
	TIM16->CCMR1 &= (~(0x7 << 4));   
	TIM16->CCMR1 |= (0x6 << 4);
	TIM16->CCMR1 |= (0x1 << 3);   //比较寄存器预加载使能
	TIM16->CCMR1 &= (~(0x3 << 0));   //通道1输出

	//6.CR1 只有默认递增计数
	TIM16->CR1 |= (0x1 << 7);    //自动重载预加载使能
	TIM16->CR1 |= 0x1;   //设置计数器使能

	//7.设置TIM16_CH1 通道主输出使能
	TIM16->BDTR |= (0x1 << 15);

}

//PE9  TIM1_CH1 风扇
void hal_fan_init()
{
	//RCC章节初始化
	//1.使能GPIOE组控制器
	RCC->MP_AHB4ENSETR |= (0x1 << 4);

	//2.使能TIM4组控制器
	RCC->MP_APB2ENSETR |= (0x1 << 0);
	
	//GPIO章节初始化
	//1.PE9引脚复用功能 [19:18]=10
	GPIOE->MODER &= (~(0x3 << 18));
	GPIOE->MODER |= (0x2 << 18);

	//2.复用功能为TIM1_CH1功能 AFRH[7:4]=0001
	GPIOE->AFRH &= (~(0xF << 4));
	GPIOE->AFRH |= (0x1 << 4);

	//TIM1章节初始化
	//1.系统时钟源为209MHZ,进行分频209-1
	TIM1->PSC = 209 -1;
	
	//产生PWM方波频率1000HZ
	//2.自动重载计数器 1000
	TIM1->ARR = 500;
	
	//3.捕获寄存器值
	TIM1->CCR1 = 300;	
	
	//4.CCER 设置比较寄存器默认输出极性
	TIM1->CCER &= (~(0x1 << 1));   //输出极性高电平
	TIM1->CCER &= (~(0x1 << 3));   
	TIM1->CCER |= (0x1 << 0);   //比较寄存器使能

	//5.CCMR1 配置比较捕获寄存器
	TIM1->CCMR1 &= (~(0x1 << 16));   //PWM模式
	TIM1->CCMR1 &= (~(0x7 << 4));   
	TIM1->CCMR1 |= (0x6 << 4);
	TIM1->CCMR1 |= (0x1 << 3);   //比较寄存器预加载使能
	TIM1->CCMR1 &= (~(0x3 << 0));   //通道1输出

	//6.CR1 
	TIM1->CR1 |= (0x1 << 7);    //自动重载预加载使能
	TIM1->CR1 &= (~(0x3 << 5));   //设置边沿对齐模式
	TIM1->CR1 |= (0x1 << 4);   //设置递减计数方式
	TIM1->CR1 |= 0x1;   //设置计数器使能

	//7设置TIM1_CH1 通道主输出使能
	TIM1->BDTR |= (0x1 << 15);
}
---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()
{
	while(1)
	{
		hal_beep_init();
		hal_monitor_init();
		hal_fan_init();
	}

	return 0;

}
相关推荐
夜月yeyue3 小时前
Linux 邻接(Neighbor)子系统架构与 NUD 状态机
linux·运维·服务器·嵌入式硬件·算法·系统架构
灵魂尾巴.3 小时前
单片机数据存储器
单片机·嵌入式硬件
三佛科技-187366133973 小时前
LP3783A芯茂微5V2.1A低功耗原边反馈充电器芯片替代PL3378/C
c语言·开发语言
番茄灭世神3 小时前
空气质量检测仪项目笔记——硬件介绍
stm32·单片机·嵌入式·gd32·国产芯片
一叶落4384 小时前
LeetCode 11:盛最多水的容器(C语言实现)
c语言·数据结构·算法·leetcode
集芯微电科技有限公司4 小时前
适用于GaN PD快充65W/33W超高频驱动器
人工智能·单片机·嵌入式硬件·深度学习·神经网络·机器学习·生成对抗网络
GodKK老神灭4 小时前
Keil下载时的具体指令详解
单片机·嵌入式硬件
集芯微电科技有限公司4 小时前
PC5204集成700V/7.5A 400mΩ增强型氮化镓GaN HEMT驱动器具有高功率密度运行
数据结构·人工智能·单片机·嵌入式硬件·神经网络·机器学习·生成对抗网络
一叶落4384 小时前
36. 有效的数独(Valid Sudoku)题解(C语言)
c语言·数据结构·算法·leetcode·哈希算法
计算机安禾4 小时前
【C语言程序设计】第28篇:指针的概念与指针变量
c语言·开发语言·数据结构·c++·算法·visual studio code·visual studio