1.12 PWM实验

news2025/1/18 11:40:59

蜂鸣器--------TIM4 CH1/PB6

风扇-----------TIM1 CH1/PE9

马达-----------TIM16 CH1/PF6

一.PWM框图

 RCC:使能GPIOB

GPIOB:设置复用功能

TIM4:产生方波

二.分析RCC

        确定总线,使能GPIOB和TIM4,GPIOE和TIM1,GPIO和TIM16

三.分析GPIO章节

        设置GPIOB IO模式为复用模式,并设置复用功能为TIM4(蜂鸣器)

        设置GPIOE IO模式为复用模式,并设置复用功能为TIM1(风扇)

        设置GPIOF IO模式为复用模式,并设置复用功能为TIM16(马达)

四.产生方波

1.计数方式

        (1)递增计数 (边缘对齐)

        (2)递减计数 (边缘对齐)

        (3)递增递减计数 (中心对齐)

        

  1. 设置自动重载寄存器中的值,并将这个值写到计时器中
  2. 在计时器时钟的驱动下,计时器开始工作
  3. 在一个时钟周期到来时,计时器中的数据进行+1/-1
  4. 当计时器中的值加减到等于捕获比较寄存器中的值时,电平反转,产生方波
  5. 当计时器中的值减到0或加到自动重载寄存器中的值时,自动重载计时器会将值再重载到计时器中或计时器从0开始加,开始下一个时钟周期

        TIM4:

        设置分频寄存器中的值

        设置自动重载寄存器中的值

        设置捕获比较寄存器中的值

        设置输出比较模式为PWM模式

        设置输出比较预加载使能

        设置TIM_CH1为输出模式

        设置输出极性为低电平

        设置捕获比较寄存器使能

        设置自动重载预加载使能

        设置计时器为递减计时器

        设置计时器为边缘对其方式

        设置计时器使能

五.代码

 

#include "../include/spi.h"
#include "../common/include/stm32mp1xx_tim.h"
#include "../include/bbep.h"


void init_beep(){
	//初始化RCC
	RCC->MP_AHB4ENSETR|=0x1<<1;
	RCC->MP_APB1ENSETR|=0x1<<2;
	
	//初始化GPIO

	GPIOB->MODER&=(~(0x3<<12));
	GPIOB->MODER|=(0x2<<12);

	GPIOB->AFRL&=(~(0xf<<24));
	GPIOB->AFRL|=(0x2<<24);

	//初始化TIM4
	TIM4->PSC&=(~0xff);     //分频器初始化
	TIM4->PSC|=0xd0;
	
	//自动重载寄存器
	TIM4->ARR&=(~(0xffff));
	TIM4->ARR|=(0x3e8);

	//比较捕获寄存器赋值
	TIM4->CCR1&=(~(0xffff));
	TIM4->CCR1|=(0x2bc);

	//捕获比较寄存器模式选择
	TIM4->CCMR1&=(~(0xf));
	TIM4->CCMR1|=(0x6);
	TIM4->CCMR1|=(0x1<<3);
	TIM4->CCMR1&=(~(0x3));

	//捕获比较寄存器使能
	TIM4->CCER&=(~(0x1<<3));
	TIM4->CCER|=(0x1<<1);
	TIM4->CCER|=(0x1);
	
	TIM4->CR1|=0x1<<7;		//定时器初始化
	TIM4->CR1&=(~(0x3<<5));
	TIM4->CR1|=(0x1<<4);
	TIM4->CR1|=0x1;


}
void init_fan(){          //PE9
	//初始化RCC
	RCC->MP_AHB4ENSETR|=0x1<<4;
	RCC->MP_APB2ENSETR|=0x1;

	//初始化GPIO
	GPIOE->MODER&=(~(0x3<<18));
	GPIOE->MODER|=(0x2<<18);
	
	GPIOE->AFRH&=(~(0xf<<4));
	GPIOE->AFRH|=(0x1<<4);

	//初始化TIM1
	TIM1->PSC&=(~0xff);     //分频器初始化
	TIM1->PSC|=0xd0;
	
	//自动重载寄存器
	TIM1->ARR&=(~(0xffff));
	TIM1->ARR|=(0x3e8);

	//比较捕获寄存器赋值
	TIM1->CCR1&=(~(0xffff));
	TIM1->CCR1|=(0x2bc);

	//捕获比较寄存器模式选择
	TIM1->CCMR1&=(~(0xf));
	TIM1->CCMR1|=(0x6);
	TIM1->CCMR1|=(0x1<<3);
	TIM1->CCMR1&=(~(0x3));

	//捕获比较寄存器使能
	TIM1->CCER&=(~(0x1<<3));
	TIM1->CCER|=(0x1<<1);
	TIM1->CCER|=(0x1);
	
	TIM1->CR1|=0x1<<7;		//定时器初始化
	TIM1->CR1&=(~(0x3<<5));
	TIM1->CR1|=(0x1<<4);
	TIM1->CR1|=0x1;
}	


