📄 pwm.c
字号:
#include "deftype.h"
#include "config.h"
union valchg
{
U32 buf32;
U16 buf16[2];
U8 buf8[4];
}val;
unsigned int val_souceaddr;
unsigned int val_souceLen;
unsigned int val_soucecnt;
U8 adjust_val; //调节音量
U8 val_flag;
#define SOUNDRING_OFFSET0 0
#define SOUNDRING_OFFSET1 0x23000
//#define TESTSOUND_OFFSET 0x64000 //数据区 //test
extern void FlashRead(unsigned int ReadStart, unsigned short *DataPtr, unsigned int Size); //size 表示要读出的字节长
extern void Int_PWM(void);
extern void Uart_Printf(char *fmt,...);
extern void setbuzkey(uint8 buz_set);
/************************************************************************************
*** 函 数 名: U8 adjust_sound(U8 sound_val)
*** 功能描述: 调节声音函数
*** 全局变量:
*** 参 数: 输入: U8 sound_val
*** 输出:
*** 功能模块:
*** 返 回 值: 无
*** 模块信息:
************************************************************************************/
U8 adjust_sound(U8 sound_val)
{
U16 i;
U8 j;
if(sound_val>=0x80)
{
i = (sound_val - 0x80) * adjust_val; //调节音量
i = i/10;
if(i>=0x80) i = 0x7f;
j = 0x80 + (U8)i;
}
else
{
i = (0x80 - sound_val) * adjust_val; //调节音量
i = i/10;
if(i>=0x80) i = 0x7f;
j = 0x80 - (U8)i;
}
return j;
}
/************************************************************************************
*** 函 数 名: void __irq PWM5_IRQ(void)
*** 功能描述: pwm发音中断函数
*** 全局变量:
*** 参 数: 输入: 无
*** 输出:
*** 功能模块:
*** 返 回 值: 无
*** 模块信息:
************************************************************************************/
void __irq PWM5_IRQ(void)
{
if(val_soucecnt < val_souceLen)
{
if(val_flag == 0)
{
FlashRead(val_souceaddr, &val.buf16[0], 2);
val_souceaddr+=2;
val_soucecnt ++; //计数
val_flag = 1;
PWMMR5 = adjust_sound(val.buf8[0]);
// PWMLER = 0x21; // PWMMR0、PWMMR5锁存
PWMLER = 0x20; //PWMMR5锁存
}
else
{
val_soucecnt ++; //计数
val_flag = 0;
PWMMR5 = adjust_sound(val.buf8[1]);
// PWMLER = 0x21; // PWMMR0、PWMMR5锁存
PWMLER = 0x20; //PWMMR5锁存
}
}
else
{
// Uart_Printf("val_souceaddr = %04x ",val_souceaddr);//test
val_flag = 0;
PWMTCR = 0x02; //PWM使能,停止PWM定时器
Int_PWM(); //pwm初始化成按键模式
}
PWMIR = 0x01;
VICVectAddr = 0; // 向量中断结束
}
/************************************************************************************
*** 函 数 名: void InitBUZPWM(U8 sound_id,U8 adj_val)
*** 功能描述: //初始化pwm发音
*** 全局变量:
*** 调用函数:
*** 参 数: 输入: 无
*** 输出:
*** 功能模块:
*** 返 回 值: 无
*** 模块信息:
************************************************************************************/
void InitBUZPWM(U8 sound_id,U8 adj_val)
{
//PWMPR = 0;//PWM预分频计数器设为0,则PWMTC每1个pclk周期加1 pclk=27648000HZ
PINSEL1 = (PINSEL1&0xfffff3ff)|0x00000400;//BUZ设置为PWM5 //设置P0.21为
PWMPCR = (PWMPCR&0xffffffdf)|0x00002000;//使能PWM5,模式为单边沿控制
PWMLER = 0;
PWMPR = 4;//27; // 分频,计数频率为Fpclk 1us
PWMMCR = 0x0003; //当PWMMR5匹配时产生中断,当PWMMR0匹配时复位PWM定时器
PWMMR0 = 255; //补尝 //255 8k
adjust_val = adj_val; //调节音量值
if(sound_id == 0) //id号为0 放铃声
{
val_souceaddr = SOUNDRING_OFFSET0;
}
else if(sound_id == 1)
{
val_souceaddr = SOUNDRING_OFFSET1;
}
else //留给以后用
{
val_souceaddr = SOUNDRING_OFFSET0;
}
FlashRead(val_souceaddr, &val.buf16[0], 4); //读取声音长度
val_souceLen = val.buf32; //声音长度放在pwm起始地址的前4个字节
// Uart_Printf("val_souceLen = %04x ",val_souceLen);//test
//Uart_Printf("adjust_val = %02x ",adjust_val);//test
val_soucecnt = 0;
val_souceaddr+=4;
val_flag = 1;
FlashRead(val_souceaddr, &val.buf16[0], 2);
val_souceaddr+=2;
val_soucecnt ++;
PWMMR5 = adjust_sound(val.buf8[0]); //声音初始值
PWMLER = 0x21; // PWMMR0、PWMMR5锁存
VICIntSelect &= 0xfffffeff; //设置IRQ中断
//VICIntSelect |= 0x00000100; //设置FIQ中断
VICVectCntl8 = 0x28;
VICVectAddr8 = (uint32)PWM5_IRQ;//设置中断服务程序地址
VICIntEnable |= 1<<8; // 使能PWM中断
PWMTCR = 0x09; //PWM使能,启动PWM定时器
}
/************************************************************************************
*** 函 数 名: void Start_PWM_Sound(U8 Sound_ID,U8 Adjust_Val)
*** 功能描述: pwm发音主函数
*** 全局变量:
*** 参 数: 输入: U8 Sound_ID
U8 Adjust_Val
*** 输出:
*** 功能模块: 根据ID号放出不同的声音
Sound_ID == 0时,放铃声
根据Adjust_Val调节音量
Adjust_Val == 0时, 没声音
Adjust_Val == 10时, 原声音(没有放大,也没缩小)
Adjust_Val > 10时,声音放大
Adjust_Val < 10时, 声音缩小
*** 返 回 值:
*** 模块信息:
************************************************************************************/
void Start_PWM_Sound(U8 Sound_ID,U8 Adjust_Val)
{
U8 temp;
if(Adjust_Val>100) temp = 100; //防止调节过大
else temp = Adjust_Val;
setbuzkey(1); //开启按键
InitBUZPWM(Sound_ID,temp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -