一:原理解析

在编写代码前,首先要明白,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相关推荐

  1. 【春节歌曲回味 | STM32小音乐盒 】PWM+定时器驱动无源蜂鸣器(STM32 HAL库)

    l  STM32通过PWM与定时器方式控制无源蜂鸣器鸣响 l  STM32小音乐盒,歌曲进度条图形显示与百分比显示,歌曲切换 l  编程使用STM32 HAL库 l  IIC OLED界面编程,动画实 ...

  2. stm32无源蜂鸣器定时器_stm32定时器实现PWM输出控制无源蜂鸣器(HAL)

    (一)PWM概念和原理 脉冲宽度调制(PWM),是英文"Pulse Width Modulation"的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有 ...

  3. stm32无源蜂鸣器定时器_STM32无源蜂鸣器播放音乐

    1.STM32产生PWM波驱动无源蜂鸣器使其发声 1)查看原理图,找到对应引脚(我这里时PA1) 2)打开CubeMax,输入自己芯片的类型确定后,配置好系统时钟RCC,我这里是80Mhz,找到相应引 ...

  4. STM32 cubeMX下配置STM32单片机使无源蜂鸣器输出PWM波并放音乐

    1.首先我们要了解定时器(timer) timer分为三种:高级定时器(tim1,tim8),基本定时器(tim6,tim7),通用定时器(tim2,tim3,tim4,tim5). 基本定时器:它有 ...

  5. 赛元SC92F8463B/SC95F8523的PWM 实现无源蜂鸣器功能

    文章目录 1.有源蜂鸣器和无源蜂鸣器 1.1.有源蜂鸣器 1.2.无源蜂鸣器 2.赛元SC92F8463B通过PWM实现蜂鸣器功能 2.1.功能描述 2.2.工作模式 2.2.1.独立模式 2.2.2 ...

  6. Arduino ESP32通过PWM控制无源蜂鸣器

    Arduino ESP32通过PWM控制无源蜂鸣器 相关篇<ESP32在Arduino开发环境中的PWM的使用方法> ESP32通过PWM控制无源蜂鸣器发出声音. 有源和无源蜂鸣器知识科普 ...

  7. ros 双wan配置_基于ROS搭建简易软件框架实现ROV水下目标跟踪(九)--程序解析之PWM波下发...

    模块对应cabin_controllers/serial_to_mcu.模块实现的功能为监听网络中PWM矩阵信息,将其转换成十六进制数据通过串口下发至MCU,实现对推进器电机的控制.模块数据的串口通信 ...

  8. arduino无源蜂鸣器歌曲编码_基于Arduino使用低电平触发无源蜂鸣器模块

    蜂鸣器模块 我们可以使用Arduino进行很多互动作品,其中最常用的是声光显示器.之前的所有实验都与LED有关.但是,这个实验中的电路可以产生声音.通常,实验是通过蜂鸣器或扬声器完成的,而蜂鸣器更简单 ...

  9. STM32实战-无源蜂鸣器

    前言: 主要通过无源蜂鸣器实现功能有: 1.上电后,无源蜂鸣器发出警报声: 2.通过触摸按键1打开或关闭蜂鸣器; 目录 1.硬件电路部分 2.技术讲解 2.1通用定时器(TIMx) 2.2主要特性 2 ...

最新文章

  1. 步步为营-20-XML
  2. Java实现ANN神经网络之BP代码参考
  3. 临界区、事件、互斥量、 信号量--四种控制多线程同步与互斥的方法
  4. VideoTool之FFmpeg:FFmpeg的简介、安装、使用方法之详细攻略
  5. 2018年9月份GitHub上最热门的Python项目
  6. 正在启动python的代码补全客户端_Python交互模式下代码自动补全
  7. linux tomcat 配置数据库,tomcat把项目放在root下root.xml配置数据库
  8. Windows 7下硬盘安装Ubuntu 14.10图文教程【硬盘安装】
  9. 从零基础入门Tensorflow2.0 ----九、44.2 keras加载保存的参数
  10. 华硕重装系统键盘灯失效 =重装ATK驱动
  11. 微信公众平台二次开发技术文档
  12. 数据库小计和总计之 Rollup函数 简单介绍
  13. clearcase 与 git的区别
  14. MDIO总线简单介绍
  15. 【图形图像处理】之栅格化介绍
  16. android dialog edittext 弹出软件盘,http://gogo.com-官方网站
  17. 漏洞修复:Cookie Security: HTTPOnly not Set on Application Cookie
  18. 2020.2.4记账
  19. 支付宝领红包的算法猜想
  20. 以太坊:在合约里调用指定地址的另一已部署合约

热门文章

  1. Multisim基础 有极性的电容 添加元件的位置
  2. CTFHUB http协议题目 学习笔记 详细步骤 请求方式 302跳转 cookie 基础认证 响应源代码
  3. android 音频显示器,安卓手机投屏(带声音同步)教程
  4. 高德地图不开位置无法定位服务器,使用高德地图导航时光标不动(定位不动、无法定位)的用户 请进...
  5. PCF文件管道信息解析
  6. 机械过滤器(石英砂过滤器)和多介质过滤器的区别
  7. error: (-215:Assertion failed) npoints = 0 (depth == CV_32F || depth == CV_32F || depth ==CV_32S
  8. 机械键盘上的ASF是什么意思?
  9. asf如何在linux运行,linux环境下使用mono运行asf挂卡
  10. Github项目文档的管理