原创 【MG32F02A132评测】设置 Timer00 控制语音芯片

2020-10-20 16:27 5404 11 11 分类: MCU/ 嵌入式 文集: MG32F02A132评测

一、语音芯片控制

我们今天控制的是 WT588S,是一颗单线 I/O 控制的语音芯片,控制时序如下图所示:

 

所以可以用一个 I/O 加上 Timer 来做控制。200us600us2ms5ms,都可以通过延时来实现,我们采用 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

我们想要做到200us600us2ms5ms的延时,需要配置延时函数为100us 即可,因此,我们通过配置TM_Prescaler分频100,得到120KHz

通过配置计数周期TM_Period12,得到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条评论)

登录后参与讨论
我要评论
0
11
关闭 站长推荐上一条 /2 下一条