void init_mada(){          //PF6 TIM16 只有边缘对齐模式
	//RCC
	
	RCC->MP_AHB4ENSETR|=0x1<<5;
	RCC->MP_APB2ENSETR|=0x1<<3;

	//GPIO
	GPIOF->MODER&=(~(0x3<<12));
	GPIOF->MODER|=(0x2<<12);

	GPIOF->AFRL&=((0xf<<24));
	GPIOF->AFRL|=(0x1<<24);

	//TIM16
	TIM16->PSC&=(~0xff);    //分频器初始化
	TIM16->PSC|=0xd0;

	//自动重载寄存器
	TIM16->ARR&=(~(0xffff));
	TIM16->ARR|=(0x3e8);

	//比较捕获寄存器赋值
	TIM16->CCR1&=(~(0xffff));
	TIM16->CCR1|=(0x2bc);

	//捕获比较寄存器模式选择
	TIM16->CCMR1&=(~(0xf));
	TIM16->CCMR1|=(0x6);
	TIM16->CCMR1|=(0x1<<3);
	TIM16->CCMR1&=(~(0x3));
	//捕获比较寄存器使能
	TIM16->CCER&=(~(0x1<<3));
	TIM16->CCER|=(0x1<<1);
	TIM16->CCER|=(0x1);
	
	TIM16->CR1|=0x1<<7;		//定时器初始化
	TIM16->CR1|=0x1;
	//主输出使能
	TIM16->BDTR|=(0x1<<15);



} 
#include "./include/bbep.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 < 100; j++);
}


int main(void){
	//init();
	init_fan();
	//init_mada();
	while(1){
	
	}


	return 0;
}

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

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

相关文章

【C++11】右值引用和移动语义

目录 一、左值 vs 右值 二、左值引用vs 右值引用 三、右值引用使用场景和意义 1. 左值引用的使用场景 2. 左值引用的短板 3. 右值引用和移动语义解决上述问题 四、右值引用引用左值的使用场景 五、完美转发 1. 模板中的&& 万能引用 2. std::forward 完美转发…

windows排查问题常用命令

查看JAVA进程占用PID: wmic process where caption"java.exe" get processid,caption,commandline /value查看进程端口信息&#xff1a;netstat -ano 或者 netstat -ano|findstr "8080" 或查看成功建立连接的&#xff1a;netstat -ano | findstr “ESTABLI…

C语言中的字符指针

目录1.字符指针指向一个字符2.字符指针指向一个字符串3.例题1.字符指针指向一个字符 int main() {char ch w;char *pc &ch;return 0; }将一个char类型的变量的地址放到一个char*类型的指针里去&#xff0c;这里的char*ps就是字符指针 在这里的字符指针与之前的整形指针等…

巧用gitbash的scp命令实现跨网段的文件直传

背景 嵌入式开发的工作流一般是这样的&#xff0c;程序员通过Windows电脑登陆Linux服务器&#xff0c;在服务器上编译出二进制文件后&#xff0c;先将文件scp到本地&#xff0c;然后再scp到Linux开发板&#xff0c;如下图所示 这样做需要执行两次scp命令&#xff0c;能否只执…

Golang cgo:如何在Go代码中调用C语言代码?

如何在Go代码中调用C语言代码&#xff1f; Go语言是通过自带的一个叫CGO的工具来支持C语言函数调用&#xff0c;同时我们可以用Go语言导出C动态库接口给其它语言使用。 方式一、直接在 Go 代码中写入 C 代码 检查是否开启cgo工具 首先&#xff0c;要查看是否已经开启cgo工具…

树状数组+例题

一、树状数组的定义 树状数组 或 二元索引树&#xff08;Binary Indexed Tree&#xff09;&#xff0c;现多用于高效计算数列的前缀和&#xff0c; 区间和。它可以以 log(n)log(n)log(n) 的时间得到任意前缀和&#xff0c;也支持在log(n)log(n)log(n)时间内支持动态单点值的修改…

Spring简介与使用

什么是spring spring是一个开源的框架&#xff0c;里面有一系列功能&#xff0c;可以使我们的开发变得更为轻松 简单来说&#xff0c;spring是包含众多工具方法的IoC容器 所谓容器&#xff0c;就是盛放东西的事务&#xff0c;例如我们的ArrayList就是数据存储的容器&#xff…

数据库——排序与分页

目录 排序数据 单列排序 多列排列 分页 分页原理 优点 MySQL 8.0新特性 排序数据 使用 ORDER BY 子句排序ASC&#xff08;ascend&#xff09;: 升序DESC&#xff08;descend&#xff09;:降序ORDER BY 子句在SELECT语句的结尾。 单列排序 SELECT employee_id,last_name…

【Linux】项目自动化构建工具-make与Makefile的简单使用(模拟实现进度条)

目  录1 make与Makefile使用2 模拟实现进度条前言&#xff1a; 会不会编写Makefile&#xff0c;从侧面说明了一个人是否具备完成大型工程的能力。一个工程中的源文件不计其数&#xff0c;按类型、功能、模块分别放在若干个目录中&#xff0c;Makefile定义了一系列的规则来指定…

使用 EMQX Cloud 桥接数据到 GCP Pub/Sub

前不久&#xff0c;Google 宣布其旗下的 GCP IoT Core 即将在 2023 年 8 月 16 日停止提供服务。这意味着大量使用 GCP IoT Core 的用户可能需要将他们的 IoT 应用迁移到其他物联网云服务。除了云服务的迁移&#xff0c;很多用户也在直接利用谷歌云生态&#xff0c;使用 GCP 上…

Docker部署 Harbor

系列文章目录 Docker部署 registry Docker搭建 svn Docker部署 Harbor Docker 部署SQL Server 2017 Docker 安装 MS SqlServer Docker部署 Oracle12c Docker部署Jenkins Docker部署 Harbor系列文章目录前言一、Harbor安装有3种方式二、安装步骤1. 从github官方地址下载安装包2…

C/C++尖括号和双引号包含头文件的区别

前言头文件有两种包含方式&#xff0c;一种是使用尖括号<>&#xff0c;另外一种是通过双引号""包含&#xff0c;例如&#xff1a;#include <iostream> #include "add.h"那么今天就专门来聊一聊这两种方式的区别。1.头文件的含义不同使用尖括号…

多表连接查询

语法&#xff1a; select ... from a join b on a和b的连接条件 join c on a和c的连接条件 join d on a和d的连接条件 一条SQL语句中内连接与外连接可以混合使用 案例&#xff1a;查询每个员工的部门名称以及薪资等级&#xff0c;要求显示员工名、部门名、薪资和薪资等级 SQL&…

核心乐理---和弦基础

和弦命名 什么是和弦 三个或三个以上的三度堆叠成为和弦 三和弦 三和弦指的是有三个音的和弦 七和弦是指七度的和弦&#xff0c;共4个音 其余的和弦与七和弦命名规则相同&#xff0c;跨越几度就是几和弦 九和弦是指跨越九度的和弦&#xff0c;共5个音十一和弦是指跨越十一…

【阶段三】Python机器学习18篇:机器学习项目实战:AdaBoost算法的核心思想、原理与数学原理举例

本篇的思维导图: AdaBoost算法的核心思想 AdaBoost算法(Adaptive Boosting)是一种有效而实用的Boosting算法,它以一种高度自适应的方式按顺序训练弱学习器。针对分类问题,AdaBoost算法根据前一次的分类效果调整数据的权重,在上一个弱学习器中分类错误的样本的权…

和Nginx相关的TCP/IP中反向代理系统解析与调优

文章目录前言反向代理系统分析消耗资源分析CPUMemory网卡压测与调优实战压测数据对比什么是TIME_WAITkeepalive开启前后数据对比小结关于后续端口不足&#xff0c;限制连接扩展协议层面无法充分做到连接的复用TCP优化分享相关文章&#xff1a;前言 本文介绍aeproxy这个应用以及…

IB地理科学什么?

IB地理科是一门很特别的科目&#xff0c;能帮助同学掌握技巧认识和了解这世界&#xff0c;而这课程分为两部分&#xff0c;包括自然环境和人文社会。IB地理科两部分 首先是自然环境&#xff0c;包括生态系统、气候&#xff0c;地壳活动等等 &#xff1b;另外是人文社会&#x…

Nosql和Redis介绍,Redis五大数据类型及操作,跳跃表

NoSQL数据库是用来解决性能问题的&#xff0c;分很多类。redis是NoSQL的一种。 NoSQL的引入&#xff1a; 随着Web2.0时代的到来。可以进行网络请求的不仅限与电脑。用户还可以通过手机端&#xff0c;平板甚至汽车等来进行网络请求。网络请求极具增加&#xff0c;增加了服务器…

【代码随想录】LC 102. 二叉树的层序遍历

目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 一、题目 1、原题链接 力扣 2、题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问…

linux下miniconda环境的配置以及软件的安装

miniconda 我们需要在自己的目录下安装conda环境&#xff0c;所以需要自定义安装位置 mkdir /share/nas6/wangyq/biosoft/miniconda wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /share/nas6/wangyq/biosoft/miniconda/miniconda.sh注意…