历史上的今天
返回首页

历史上的今天

今天是:2025年04月23日(星期三)

正在发生

2018年04月23日 | STM32F4(BUZZ)

2018-04-23 来源:eefocus

在实际的项目开发过程中,常常会遇到硬件电路的修改,然后修改的部分就需要修改驱动程序。想这样需求该来该去是程序员们最烦闷的事情(重复劳动痛不欲生啊~)。为了避免或减少重复劳动,就需要在程序的架构上下功夫。接下来以最常见的无源蜂鸣器驱动程序为例,进行程序结构设计。



1,开发环境

     1,固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0

     2,编译器:ARMCC V5.06

     3,IDE:Keil uVision5

     4,操作系统:Windows 10 专业版



2,程序源码

      BUZZ.h文件

/** 

  ****************************************************************************** 

  * @file    BUZZ.h 

  * @author  XinLi 

  * @version v1.0 

  * @date    24-October-2017 

  * @brief   Header file for BUZZ.c module. 

  ****************************************************************************** 

  * @attention 

  * 

  *

Copyright © 2017 XinLi

 

  * 

  * This program is free software: you can redistribute it and/or modify 

  * it under the terms of the GNU General Public License as published by 

  * the Free Software Foundation, either version 3 of the License, or 

  * (at your option) any later version. 

  * 

  * This program is distributed in the hope that it will be useful, 

  * but WITHOUT ANY WARRANTY; without even the implied warranty of 

  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 

  * GNU General Public License for more details. 

  * 

  * You should have received a copy of the GNU General Public License 

  * along with this program.  If not, see

  * 

  ****************************************************************************** 

  */  

  

#ifndef __BUZZ_H  

#define __BUZZ_H  

  

#ifdef __cplusplus  

extern "C" {  

#endif  

  

/* Header includes -----------------------------------------------------------*/  

#include "stm32f4xx.h"  

  

/* Macro definitions ---------------------------------------------------------*/  

#define BUZZ_RCC_AHB1Periph_GPIO         RCC_AHB1Periph_GPIOB  

#define BUZZ_GPIO                        GPIOB  

#define BUZZ_GPIO_Pin                    GPIO_Pin_8  

  

#define BUZZ_GPIO_PinSource              GPIO_PinSource8  

#define BUZZ_GPIO_AF_TIM                 GPIO_AF_TIM4  

  

#define BUZZ_RCC_APB1Periph_TIM          RCC_APB1Periph_TIM4  

#define BUZZ_TIM                         TIM4  

  

#define BUZZ_TIM_Prescaler               (83)  /*!< Clock divided to 1MHz. */  

#define BUZZ_TIM_Period                  (249) /*!< 250us timer interrupt. */  

  

#define BUZZ_TIM_OCPolarity              TIM_OCPolarity_High  

  

#define BUZZ_TIM_OCInit                  TIM_OC3Init  

#define BUZZ_TIM_OCPreloadConfig         TIM_OC3PreloadConfig  

  

#define BUZZ_TIM_SetCompare              TIM_SetCompare3  

  

#define BUZZ_TIM_IRQn                    TIM4_IRQn  

#define BUZZ_TIM_IRQHandler              TIM4_IRQHandler  

#define BUZZ_TIM_IRQ_PreemptionPriority  (0)  

#define BUZZ_TIM_IRQ_SubPriority         (0)  

  

/* Type definitions ----------------------------------------------------------*/  

typedef enum  

{  

  BUZZ_Off     = 0,  

  BUZZ_Ring    = 1,  

  BUZZ_Drip    = 2,  

  BUZZ_Warning = 3,  

  BUZZ_Danger  = 4  

}BUZZ_Status;  

  

/* Variable declarations -----------------------------------------------------*/  

/* Variable definitions ------------------------------------------------------*/  

/* Function declarations -----------------------------------------------------*/  

void BUZZ_SetStatus(BUZZ_Status status);  

BUZZ_Status BUZZ_GetStatus(void);  

  

/* Function definitions ------------------------------------------------------*/  

  

#ifdef __cplusplus  

}  

#endif  

  

#endif /* __BUZZ_H */ 


      BUZZ.c文件

