一、语音芯片控制
我们今天控制的是 WT588S,是一颗单线 I/O 控制的语音芯片,控制时序如下图所示:
所以可以用一个 I/O 加上 Timer 来做控制。200us、600us、2ms、5ms,都可以通过延时来实现,我们采用 Timer00 来实现。
二、Timer00 配置
根据手册描述,TM0x 有 1 个 8 位预分频器的 8 位定时器/计数器,通过
CSC_PeriphProcessClockSource_Config(CSC_TM00_CKS, CK_APB);
把 Timer00 的时钟源设置在 APB 上
由于板子外接晶振是空贴,所以只能选择内部时钟,通过
CSC_CK_APB_Divider_Select(APB_DIV_1); 设置 APB 为主时钟
通过CSC_CK_MAIN_Select(MAIN_CK_HS); 设置主时钟挂在 CK_HS 上;
通过CSC_IHRCO_Select(IHRCO_12MHz); 设置CK_HS 为12MHz。
这样, Timer00 的时钟就配置为 12MHz。
我们想要做到200us、600us、2ms、5ms的延时,需要配置延时函数为100us 即可,因此,我们通过配置TM_Prescaler分频100,得到120KHz;
通过配置计数周期TM_Period为12,得到100us。
三、GPIO配置
然后我们配置
PINX_InitStruct.PINX_Mode = PINX_Mode_PushPull_O; // Pin 设置推挽输出
PINX_InitStruct.PINX_PUResistant = PINX_PUResistant_Enable; // 使能上拉电阻
PINX_InitStruct.PINX_Speed = PINX_Speed_Low; //低速模式
PINX_InitStruct.PINX_OUTDrive = PINX_OUTDrive_Level0; // Pin输出最大
PINX_InitStruct.PINX_Alternate_Function = 0; // 功能复用选择GPIO模式
GPIO_PinMode_Config(PINE(15),&PINX_InitStruct); // PE15作为输出脚
这里很特别的是每个 I/O 可以像 51 单片机一样直接控制,比如PE15=0,那么就是输出低电平,非常方便,大大的赞一个,赞赞赞。
四、波形及连接图
五、控制源码:
void voice_onelinecmd(uint8_t voice_cmd)
{
uint8_t i;
uint8_t VOICE_DATA;
uint8_t temp_num = 0;
uint16_t temp_data1, temp_data2;
temp_data1 = voice_cmd;
temp_data2 = temp_data1&0x00ff;
temp_data1>>=8;
temp_data2<<=8;
temp_data1|=temp_data2;
temp_num = 16;
PE15=0;
delay_100us(50);
VOICE_DATA = temp_data1&0x0001;
for(i=0;i
{
if(i==8)
{
PE15=1;
delay_100us(20);
PE15=0;
delay_100us(50);
}
PE15=1;
if(VOICE_DATA == 0)
{
delay_100us(2);
PE15=0;
delay_100us(6);
}
else
{
delay_100us(6);
PE15=0;
delay_100us(2);
}
temp_data1 = temp_data1>>1;
VOICE_DATA=temp_data1&0x0001;
}
}
作者: smallsystem, 来源:面包板社区
链接: https://mbb.eet-china.com/blog/uid-me-3929083.html
版权声明:本文为博主原创,未经本人允许,禁止转载!
文章评论(0条评论)
登录后参与讨论