資源簡介
類型:接口文檔及源碼
文件:
music.c music,h sys.h sys.c delay,c delay,h
接口使用說明:
stm32蜂鳴器播放音頻(純音樂)
原理:定時器PWM輸出到蜂鳴器,通過改變定時器重裝值,改變頻率,從而改變音頻,我采用stm32F407zet6,蜂鳴器接在PA8,如果你的不是在TIM_Beep_Control_Init()改io
使用實例:
int main(void)
{
TIM_Beep_Control_Init();
Play_Music(music);//music表示音樂表數組
}

代碼片段和文件信息
#include?“delay.h“
#include?“sys.h“
//////////////////////////////////////////////////////////////////////////////////? ?
//如果使用OS則包括下面的頭文件(以ucos為例)即可.
#if?SYSTEM_SUPPORT_OS
#include?“includes.h“ //支持OS時,使用 ??
#endif
static?u8??fac_us=0; //us延時倍乘數 ???
static?u16?fac_ms=0; //ms延時倍乘數在os下代表每個節拍的ms數
#if?SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS定義了說明要支持OS了(不限于UCOS).
//當delay_us/delay_ms需要支持OS的時候需要三個與OS相關的宏定義和函數來支持
//首先是3個宏定義:
//????delay_osrunning:用于表示OS當前是否正在運行以決定是否可以使用相關函數
//delay_ostickspersec:用于表示OS設定的時鐘節拍delay_init將根據這個參數來初始哈systick
//?delay_osintnesting:用于表示OS中斷嵌套級別因為中斷里面不可以調度delay_ms使用該參數來決定如何運行
//然后是3個函數:
//??delay_osschedlock:用于鎖定OS任務調度禁止調度
//delay_osschedunlock:用于解鎖OS任務調度重新開啟調度
//????delay_ostimedly:用于OS延時可以引起任務調度.
//本例程僅作UCOSII和UCOSIII的支持其他OS請自行參考著移植
//支持UCOSII
#ifdef? OS_CRITICAL_METHOD //OS_CRITICAL_METHOD定義了說明要支持UCOSII
#define?delay_osrunning OSRunning //OS是否運行標記0不運行;1在運行
#define?delay_ostickspersec OS_TICKS_PER_SEC //OS時鐘節拍即每秒調度次數
#define?delay_osintnesting? OSIntNesting //中斷嵌套級別即中斷嵌套次數
#endif
//支持UCOSIII
#ifdef? CPU_CFG_CRITICAL_METHOD //CPU_CFG_CRITICAL_METHOD定義了說明要支持UCOSIII
#define?delay_osrunning OSRunning //OS是否運行標記0不運行;1在運行
#define?delay_ostickspersec OSCfg_TickRate_Hz //OS時鐘節拍即每秒調度次數
#define?delay_osintnesting? OSIntNestingCtr //中斷嵌套級別即中斷嵌套次數
#endif
//us級延時時關閉任務調度(防止打斷us級延遲)
void?delay_osschedlock(void)
{
#ifdef?CPU_CFG_CRITICAL_METHOD??? //使用UCOSIII
OS_ERR?err;?
OSSchedLock(&err); //UCOSIII的方式禁止調度,防止打斷us延時
#else //否則UCOSII
OSSchedLock(); //UCOSII的方式禁止調度,防止打斷us延時
#endif
}
//us級延時時恢復任務調度
void?delay_osschedunlock(void)
{
#ifdef?CPU_CFG_CRITICAL_METHOD??? //使用UCOSIII
OS_ERR?err;?
OSSchedUnlock(&err); //UCOSIII的方式恢復調度
#else //否則UCOSII
OSSchedUnlock(); //UCOSII的方式恢復調度
#endif
}
//調用OS自帶的延時函數延時
//ticks:延時的節拍數
void?delay_ostimedly(u32?ticks)
{
#ifdef?CPU_CFG_CRITICAL_METHOD
OS_ERR?err;?
OSTimeDly(ticksOS_OPT_TIME_PERIODIC&err);//UCOSIII延時采用周期模式
#else
OSTimeDly(ticks); //UCOSII延時
#endif?
}
?
//systick中斷服務函數使用OS時用到
void?SysTick_Handler(void)
{
if(delay_osrunning==1) //OS開始跑了才執行正常的調度處理
{
OSIntEnter(); //進入中斷
OSTimeTick();??????? //調用ucos的時鐘服務程序???????????????
OSIntExit();??????? ? //觸發任務切換軟中斷
}
}
#endif
???
//初始化延遲函數
//當使用OS的時候此函數會初始化OS的時鐘節拍
//SYSTICK的時鐘固定為AHB時鐘的1/8
//SYSCLK:系統時鐘頻率
void?delay_init(u8?SYSCLK)
{
#if?SYSTEM_SUPPORT_OS? //如果需要支持OS.
u32?reload;
#endif
? SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);?
fac_us=SYSCLK/8; //不論是否使用OSfac_us都需要使用
#if?SYSTEM_SUPPORT_OS? //如果需要支持OS.
reload=SYSCLK/8; //每秒鐘的計數次數?單位為M ???
reload*=1000000/delay_ostickspersec; //根據delay_ostickspersec設定溢出時間
//reload為24位寄存器最大值:16777216在168M下約合0.7989s左右
fac_ms=1000/delay_ostickspersec; //代表OS可以延時的最少單位 ???
SysTick->CTRL|=SysTick_CTRL_TICKINT_Ms
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????7046??2019-02-05?18:54??MUSIC\delay.c
?????文件????????267??2019-02-05?17:47??MUSIC\delay.h
?????文件???????2829??2019-02-11?18:17??MUSIC\music.c
?????文件???????2672??2019-02-11?18:18??MUSIC\music.h
?????文件????????468??2019-02-05?17:47??MUSIC\sys.c
?????文件???????2882??2019-02-05?17:47??MUSIC\sys.h
?????目錄??????????0??2019-02-11?18:18??MUSIC
-----------?---------??----------?-----??----
????????????????16164????????????????????7
- 上一篇:myeclipse10綠色版百度云資源.txt
- 下一篇:VS各版本軟件及激活工具
評論
共有 條評論