/** 

  ****************************************************************************** 

  * @file    BUZZ.c 

  * @author  XinLi 

  * @version v1.0 

  * @date    24-October-2017 

  * @brief   BUZZ module driver. 

  ****************************************************************************** 

  * @attention 

  * 

  *

Copyright © 2017 XinLi

 

  * 

  * This program is free software: you can redistribute it and/or modify 

  * it under the terms of the GNU General Public License as published by 

  * the Free Software Foundation, either version 3 of the License, or 

  * (at your option) any later version. 

  * 

  * This program is distributed in the hope that it will be useful, 

  * but WITHOUT ANY WARRANTY; without even the implied warranty of 

  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 

  * GNU General Public License for more details. 

  * 

  * You should have received a copy of the GNU General Public License 

  * along with this program.  If not, see

  * 

  ****************************************************************************** 

  */  

  

/* Header includes -----------------------------------------------------------*/  

#include "BUZZ.h"  

#include  

  

/* Macro definitions ---------------------------------------------------------*/  

/* Type definitions ----------------------------------------------------------*/  

/* Variable declarations -----------------------------------------------------*/  

/* Variable definitions ------------------------------------------------------*/  

static __IO BUZZ_Status buzzStatus = BUZZ_Off;  

static __IO int         buzzCount  = 0;  

  

/* Function declarations -----------------------------------------------------*/  

static void BUZZ_PwmInit(void);  

static void BUZZ_NvicInit(void);  

static void BUZZ_Init(void);  

  

/* Function definitions ------------------------------------------------------*/  

  

/** 

  * @brief  Buzz pwm initializes. 

  * @param  None. 

  * @return None. 

  */  

static void BUZZ_PwmInit(void)  

{  

  GPIO_InitTypeDef        GPIO_InitStructure    = {0};  

  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure = {0};  

  TIM_OCInitTypeDef       TIM_OCInitStructure   = {0};  

    

  RCC_AHB1PeriphClockCmd(BUZZ_RCC_AHB1Periph_GPIO, ENABLE);  

  RCC_APB1PeriphClockCmd(BUZZ_RCC_APB1Periph_TIM, ENABLE);  

    

  GPIO_InitStructure.GPIO_Pin   = BUZZ_GPIO_Pin;  

  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;  

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  

  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;  

  GPIO_Init(BUZZ_GPIO, &GPIO_InitStructure);  

    

  GPIO_PinAFConfig(BUZZ_GPIO, BUZZ_GPIO_PinSource, BUZZ_GPIO_AF_TIM);  

    

  TIM_TimeBaseStructure.TIM_Prescaler     = BUZZ_TIM_Prescaler;  

  TIM_TimeBaseStructure.TIM_CounterMode   = TIM_CounterMode_Up;  

  TIM_TimeBaseStructure.TIM_Period        = BUZZ_TIM_Period;  

  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  

  TIM_TimeBaseInit(BUZZ_TIM, &TIM_TimeBaseStructure);  

    

  TIM_OCInitStructure.TIM_OCMode      = TIM_OCMode_PWM1;  

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  

  TIM_OCInitStructure.TIM_Pulse       = 0;  

  TIM_OCInitStructure.TIM_OCPolarity  = BUZZ_TIM_OCPolarity;  

  BUZZ_TIM_OCInit(BUZZ_TIM, &TIM_OCInitStructure);  

    

  BUZZ_TIM_OCPreloadConfig(BUZZ_TIM, TIM_OCPreload_Enable);  

  TIM_ARRPreloadConfig(BUZZ_TIM, ENABLE);  

  TIM_ITConfig(BUZZ_TIM, TIM_IT_Update, ENABLE);  

  TIM_Cmd(BUZZ_TIM, ENABLE);  

}  

  

/** 

  * @brief  Buzz nvic initializes. 

  * @param  None. 

  * @return None. 

  */  

static void BUZZ_NvicInit(void)  

{  

  NVIC_InitTypeDef NVIC_InitStructure = {0};  

    

  NVIC_InitStructure.NVIC_IRQChannel                   = BUZZ_TIM_IRQn;  

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = BUZZ_TIM_IRQ_PreemptionPriority;  

  NVIC_InitStructure.NVIC_IRQChannelSubPriority        = BUZZ_TIM_IRQ_SubPriority;  

  NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;  

  NVIC_Init(&NVIC_InitStructure);  

}  

  

/** 

  * @brief  Buzz initializes. 

  * @param  None. 

  * @return None. 

  */  

static void BUZZ_Init(void)  

{  

  static bool init_flag = false;  

    

  if(init_flag == false)  

  {  

    init_flag = true;  

      

    BUZZ_PwmInit();  

    BUZZ_NvicInit();  

  }  

}  

  

/** 

  * @brief  Set buzz status. 

  * @param  [in] status: Buzz status. 

  * @return None. 

  */  

void BUZZ_SetStatus(BUZZ_Status status)  

{  

  if(status != buzzStatus)  

  {  

    buzzStatus = status;  

    buzzCount  = 0;  

    BUZZ_Init();  

  }  

}  

  

/** 

  * @brief  Get buzz status. 

  * @param  None. 

  * @return Buzz status. 

  */  

BUZZ_Status BUZZ_GetStatus(void)  

{  

  return buzzStatus;  

}  

  

/** 

  * @brief  This function handles TIM Handler. 

  * @param  None. 

  * @return None. 

  */  

void BUZZ_TIM_IRQHandler(void)  

{  

  if(TIM_GetITStatus(BUZZ_TIM, TIM_IT_Update) != RESET)  

  {  

    TIM_ClearITPendingBit(BUZZ_TIM, TIM_IT_Update);  

      

    if(buzzStatus == BUZZ_Off)  

    {  

      buzzCount = 0;  

      BUZZ_TIM_SetCompare(BUZZ_TIM, 0);  

    }  

    else if(buzzStatus == BUZZ_Ring)  

    {  

      buzzCount = 0;  

      BUZZ_TIM_SetCompare(BUZZ_TIM, (BUZZ_TIM_Period + 1) / 2);  

    }  

    else if(buzzStatus == BUZZ_Drip)  

    {  

      if(buzzCount > 1999)  

      {  

        if(buzzCount > 3999)  

        {  

          buzzCount  = 0;  

          buzzStatus = BUZZ_Off;  

          BUZZ_TIM_SetCompare(BUZZ_TIM, 0);  

        }  

        else  

        {  

          buzzCount++;  

          BUZZ_TIM_SetCompare(BUZZ_TIM, 0);  

        }  

      }  

      else  

      {  

        buzzCount++;  

        BUZZ_TIM_SetCompare(BUZZ_TIM, (BUZZ_TIM_Period + 1) / 2);  

      }  

    }  

    else if(buzzStatus == BUZZ_Warning)  

    {  

      if(buzzCount > 1999)  

      {  

        if(buzzCount > 3999)  

        {  

          buzzCount = 0;  

          BUZZ_TIM_SetCompare(BUZZ_TIM, (BUZZ_TIM_Period + 1) / 2);  

        }  

        else  

        {  

          buzzCount++;  

          BUZZ_TIM_SetCompare(BUZZ_TIM, 0);  

        }  

      }  

      else  

      {  

        buzzCount++;  

        BUZZ_TIM_SetCompare(BUZZ_TIM, (BUZZ_TIM_Period + 1) / 2);  

      }  

    }  

    else  

    {  

      if(buzzCount > 999)  

      {  

        if(buzzCount > 1999)  

        {  

          buzzCount = 0;  

          BUZZ_TIM_SetCompare(BUZZ_TIM, (BUZZ_TIM_Period + 1) / 2);  

        }  

        else  

        {  

          buzzCount++;  

          BUZZ_TIM_SetCompare(BUZZ_TIM, 0);  

        }  

      }  

      else  

      {  

        buzzCount++;  

        BUZZ_TIM_SetCompare(BUZZ_TIM, (BUZZ_TIM_Period + 1) / 2);  

      }  

    }  

  }  

}  


      main.c文件

/** 

  ****************************************************************************** 

  * @file    main.c 

  * @author  XinLi 

  * @version v1.0 

  * @date    24-October-2017 

  * @brief   Main program body. 

  ****************************************************************************** 

  * @attention 

  * 

  *

Copyright © 2017 XinLi

 

  * 

  * This program is free software: you can redistribute it and/or modify 

  * it under the terms of the GNU General Public License as published by 

  * the Free Software Foundation, either version 3 of the License, or 

  * (at your option) any later version. 

  * 

  * This program is distributed in the hope that it will be useful, 

  * but WITHOUT ANY WARRANTY; without even the implied warranty of 

  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 

  * GNU General Public License for more details. 

  * 

  * You should have received a copy of the GNU General Public License 

  * along with this program.  If not, see

  * 

  ****************************************************************************** 

  */  

  

/* Header includes -----------------------------------------------------------*/  

#include "main.h"  

