STM32CubeMX下按键模块控制PWM蜂鸣器模块

发布者:size0109最新更新时间:2019-06-24 来源: eefocus关键字:STM32CubeMX  按键模块  PWM  蜂鸣器模块 手机看文章 扫描二维码
随时随地手机看文章

前言:之前的STM32L433CB单片机还有几个模块没有解决,最佳抽空把按键模块和PWM蜂鸣器模块调通了。


1.按键模块

按键模块重点是需要了解中断模式:

(1)中断简而言之是暂时中止当前的工作,而去处理更为急需处理的事情,把急需处理的事情处理完毕之后,再回头来继续原来的事情。

(2)stm32的中断分为抢占优先级和响应优先级。抢占优先级高的中断,可以打断抢占优先级低的中断。抢占优先级相同的中断,响应优先级高的可以优先执行。

(3)中断向量表:中断向量是中断服务程序的入口地址,在计算机中中断向量的地址存放一条跳转到中断服务程序的跳转指令。中断地址是存储中断向量的内存单元。中断向量表是用来存放中断向量

(4)嵌套中断:中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行,这个过程就是中断嵌套。如果中断里调用HAL_Delay就会停在那里,因为根本不会进入那个级别更低的中断。CUBE生成的程序中, SysTick是中断型延时,SysTick是内核中断,优先级别默认最低。所以我后面的延时函数使用了SysTick。

了解中断之后就是STM32中的按键:

按键需要上拉电阻,当按键按下接地,低电平导通,CPU读取低电平

在这里插入图片描述

配置方法

使按键对应的PC13和PA15为GPIO模式,勾上修改,将GPIO mode 设置为下降沿触发中断,设置电阻为上拉电阻。

在这里插入图片描述

使能按键中断,两个按键中断优先级是一样的

在这里插入图片描述


2.PWM蜂鸣器模块

pwm波形产生的原理:

在这里插入图片描述

通用定时器可以利用GPIO引脚进行脉冲输出,在配置为比较输出、PWM输出功能时,捕获/比较寄存器TIMx_CCR被用作比较功能,下面把它简称为比较寄存器。

这里直接举例说明定时器的PWM输出工作过程:若配置脉冲计数器TIMx_CNT为向上计数,而重载寄存器TIMx_ARR被配置为N,即TIMx_CNT的当前计数值数值X在TIMxCLK时钟源的驱动下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0重新计数。

而在TIMxCNT计数的同时,TIMxCNT的计数值X会与比较寄存器TIMx_CCR预先存储了的数值A进行比较,当脉冲计数器TIMx_CNT的数值X小于比较寄存器TIMx_CCR的值A时,输出高电平(或低电平),相反地,当脉冲计数器的数值X大于或等于比较寄存器的值A时,输出低电平(或高电平)。

如此循环,得到的输出脉冲周期就为重载寄存器TIMx_ARR存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR的值A乘以触发脉冲的时钟周期,即输出PWM的占空比为 A/(N+1) 。

在这里插入图片描述

(1)当 PA1 输出高电平的时候,蜂鸣器将发声, 当 PA1 输出低电平的时候,蜂鸣器停止发声。R10U为了防止蜂鸣器误发声,下拉输出,推挽输出

(2)有源蜂鸣器内含振荡源,只要一通电就发声,但发生频率固定,音色单一;无源蜂鸣器内部不含振荡源,内部结构相当于电磁场扬声器,可以通过给他输出一定频率的信号才能发声。

(3)人耳能听到的频率范围在20Hz–20kHz之间,通过STM32的GPIO引脚快速切换高低电平输出就能实现无源蜂鸣器的发声,切换的频率不同,发出的音调就不一样。当CNT达到ARR值的时候,重新归零,然后重新向上计数,依次循环。改变CCRx的值,就可以改变PWM输出的占空比;改变ARR的值,就可以改变PWM输出的频率。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

时钟树配置为80MHz,可知PWM的时钟为80MHz

PWM频率为80MHz/ARR,周期为1*ARR/80MHz,占空比为CRRx/ARR


修改工程名,路径和编译工具


在这里插入图片描述
在这里插入图片描述

生成代码:

stm32l4_it.c文件:


void EXTI15_10_IRQHandler(void)

{

  /* USER CODE BEGIN EXTI15_10_IRQn 0 */

delay_ms(10);        //延时消抖

  /* USER CODE END EXTI15_10_IRQn 0 */

  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);

  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);

  /* USER CODE BEGIN EXTI15_10_IRQn 1 */


  /* USER CODE END EXTI15_10_IRQn 1 */

}


/* USER CODE BEGIN 1 */

void delay_ms(uint32_t nms)   //利用SysTick写一个延时函数

 {

  uint32_t temp;

  SysTick->LOAD = 8000*nms;

  SysTick->VAL=0X00;

  SysTick->CTRL=0X01;

  do

  {

      temp=SysTick->CTRL;

  }

    while((temp&0x01)&&(!(temp&(1<<16))));

     SysTick->CTRL=0x00; 

     SysTick->VAL =0X00; 

 }

