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

news2024/11/20 0:45:28

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;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/927710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pygame编程(3)draw模块

draw模块 函数实例 函数 pygame.draw.rect 画一个矩形rect(surface, color, rect) -> Rectrect(surface, color, rect, width0, border_radius0, border_top_left_radius-1,border_top_right_radius-1, border_bottom_left_radius-1, border_bottom_right_radius-1) -> …

非常简单!用Java实现一个简单的向量数据库雏形。

概述 向量数据库是用来解决高维向量数据管理和查询的问题。它能够有效地存储、索引和查询大规模高维度向量数据&#xff0c;并提供高性能和高效的相似度搜索。传统的关系型数据库或文档数据库在处理高维向量数据时可能会遇到诸多问题。比如在高维空间中&#xff0c;数据点之间…

网红景区游乐设备普乐蛙5d动感影院体验馆设备组成内容

一个5D7D动感影院体验馆的全套设备组成通常包括以下几个方面&#xff1a; 电影播放设备&#xff1a;包括主控制器、电影播放器、电影储存设备等&#xff0c;用于播放5D电影。 影院座椅&#xff1a;一般采用特殊设计的动感座椅&#xff0c;具备震动、摇晃、抖动等功能&#xff0…

Mainline Linux 和 U-Boot编译

By Toradex胡珊逢 Toradex 自从 Linux BSP v6 开始在使用 32位处理器的 Arm 模块如 iMX6、iMX6ULL、iMX7 上提供 mainline/upstream kernel &#xff0c;部分 64位处理器模块如 Verdin iMX8M Mini/Plus 也提供实验性支持。文章将以季度发布版本 Linux BSP V6.3.0 为例介绍如何下…

为什么选择新风机?

现如今&#xff0c;新风机已经是很多场地的熟客了&#xff0c;那大家可能疑惑为什么选择新风机呢&#xff1f;那就让我揭晓答案吧&#xff01;新风机有很多益处&#xff0c;让我大致简述一下吧。 改善室内空气质量&#xff1a;新风机能够引入新鲜的外界空气&#xff0c;并排除室…

lab7 thread

文章目录 Uthread: switching between threadstaskhints思路上下文的恢复和保存thread_createthread_schedule Using threads思路 Barrier Uthread: switching between threads 在这个练习中&#xff0c;你将为一个用户级别线程系统设计上下文切换机制&#xff0c;并实现它。 …

算法leetcode|73. 矩阵置零(rust重拳出击)

文章目录 73. 矩阵置零&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a;进阶&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 73. 矩阵置零&#xff1a; 给定一个 m x n 的矩…

邮件营销:高效的节日宣传方式

每个国家都有当地的传统节日&#xff0c;像是我国刚过去的端午节&#xff0c;即将迎来的中秋节、国庆节。我们除了会进行一些传统习俗外&#xff0c;各路商家还会趁这个机会开启促销活动。 对于公司来讲&#xff0c;抓住每一次营销活动都可能会带来更高的营销额&#xff0c;或…

ATA-7000系列高压放大器——应用场景介绍

ATA-7000系列是一款理想的可放大交、直流信号的高压放大器。单端输出20kVp-p&#xff08;10kVp&#xff09;高压&#xff0c;可以驱动高压型负载。电压增益数控可调&#xff0c;一键保存常用设置&#xff0c;为您提供了方便简洁的操作选择。 图&#xff1a;ATA-7000系列高压放大…

2021年长安杯电子数据取证比赛

VC挂载 一&二检材 长安杯-1 检材一 请计算检材一Apk的SHA256值 3fece1e93be4f422c8446b77b6863eb6a39f19d8fa71ff0250aac10f8bdde73a 长安杯-2 该APK的应用包名为 plus.H5B8E45D3 长安杯-3 APPID 该APK程序在封装服务商的应用唯一标识&#xff08;APPID&#xff09;为…

设计模式之抽象工厂

文章目录 一、介绍二、基本组件三、演示案例1. 定义抽象工厂2. 定义抽象产品3. 定义具体工厂4. 定义具体产品5. 代码演示6. 代码改造 四、总结 一、介绍 抽象工厂模式(Abstract Factory Pattern)属于创建型设计模式。用于解决比工厂方法设计模式更加复杂的问题。 复杂到哪里了…

U盘怎么加密?U盘加密方法有哪些?

U盘是我们生活和工作中最常用的移动储存设备&#xff0c;经常被用来存放各种重要数据&#xff0c;为了保证数据的安全&#xff0c;我们需要加密U盘。那么&#xff0c;U盘加密方法有哪些呢&#xff1f; U盘加密普通方法 如果你的U盘储存数据不多&#xff0c;并且对于加密的要求…

Orchestrator介绍三 命令行工具

Orchestrator-client orchestrator 支持两种方式通过命令行操作&#xff1a; 一种是 通过命令 orchestrator&#xff1a; 需要在服务器上安装 orchestrator&#xff0c;但是可以不作为服务启动。 需要配置orchestrator的文件&#xff0c;以便能够连接后端数据库 一种是通过…

Docker部署gogs仓库

Docker部署gogs Git仓库 拉取镜像 docker pull gogs/gogs查看本地镜像 docker images启动gogs仓库服务 创建数据挂在目录 我在/root目录下创建gogs挂在目录 mkdir gogs启动gogs docker run --namegogs -d -p 10022:22 -p 10880:3000 -v /root/gogs:/data gogs/gogs10022…

知识图谱Neo4j安装到实践全过程

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 在本次实战中&#xff0c;我们将一起完成知识图谱Neo4j安装到实践全过程&#xff0c;探索其中的关系和属性。知识图谱是一种以三元组形式存储的数据结构&#xff0c;由实体、关系和属性组成&#xff0c;能够帮助我们更好地…

西部AI小镇-构建自主虚拟世界

背景 未来曜文有接入市场上所有面向chatGPT开发的应用&#xff0c;例如开源聊天组件&#xff0c;西部小镇等 内容介绍 生成代理起床&#xff0c;做早餐&#xff0c;然后去上班&#xff1b;艺术家作画&#xff0c;作家写作&#xff1b;他们形成意见、互相关注并发起对话&…

window如何实时刷新日志文件

1 安装windows git 下载地址&#xff1a;Git - Downloading Package (git-scm.com) 2 打开git bash 输入tail.exe -f 日志文件路径

yo!这里是Linux权限入门理解

目录 前言 权限概念 权限管理 分类 1.用户 2.文件&&目录 表示 设置 1.chmod指令 2.chown指令 3.chgrp指令 4.umask指令 粘滞位 后记 前言 对于Linux基本指令&#xff0c;基本上就是操作文件或者目录&#xff0c;但是&#xff0c;是谁可以操作文件或目录&…

8个月打磨,打造出的全能工具箱,让你事半功倍!

这款工具叫即时工具&#xff0c;目前有网页端和客户端可以下载至本地离线使用&#xff0c;区别在于客户端采用原生适配性能更好&#xff0c;网页端需要上传至服务器或浏览器内部处理。 体验地址&#xff1a;点击直达 一、为什么会开发这个工具 综合性和多功能性&#xff1a;…

MySQL数据库 索引、事务、储存引擎

索引 索引的概念 索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址&#xff08;类似于C语言的链表通过指针指向数据记录的内存地址&#xff09;。 使用索引后可以不用扫描全表来定位某行的数据&#xff0c;而是先通过索引表找…