#include "Delay.h"  

#include "BUZZ.h"  

  

/* Macro definitions ---------------------------------------------------------*/  

/* Type definitions ----------------------------------------------------------*/  

/* Variable declarations -----------------------------------------------------*/  

/* Variable definitions ------------------------------------------------------*/  

/* Function declarations -----------------------------------------------------*/  

/* Function definitions ------------------------------------------------------*/  

  

/** 

  * @brief  Main program. 

  * @param  None. 

  * @return None. 

  */  

int main(void)  

{  

  for(;;)  

  {  

    Delay_s(5);  

    BUZZ_SetStatus(BUZZ_Drip);  

    Delay_s(5);  

    BUZZ_SetStatus(BUZZ_Ring);  

    Delay_s(5);  

    BUZZ_SetStatus(BUZZ_Warning);  

    Delay_s(5);  

    BUZZ_SetStatus(BUZZ_Danger);  

    Delay_s(5);  

    BUZZ_SetStatus(BUZZ_Off);  

  }  

}  


3,注意

       修改接口需要注意,蜂鸣器的驱动方式和使用的TIM。对应修改PWM输出电平和TIM时钟配置函数。



推荐阅读

史海拾趣

富满电子(FM)公司的发展小趣事

在电子行业中,富满电子(FM)公司的发展历程充满了创新与挑战,以下是五个与其发展紧密相关的事实性故事:

1. 市场需求驱动下的产能扩张

2016年至2017年间,随着智能手机等智能终端设备的出货量达到历史峰值,市场对芯片的需求急剧增加。富满电子抓住这一市场机遇,积极扩产以满足需求。这一时期的产能扩张不仅提升了公司的市场份额,也为其后续的技术研发和产品线拓展奠定了坚实基础。然而,随着市场需求的回落和行业内竞争加剧,富满电子也面临着产能过剩和价格下滑的挑战,这迫使公司更加注重技术创新和市场细分,以提升竞争力。

2. LED芯片设计领域的突破

富满电子早期主要从事电源管理芯片的设计与生产,但受限于完全竞争的市场环境和欧美企业的技术垄断,公司在该领域的发展空间有限。为了寻找新的增长点,富满电子将目光投向了LED芯片设计领域。通过不断的技术研发和产品创新,富满电子成功推出了多款应用于显示屏和通用照明等中低端市场的LED芯片产品。尽管面临激烈的市场竞争,但富满电子凭借其高性价比的产品逐渐在市场中占据了一席之地。

3. 电源管理芯片的多元化布局

在电源管理芯片领域,富满电子不仅继续深耕传统市场,还前瞻性地布局了快充等新兴市场。公司推出的USBPD系列芯片在快充市场展现了良好的先发优势,并逐渐获得市场的认可。此外,富满电子还通过“协议芯片+MOS+ACDC”模块化解决方案的推出,进一步提升了其在电源管理芯片市场的竞争力。这一多元化布局不仅为公司带来了新的增长点,也增强了其在行业内的整体实力。

4. 射频业务的拓展与前瞻布局

为了应对5G时代的到来,富满电子在2020年设立了射频公司,并开始布局5G射频开关、射频滤波器等产品的研发与生产。这一举措不仅展现了公司在技术前瞻性和市场敏感度方面的优势,也为其在未来无线通信领域的竞争中赢得了先机。通过不断的技术积累和市场拓展,富满电子有望在5G射频领域实现新的突破和发展。

5. 应对市场质疑与财务稳健发展

近年来,富满电子也面临过一些市场质疑和负面消息的影响,如被举报做假账等。然而,公司始终坚持以事实为依据,通过法律手段积极回应并澄清相关指控。同时,富满电子在财务管理上也保持了稳健的态度,严格按照相关法律法规进行会计核算和财务信息披露。这些措施不仅维护了公司的声誉和形象,也为其在复杂多变的市场环境中保持稳健发展提供了有力保障。

Eurofarad公司的发展小趣事

Eurofarad始终将技术创新作为公司发展的核心动力。随着科技的不断进步,Eurofarad不断投入研发资源,推动电子元件技术的创新。公司成功研发出了一系列具有创新性的产品,如陶瓷电容器、塑料薄膜电容器、云母电容器等。这些产品不仅具有更高的性能和更长的使用寿命,而且更符合市场的需求,为Eurofarad赢得了更多的市场份额。