/* USER CODE END 1 */


stm32l4_it.h文件:


/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

#include "stdint.h"

/* USER CODE END Includes */


/* USER CODE BEGIN EFP */

void delay_ms(uint32_t nms);

/* USER CODE END EFP */


tim.c文件:


/* USER CODE BEGIN 1 */

int tone[]={247,262,294,330,349,392,440,294,523,587,659,698,784,1000};//音调对应的频率


int yindiao[]=             //音调

5,5,6,8,7,6,5,6,13,13,

5,5,6,8,7,6,5,3,13,13,

2,2,3,5,3,5,6,3,2,1,

6,6,5,6,5,3,6,5,13,13,

5,5,6,8,7,6,5,6,13,13,

5,5,6,8,7,6,5,3,13,13,

2,2,3,5,3,5,6,3,2,1,

6,6,5,6,5,3,6,1,

13,8,9,10,10,9,8,10,9,8,6,

13,6,8,9,9,8,6,9,8,6,5,

13,2,3,5,5,3,5,5,6,8,7,6,

6,10,9,9,8,6,5,6,8

};


int dtime[]=               //节拍

{

2,4,2,2,2,2,2,8,4, 4,

2,4,2,2,2,2,2,8,4, 4,

2,4,2,4,2,2,4,2,2,8,

2,4,2,2,2,2,2,8,4 ,4, 

2,4,2,2,2,2,2,8,4, 4,

2,4,2,2,2,2,2,8,4, 4, 

2,4,2,4,2,2,4,2,2,8,

2,4,2,2,2,2,2,8,

4, 2,2,2, 4, 2,2,2, 2,2,8,

4, 2,2,2, 4, 2,2,2, 2,2,8,

4, 2,2,2,4,2,2,5,2,6,2,4,

2,2 ,2,4,2,4,2,2,12

};


void sound(int freq)

{

if(freq!=1000)

{

int Arr;

TIM_OC_InitTypeDef sConfigOC = {0};

Arr = 500000/freq;

htim2.Init.Period = Arr;//改变频率来改变计数器周期

HAL_TIM_PWM_Init(&htim2);

sConfigOC.Pulse = Arr/4;

sConfigOC.OCMode = TIM_OCMODE_PWM1;

sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)

{

Error_Handler();

}

HAL_TIM_MspPostInit(&htim2);

    

}

HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);  //使能PWM定时器

}



void buzzer_quit()

{

HAL_TIM_PWM_Stop(&htim2,TIM_CHANNEL_2);//停止PWM定时器

}


void play_mus()//播放音乐

