PWM波启动无源蜂鸣器——基于STM32MP157A
一:原理解析
在编写代码前,首先要明白,PWM方波是怎么产生的。
当定时器启动后,自动重载计数器中的值会自动加载到递减计数器中。递减计数器在CK_CNT时钟驱动下进行工作。每过一个时钟周期,递减计数器中的值会自动 -1。当减少到和捕获/比较寄存器中的值相同时,电平发生翻转,PWM方波信号就产生了。
二:电路分析
翻看芯片手册
由此可知:蜂鸣器引脚为TIM4_CH1
去主板上查找该引脚
可知,主板引脚为PB6
所以可知
RCC寄存器给TIM4相关控制器、GPIOB寄存器使能。由TIM4寄存器产生PWM方波信号,激活蜂鸣器。GPIOB寄存器控制蜂鸣器工作。
三:查看芯片手册,确定引脚功能
1:RCC章节分析
搜索可知,TIM寄存器,所在总线为APB1
起始地址为0x40002000
GPIO寄存器,上篇文章已经找过了,不再过多赘述
GPIOB --> AHB4总线 -->起始地址:0x50003000
RCC对GPIOB使能
即:
RCC_MP_AHB4ENSETR[1] = 1
RCC对TIM4使能
查找RCC_MP_APB1ENSETR寄存器
即为:
RCC_MP_APB1ENSETR[2] = 1
2:GPIO章节分析
GPIOx_MODER
设置PB6引脚为复用功能
GPIOx_AFRL寄存器
6号引脚,在AFRL寄存器上
但是,我们并不知道它的引脚填什么值,所以还需要再去看另一个芯片手册:《stm32mp157a》
故,选择AF2模式(回到原芯片手册)
即:
GPIOB_AFRL[27:24] = 0010
3:TIM4章节分析
工作原理最开始大致介绍,此处不再赘述,我们直接根据原理图顺序,开始寄存器分析
TIM4_PSC寄存器
分频寄存器,因为系统默认频率为209MHZ,所以,为了方便计算,我们把它设置为209-1 = 208
即
TIM4_PSC[15:0] = 208 //即0xD0
TIM4_ARR寄存器
自动重载计数器,用以设置周期时长
0~15位设置为1000
TIM4_ARR[15:0] = 1000 //0x3E8
TIM4_CCMR1寄存器
设置PWM模式
TIM4_CCMR1[16][6:4] = 0110------>设置为PWM1模式
设置预加载使能
TIM4_CCMR1[3] = 1 ------>设置预加载使能
TIM4_CCMR1[1:0] = 00 ------>设置为输出模式
TIM4_CCER寄存器
TIM4_CCER[1] = 0 //高电平
TIM4_CCER[0] = 1
TIM4_CCR 1寄存器
比较捕获寄存器,影响方波高电平占比
TIM4_CCR1[15:0] = 700
TIM4_CR1寄存器
即:
TIM4_CR1[7] = 1 ------>自动重载计数器预加载使能
TIM4_CR1[6:5] = 00 ------>设置边沿对齐模式
TIM4_CR1[4] = 1 ------>设置递减计数器
TIM4_CR1[0] = 1 ------>设置计数器使能
至此,芯片手册分析完毕
四:代码实现
把前面分析出的代码组合
本次头文件采用现成的库,封装原理可以参考鄙人上一篇文章
pwm.h
#ifndef __PWM_H__
#define __PWM_H__#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_tim.h"
#include "stm32mp1xx_rcc.h"//初始化
void pwm_init();#endif
功能代码:pwm.c
#include "pwm.h"void pwm_init()
{
/***********RCC初始化**************///使能GPIOBRCC->MP_AHB4ENSETR = (0x1 << 1);RCC->MP_APB1ENSETR = (0x1 << 2); /*****GPIO章节初始化*****/GPIOB->AFRL &= (~(0xf << 24));GPIOB->AFRL |= (0x2 << 24);//设置PB6引脚为输出模式//GPIOB_MODER[13:12] = 0b01GPIOB->MODER &= (~(0x3 << 12));GPIOB->MODER |= (0x2 << 12);/***********TMI4寄存器**************///TIM4_PSC寄存器TIM4->PSC &= ~(0xffff);TIM4->PSC |= 0xd0; //208//TIM4_ARR寄存器 自动重载寄存器TIM4->ARR &= ~(0xffff);TIM4->ARR |= (0x3E8); //1000//TIM4_CCMR1寄存器//设置pwm1模式TIM4_CCMR1 16 [6:4] = 0110TIM4->CCMR1 &= (~(0x1 << 16)); //16位置0TIM4->CCMR1 &= (~(0x7 << 4)); //6~4位清零TIM4->CCMR1 |= (0x6 << 4); //置为110//设置预加载使能TIM4_CCMR1[3] = 1TIM4->CCMR1 |= (0x1 << 3);//设置为输出模式 TIM4_CCMR1[1:0] = 00TIM4->CCMR1 &= (~(0x3 << 0));//TIM4_CCER寄存器//设置起始位高电平TIM4->CCER &= (~(0x1 << 1));//配置输出使能TIM4->CCER |= (0x1 << 0);//TIME4_CCR1TIM4->CCR1 &= (~(0xffff));TIM4->CCR1 |= (0x12c);//TIM4_CR1寄存器//自动承载计数器预加载使能TIM4->CR1 |= (0x1 << 7);//设置边沿对齐模式TIM4->CR1 &= (~(0x3) << 5);//设置递减计数器TIM4->CR1 |= (0x1 << 4);//设置计数器使能TIM4->CR1 |= (0x1 << 0);
}
PWM波启动无源蜂鸣器——基于STM32MP157A相关推荐
- 【春节歌曲回味 | STM32小音乐盒 】PWM+定时器驱动无源蜂鸣器(STM32 HAL库)
l STM32通过PWM与定时器方式控制无源蜂鸣器鸣响 l STM32小音乐盒,歌曲进度条图形显示与百分比显示,歌曲切换 l 编程使用STM32 HAL库 l IIC OLED界面编程,动画实 ...
- stm32无源蜂鸣器定时器_stm32定时器实现PWM输出控制无源蜂鸣器(HAL)
(一)PWM概念和原理 脉冲宽度调制(PWM),是英文"Pulse Width Modulation"的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有 ...
- stm32无源蜂鸣器定时器_STM32无源蜂鸣器播放音乐
1.STM32产生PWM波驱动无源蜂鸣器使其发声 1)查看原理图,找到对应引脚(我这里时PA1) 2)打开CubeMax,输入自己芯片的类型确定后,配置好系统时钟RCC,我这里是80Mhz,找到相应引 ...
- STM32 cubeMX下配置STM32单片机使无源蜂鸣器输出PWM波并放音乐
1.首先我们要了解定时器(timer) timer分为三种:高级定时器(tim1,tim8),基本定时器(tim6,tim7),通用定时器(tim2,tim3,tim4,tim5). 基本定时器:它有 ...
- 赛元SC92F8463B/SC95F8523的PWM 实现无源蜂鸣器功能
文章目录 1.有源蜂鸣器和无源蜂鸣器 1.1.有源蜂鸣器 1.2.无源蜂鸣器 2.赛元SC92F8463B通过PWM实现蜂鸣器功能 2.1.功能描述 2.2.工作模式 2.2.1.独立模式 2.2.2 ...
- Arduino ESP32通过PWM控制无源蜂鸣器
Arduino ESP32通过PWM控制无源蜂鸣器 相关篇<ESP32在Arduino开发环境中的PWM的使用方法> ESP32通过PWM控制无源蜂鸣器发出声音. 有源和无源蜂鸣器知识科普 ...
- ros 双wan配置_基于ROS搭建简易软件框架实现ROV水下目标跟踪(九)--程序解析之PWM波下发...
模块对应cabin_controllers/serial_to_mcu.模块实现的功能为监听网络中PWM矩阵信息,将其转换成十六进制数据通过串口下发至MCU,实现对推进器电机的控制.模块数据的串口通信 ...
- arduino无源蜂鸣器歌曲编码_基于Arduino使用低电平触发无源蜂鸣器模块
蜂鸣器模块 我们可以使用Arduino进行很多互动作品,其中最常用的是声光显示器.之前的所有实验都与LED有关.但是,这个实验中的电路可以产生声音.通常,实验是通过蜂鸣器或扬声器完成的,而蜂鸣器更简单 ...
- STM32实战-无源蜂鸣器
前言: 主要通过无源蜂鸣器实现功能有: 1.上电后,无源蜂鸣器发出警报声: 2.通过触摸按键1打开或关闭蜂鸣器; 目录 1.硬件电路部分 2.技术讲解 2.1通用定时器(TIMx) 2.2主要特性 2 ...
最新文章
- 步步为营-20-XML
- Java实现ANN神经网络之BP代码参考
- 临界区、事件、互斥量、 信号量--四种控制多线程同步与互斥的方法
- VideoTool之FFmpeg:FFmpeg的简介、安装、使用方法之详细攻略
- 2018年9月份GitHub上最热门的Python项目
- 正在启动python的代码补全客户端_Python交互模式下代码自动补全
- linux tomcat 配置数据库,tomcat把项目放在root下root.xml配置数据库
- Windows 7下硬盘安装Ubuntu 14.10图文教程【硬盘安装】
- 从零基础入门Tensorflow2.0 ----九、44.2 keras加载保存的参数
- 华硕重装系统键盘灯失效 =重装ATK驱动
- 微信公众平台二次开发技术文档
- 数据库小计和总计之 Rollup函数 简单介绍
- clearcase 与 git的区别
- MDIO总线简单介绍
- 【图形图像处理】之栅格化介绍
- android dialog edittext 弹出软件盘,http://gogo.com-官方网站
- 漏洞修复:Cookie Security: HTTPOnly not Set on Application Cookie
- 2020.2.4记账
- 支付宝领红包的算法猜想
- 以太坊:在合约里调用指定地址的另一已部署合约
热门文章
- Multisim基础 有极性的电容 添加元件的位置
- CTFHUB http协议题目 学习笔记 详细步骤 请求方式 302跳转 cookie 基础认证 响应源代码
- android 音频显示器,安卓手机投屏(带声音同步)教程
- 高德地图不开位置无法定位服务器,使用高德地图导航时光标不动(定位不动、无法定位)的用户 请进...
- PCF文件管道信息解析
- 机械过滤器(石英砂过滤器)和多介质过滤器的区别
- error: (-215:Assertion failed) npoints = 0 (depth == CV_32F || depth == CV_32F || depth ==CV_32S
- 机械键盘上的ASF是什么意思?
- asf如何在linux运行,linux环境下使用mono运行asf挂卡
- Github项目文档的管理