宝乘(baocheng)公司的发展小趣事

随着产品质量的提升和技术的不断创新,宝乘公司开始积极拓展市场。公司与多家知名企业建立了战略合作关系,共同推动半导体功率器件在LED照明、电源、消费类电子等多个领域的应用。同时,宝乘还积极参加国内外电子行业的展览和交流活动,与同行交流学习,不断提升自身的竞争力。

Bytesonic Corporation公司的发展小趣事

1984年,台湾的电子行业正迎来蓬勃发展的黄金时期。在这一年的10月,Bytesonic Corporation在台湾台北正式成立,标志着这家电子公司正式踏入竞争激烈的电子市场。初创时期,公司面临着资金短缺、技术匮乏等多重挑战,但凭借着创始人的远见卓识和团队的拼搏精神,公司逐渐在市场中站稳了脚跟。

Advanced Ceramic X Corporation公司的发展小趣事

1984年,台湾的电子行业正迎来蓬勃发展的黄金时期。在这一年的10月,Bytesonic Corporation在台湾台北正式成立,标志着这家电子公司正式踏入竞争激烈的电子市场。初创时期,公司面临着资金短缺、技术匮乏等多重挑战,但凭借着创始人的远见卓识和团队的拼搏精神,公司逐渐在市场中站稳了脚跟。

BELDEN公司的发展小趣事

作为一家拥有百年历史的电子企业,BELDEN公司始终保持着持续创新和可持续发展的理念。公司不断投入研发资金,加强技术研发和创新能力,推出了一系列具有自主知识产权的新产品和技术。同时,公司还注重环保和可持续发展,积极采用环保材料和生产工艺,致力于降低生产过程中的能耗和排放。这些举措不仅提升了公司的竞争力和市场份额,还为公司的长期发展奠定了坚实的基础。

这五个故事从不同角度展示了BELDEN公司在电子行业中的发展历程和成就,体现了公司不断创新、追求卓越的精神。这些事实性的描述旨在客观呈现BELDEN公司的历史与现状,不含任何褒贬之意。

问答坊 | AI 解惑

MSP430的TI官方C例程

MSP430x13x,14x,15x,16x TI官方C源程序例程 给要用到的人共享吧!!!…

查看全部问答>

各种功放电路集锦

本帖最后由 paulhyde 于 2014-9-15 03:27 编辑 包括30W-100W功放电路和电子二分频功放电路设计及说明~~~~~  …

查看全部问答>

谁有关于投影机软件开发的资料?DDP2230之类

哪位大哥有关于投影机软件开发的资料?TI有个DDP2230的芯片,有谁了解?…

查看全部问答>

关于ARM的IIC串行通信的几个问题!请高手解答 急~~~

程序的主要目的是将0~0xff这256个数按顺序写入到EEPROM(AT24C16)的内部存储单元中,然后再依次将他们读出,并通过实验室板的串口UART0输出到PC机上运行的超级终端上。 程序如下: #include #include \"2410addr.h\" #include \"2410lib.h\" ...…

查看全部问答>

格式化NandFlash

通过FormatVolumeEx,以FAT32格式化NandFlash后,从SD卡复制文件到格式化的分区中。但是最后对注册表的写操作,在关机重启之前,都存在。一旦关机重启,注册表写操作的数据全部丢失,不知为什么?…

查看全部问答>

谁能帮忙从 pudn 上下载几个程序发到我的邮箱里,谢谢

一个内存驱动器的源代码 http://www.pudn.com/downloads/sourcecode/windows/vxd/detail1558.html 虚拟串口用VC编译 http://www.pudn.com/downloads170/sourcecode/windows/vxd/detail788464.html 8139网卡驱动源码 http://www.pudn.co ...…

查看全部问答>

大家进来讨论下TTL,CMOS,NMOS电路的区别以及应用

大家进来讨论下TTL,CMOS,NMOS电路的区别以及应用…

查看全部问答>

单片机C程序中如何传递32位的参数

单片机C程序的变量都是8位的,现在想传递一个32位或24位的变量参数,怎么传啊? 用指针?还是结构? 麻烦写个简单的程序,如A函数调用B函数传参数。…

查看全部问答>

请教:对ti串口转网口套件重新下载bootloader后产生的问题

对ti串口转网口套件重新下载自己改的bootloader后,再也连不上该套件,也无法重新下载了,哪位知道如何解决呀,谢谢:(…

查看全部问答>