{

int i;

for(i=0;i {

sound(tone[yindiao[i]]);

delay_ms(150*dtime[i]);

buzzer_quit();

delay_ms(20);

}

}

/* USER CODE END 1 */


tim.h文件:


/* USER CODE BEGIN Prototypes */

void sound(int freq);

void start_pwm();

void buzzer_quit();

void play_mus();

/* USER CODE END Prototypes */


gpio.c文件:


/* USER CODE BEGIN 2 */

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//中断回调函数,当按键按下跳入

{

switch(GPIO_Pin)

{

case GPIO_PIN_13:          //按下PC13对应按键播放音乐            

   play_mus();

       

break; 

case GPIO_PIN_15:              //按下PA15按键停止播放

   buzzer_quit(); 

      

    break;

}

}

/* USER CODE END 2 */


由于两个按键优先级一样,中断不能被另一个打断。


gpio.h文件:


/* USER CODE BEGIN Includes */

#include "tim.h"         //包含tim.h头文件

/* USER CODE END Includes */



关键字:STM32CubeMX  按键模块  PWM  蜂鸣器模块 引用地址:STM32CubeMX下按键模块控制PWM蜂鸣器模块

上一篇:STM32笔记2:建库操作之点亮LED
下一篇:STM32学习笔记--按键输入实验

推荐阅读最新更新时间:2024-11-17 09:42

STM32CubeMX】1,STM32之GPIO端口输入模式配置
主要参考这两篇文章 https://blog.csdn.net/flaming999/article/details/52487904 https://blog.csdn.net/kevinhg/article/details/17490273 2、推挽输出与开漏输出的区别 推挽输出:可以输出高,低电平,连接数字器件;开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内). 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止. 要实现 线与 需要用OC(open collector)门电路.是两个参数
[单片机]
【<font color='red'>STM32CubeMX</font>】1,STM32之GPIO端口输入模式配置
STM32F PWM的生成
void TIME3_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; GPIO_InitTypeDef GPIO_InitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; //第一步:配置时钟 // GPIOC Configuration: Channel 6 as alternate function push-pull RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); //第二步,配置goio口 GPIO_InitS
[单片机]
基于PIC24FJ64GA的空间电压矢量PWM控制方法研究
0 引言 在电机变频调速系统中,广泛应用到了PWM技术。PWM控制利用半导体开关器件的导通与关断把整流后的直流电变成脉冲序列,通过控制脉冲宽度和脉冲列的周期以实现变压、变频控制,同时减少输出电压电流谐波。早期的SPWM控制主要着眼于使逆变器输出电压波形尽量接近于正弦波,希望输出PWM电压波形的基波成分尽量的大,谐波成分尽量的小,并没有考虑到电动机本身旋转磁场的影响。空间电压矢量PWM技术是当前研究的热点问题,它将逆变器和交流电机作为一个整体来考虑,其控制目标是使磁通轨迹近似为圆,也被称为磁链跟踪PWM控制。本文在分析空间电压矢量PWM原理的基础上,提出了一种基于16位PIC24FJ64GA单片机实现SVPWM控制的方法。 1
[单片机]
基于PIC24FJ64GA的空间电压矢量<font color='red'>PWM</font>控制方法研究
PWM调制中的死区问题
  “死区”的概念,必须记录下来,网上收集的,拿来主义下,有用的上的时候。   PWM 脉宽调制 在电力电子中,最常用的就是整流和逆变。这就需要用到整流桥和逆变桥。以两电平为例,每个桥臂上有两个电力电子器件,比如igbt。这两个igbt不能同时导通,否则就会出现短路的情况。因此,设计带死区的PWM波可以防止上下两个器件同时导通。也就是说,当一个器件导通后关闭,再经过一段死区,这时才能让另一个导通。   死区,通常,大功率电机、变频器等,末端都是由大功率管、IGBT等元件组成的H桥或3相桥。每个桥的上半桥和下半桥是是绝对不能同时导通的,但高速的PWM驱动信号在达到功率元件的控制极时,往往会由于各种各样的原因产生延迟的效果,造成某个半
[电源管理]
STM32CubeMX:EXTI操作
芯片:STM32F103C8T6 应用管脚: 输出:PA0、PA1 输入:PB9 配置界面 NVIC增加中断 程序中增加回调函数 /* USER CODE BEGIN 4 */ /** * @brief EXTI line detection callback * @param GPIO_Pin: Specifies the pins connected EXTI line * @retval None */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_9) { HAL_GPI
[单片机]
<font color='red'>STM32CubeMX</font>:EXTI操作
【PIC32MZ】PWM呼吸灯
PWM类似于开关电源,将高电压中间插入地脉冲,来将有效电压降低,在某些电压不敏感器件中,可以实现电压降低的效果。例如LED的亮度变化。 前文有说过,Harmony的Dynamic还不是很完善,在PWM上就有体现,PWM需要OC与静态Timer配合,如果有其它Timer在在使用Dynamic,不想全部改为Static,可以直接使用PLIB函数,可以从其它Static函数往底层去看,也是通过static调用的PLIB函数。 所以,在这里我们只配置OC,而对应的Timer则采用直接调用底层函数的方法使用static驱动。 注意,PWM的占空比指的是高电位占空比,例如80%指的是80%为高电位。 呼吸灯则是使用另外一个Ti
[单片机]
【PIC32MZ】<font color='red'>PWM</font>呼吸灯
10. 从0学ARM-基于Exynos4412的pwm详解
一、什么是PWM PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%. 二、PWM信号输出输出和作用 1. 如果要实现PWM信号输出如何输出呢? 1)可以直接通过芯片内部模块输出PWM信号,前提是这个I/O口要有集成的pwm控制器,只需要通过对应的寄存器即可,这种自带有PWM输出的功能模块在程序设计更简便,同时数据更精确。 2)但是如果IC内部没有
[单片机]
10. 从0学ARM-基于Exynos4412的<font color='red'>pwm</font>详解
MAX17499/MAX17500电流模式PWM控制器
该MAX17499/MAX17500 电流模式PWM控制器 包含所有的控制电路的宽输入电压隔离和非隔离式电源设计要求。该MAX17499非常适合低输入电压(9.5V至24V直流DC)电源供应。该MAX17500非常适合通用输入(整流85V的交流到265V AC)或电信(- 36V的直流到72V的直流)电源。   这些IC包含一个内部误差放大器,调节第三绕组输出电压,在初级侧稳压隔离电源使用。初级侧调节省去了光耦的需要。一个输入欠压锁定(UVLO)提供编程的输入电源启动电压,并确保在电源跌落时正常工作。开漏输出欠压锁定标志210μs内部延迟,允许二次侧控制器排序。输入电源启动电压与外部分压器进行编程。一个UVLO / EN输入是用
[电源管理]
MAX17499/MAX17500电流模式<font color='red'>PWM</font>控制器
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved