分享一个feisi的DA音频驱动示例代码。

2020-02-20 21:00发布

本帖最后由 FSL_TICS_Robin 于 2014-11-27 10:24 编辑

///  ¶¨Ê±Æ÷1³õʼ»¯,µ¥Î»£ºus
void PIT1_Init(uint8_t pit,uint32_t time)
{         
        GetProcessorInfo();  //¼ÆËãϵͳʱÖÓ
        time=time*(PInfo.BusClock/1000000);
        //¿ªÊ¼¶¨Ê±Æ÷ÅäÖÃ
        SIM->SCGC6|=SIM_SCGC6_PIT_MASK;//¿ªÆôpitÄ£¿éʱÖÓ£¬¼û²Î¿¼ÊÖ²á269Ò³
        PIT->MCR&=~PIT_MCR_MDIS_MASK;   //¿ªÆôpitÄ£¿é£¬¼û²Î¿¼ÊÖ²á974Ò³
        PIT->MCR|=PIT_MCR_FRZ_MASK;   //¿ªÆôpitÄ£¿é£¬¼û²Î¿¼ÊÖ²á974Ò³
        PIT->CHANNEL[pit].LDVAL=(uint32_t)time;//ÉèÖÃÑÓʱʱ¼ä£¬¼û²Î¿¼ÊÖ²á975Ò³

        DA_COUNT=0;
        //¿ªÆôÄں˽ÓÊÜÖжÏ
        switch(pit)
        {                                       

                case 1:
                        NVIC_EnableIRQ(PIT1_IRQn);
                        break;   

        }
        PIT->CHANNEL[pit].TFLG  |=PIT_TFLG_TIF_MASK;//Çå³ý±ê־λ
        PIT->CHANNEL[pit].TCTRL |=(PIT_TCTRL_TEN_MASK|PIT_TCTRL_TIE_MASK);//¿ªÆô¶¨Ê±Æ÷¼°Öжϣ¬¼û²Î¿¼ÊÖ²á976Ò³
}

//º¯ÊýÃû£ºDAC_Init
//˵  Ã÷£º´Ëº¯ÊýÊǽ«dacÄ£¿é½øÐгõʼ»¯ÅäÖÃ
//ûÓпªÆô»º´æ¼°dma¹¦ÄÜ
/********************************************************************************/       
void DAC_Init(void)
{
        SIM->SCGC2|=SIM_SCGC2_DAC0_MASK;   //¿ªÆôdacÄ£¿éʱÖÓ£¬¼û²Î¿¼ÊÖ²á263Ò³
        DAC0->C0|=DAC_C0_DACRFS_MASK;  //ÅäÖòο¼µçѹԴΪ2ºÅ£¬¼û²Î¿¼ÊÖ²á798Ò³
        DAC0->C0|=DAC_C0_DACEN_MASK ;  //¿ªÆôdacÄ£¿é£¬¼û²Î¿¼ÊÖ²á798Ò³
       
}
上面是DA初始化和定时器初始化
void PIT1_IRQHandler(void)
{ uint16   da;  
        PIT->CHANNEL[1].TFLG|=PIT_TFLG_TIF_MASK;//Çå±ê־λ

PIT->CHANNEL[1].LDVAL=Sound_TONE;///*18;       

if (Sound_OFF==0)
{
da=s_sin[DA_COUNT];
DA_COUNT++;
if (DA_COUNT>=12) DA_COUNT=0;
}
else //Sound_OFF=1
{
da=512;
}

if (Sound_OFF==0)
{
//LPC_DAC->DACR = (da << 6) | DAC_BIAS;               
DAC0->DAT[0].DATL=((da>>0)&0x00FF);
DAC0->DAT[0].DATH=((da>>8)&0x00FF);
}

  //Your Code
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
Hearthbeats
1楼-- · 2020-02-21 21:36
编码问题导致的,编译器跟浏览器支持的不一样,
jiki119
2楼-- · 2020-02-22 01:05
u16     f_step;

///  定时器1初始化,单位:us
void PIT1_Init(uint8_t pit,uint32_t time)
{         
        GetProcessorInfo();  //计算系统时钟
        time=time*(PInfo.BusClock/1000000);
        //开始定时器配置
        SIM->SCGC6|=SIM_SCGC6_PIT_MASK;//开启pit模块时钟,见参考手册269页
        PIT->MCR&=~PIT_MCR_MDIS_MASK;   //开启pit模块,见参考手册974页
        PIT->MCR|=PIT_MCR_FRZ_MASK;   //开启pit模块,见参考手册974页
        PIT->CHANNEL[pit].LDVAL=(uint32_t)time;//设置延时时间,见参考手册975页

        DA_COUNT=0;
        //开启内核接受中断
        switch(pit)
        {                                       

                case 1:
                        NVIC_EnableIRQ(PIT1_IRQn);
                        break;   

        }
        PIT->CHANNEL[pit].TFLG  |=PIT_TFLG_TIF_MASK;//清除标志位
        PIT->CHANNEL[pit].TCTRL |=(PIT_TCTRL_TEN_MASK|PIT_TCTRL_TIE_MASK);//开启定时器及中断,见参考手册976页
}

//函数名:DAC_Init
//说  明:此函数是将dac模块进行初始化配置
//没有开启缓存及dma功能
/********************************************************************************/       
void DAC_Init(void)
{
        SIM->SCGC2|=SIM_SCGC2_DAC0_MASK;   //开启dac模块时钟,见参考手册263页
        DAC0->C0|=DAC_C0_DACRFS_MASK;  //配置参考电压源为2号,见参考手册798页
        DAC0->C0|=DAC_C0_DACEN_MASK ;  //开启dac模块,见参考手册798页
       
}

//开启前初始化以上2个模块 :DAC_Init();        PIT1_Init();

                 //函数名:PIT1_IRQHandler
//功  能:PIT中断通道1
//2011.8.26改为方波输出,减少了功耗,芯片不再发热!

void PIT1_IRQHandler(void)
{ uint16   da;  
        PIT->CHANNEL[1].TFLG|=PIT_TFLG_TIF_MASK;//清标志位

PIT->CHANNEL[1].LDVAL=Sound_TONE;///*18;       

if (Sound_OFF==0)
{
da=s_sin[DA_COUNT];
DA_COUNT++;
if (DA_COUNT>=12) DA_COUNT=0;
}
else //Sound_OFF=1
{
da=512;
}

if (Sound_OFF==0)
{
//LPC_DAC->DACR = (da << 6) | DAC_BIAS;               
DAC0->DAT[0].DATL=((da>>0)&0x00FF);
DAC0->DAT[0].DATH=((da>>8)&0x00FF);
}

  //Your Code
}
maimaige
3楼-- · 2020-02-22 05:01
 精彩回答 2  元偷偷看……
tim
4楼-- · 2020-02-22 08:04
jiki119 发表于 2014-10-10 16:17
u16     f_step;

///  定时器1初始化,单位:us

这个没问题了

一周热门 更多>