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-12 07:44

MAX15569 PWM控制器,串行I2C接口
MAX15569降压控制器由一个多相稳压器。多相CPU稳压器采用Maxim的独特的2相QuickTune-PWM常数“时间”的体系结构。两相CPU稳压器运行180°的相对于真正的交错式操作,最大限度地降低输入电容。 该设备的VR控制写入相应的数据转换成一个函数映射寄存器文件。输出电压的动态变化,快速通过2线I²C接口(时钟,数据),允许进行编程,以适应不同电压的开关稳压器。摆率控制器,可控制的电压转换和控制的软启动。该稳压器运行在一个独特的智能,低功耗的脉冲跳跃状态算法在整个负载范围内的效率和最佳的瞬态响应,相对于常见的脉冲跳跃的方法。 该设备包括多种故障保护功能:输出过压保护(OVP),欠压保护(UVP),和热保护。当这些故
[模拟电子]
MAX15569 <font color='red'>PWM</font>控制器,串行I2C接口
利用单片机构成高精度PWM式12位D/A
.前言 在用单片机制作的变送器类和控制器类的仪表中,需要输出1-5V或4-20mA的直流信号的时候,通常采用专用的D/A芯片,一般是每路一片。当输出信号的精度较高时,D/A芯片的位数也将随之增加。在工业仪表中,通常增加到12位。12位D/A的价格目前比单片机的价格要高得多,占用的接口线数量也多。尤其是在需隔离的场合时,所需的光电耦合器数量与接口线相当,造成元器件数量大批增加,使体积和造价随之升高。如果在单片机控制的仪表里用PWM 方式完成D/A输出,将会使成本降低到12位D/A芯片的十分之一左右。我们在S系列流量仪表中采用了这种方式,使用效果非常理想。下面介绍一下PWM方式D/A的构成原理。 .电路原理 一般12位D/A转换器
[单片机]
利用单片机构成高精度<font color='red'>PWM</font>式12位D/A
STM32CubeMX生成F1的工程中提示找不到 __HAL_TIM_SetCompare 问题
1. 问题描述 在用STM32CubeMX生成 STM32F103C8T6 的MDK工程后,在main.c中更改定时器占空比计数值的时候,报错: 总之就是HAL库内部API函数__HAL_TIM_SetCompare找不到。 2. 解决方案 经过搜索,该函数在stm32_hal_legacy.h文件中: 所以出错原因肯定是:调用此函数的时候没有包含进来这个头文件,再次通过文件名查找: 果然,包含此头文件需要定义宏USE_HAL_LEGACY。 在它前面define一下: 重新编译,问题解决成功! 这样添加之后,重新使用STM32CubeMX生成工程后,代码会被自动覆盖,需要重新添加!
[单片机]
<font color='red'>STM32CubeMX</font>生成F1的工程中提示找不到 __HAL_TIM_SetCompare 问题
STM32CubeMX:UART操作
UART共有三种操作方式,轮询方式、中断方式以及DMA方式。 芯片:STM32F103C8T6 应用管脚: 输出:PA0、PA1 USART1 配置界面 添加中断配置 添加DMA配置 代码应用 1.实现printf函数 /* USER CODE BEGIN 0 */ #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker- Libraries- Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE
[单片机]
呼吸灯(PWM)+普中51单片机+江科大自化协
1 实验原理 PWM(Pulse Width Modulation)脉冲宽度调制,一种用数字信号控制模拟量的方法,因此在控制领域应用非常广泛。所谓PWM信号就是调整波形的占空比得到一系列矩形脉冲。PWM信号产生的原理是基于面积等效原理。即冲量相同的形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。 2 参考程序 #include REGX52.H sbit LED=P2^0; void Delay(unsigned int i) { while(i--); } void main() { unsigned char Time,i; while(1) { for(Time=0;Time
[单片机]
呼吸灯(<font color='red'>PWM</font>)+普中51单片机+江科大自化协
【STM32】HAL库 STM32CubeMX教程十四---SPI
前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在我们的HAL库中,对硬件SPI函数做了很好的集成,使得之前SPI几百行代码,在HAL库中,只需要寥寥几行就可以完成 那么这篇文章将带你去感受下它的优异之处,这些优异的函数,也正是HAL库的优点所在 本文 1首先讲解SPI工作原理及W25QX芯片原理, 2基于CubeMx创建工程 3 对HAL库SPI函数进行讲解,4例程详解 所用工具: 1、芯片: STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/STM32F4xxHAL库 5、SPI: 使用硬
[单片机]
【STM32】HAL库 <font color='red'>STM32CubeMX</font>教程十四---SPI
STM32cubeMX改C/C++混合编译
首先说明一下,本文的开发环境是linux,基于STM32cubeMX生成工程添加C++部分代码和选项。写给单片机开发windows转linux新手,高手略过。 STM32cubeMX生成Makefile工程步骤,以及Linux环境搭建,请参考我上一篇博文https://blog.csdn.net/u013908686/article/details/79883904,本文着重讲解添加C++代码的过程。 cubeMX生成工程默认是C语言,还有一部分汇编。 首先加入file.cpp到工程,在Middlewares下新建cxxsource文件夹,当然也可以在你喜欢的位置添加。将C++代码拷贝到cxxsource/。 在M
[单片机]
STM32基础PWM输出
a)目的:基础PWM输出,以及中断配合应用。输出选用PB1,配置为TIM3_CH4,是目标板的LED6控制脚。 b)对于简单的PWM输出应用,暂时无需考虑TIM1的高级功能之区别。 c)初始化函数定义: void TIM_ConfiguraTIon(void);//定义TIM初始化函数 d)初始化函数调用: TIM_Configuration();//TIM初始化函数调用 e)初始化函数,不同于前面模块,TIM的初始化分为两部分——基本初始化和通道初始化: void TIM_Configuration(void)//TIM初始化函数 { TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;//
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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