打印
[DemoCode下载]

M451定时器触发输出正弦波

[复制链接]
1058|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
antusheng|  楼主 | 2018-5-12 23:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/************************* Copyright (c) 2014 SmartMcu Team *****************************
*项目名称:DAC 输出正弦波-定时器触发模式

****************************************************************************************/
#include "SmartM_M4.h"

/*-------------------------------------------------------*/
/*                     全局变量                          */
/*-------------------------------------------------------*/
CONST UINT16 sine[] = {  2047, 2251, 2453, 2651, 2844, 3028, 3202, 3365, 3515, 3650, 3769, 3871, 3954,
                         4019, 4064, 4088, 4095, 4076, 4040, 3984, 3908, 3813, 3701, 3573, 3429, 3272,
                         3102, 2921, 2732, 2536, 2335, 2132, 1927, 1724, 1523, 1328, 1141,  962,  794,
                         639,  497,  371,  262,  171,   99,   45,   12,    0,    7,   35,   84,  151,
                         238,  343,  465,  602,  754,  919, 1095, 1281, 1475, 1674, 1876
                        };

STATIC UINT32 index = 0;
STATIC UINT32 array_size = sizeof(sine) / sizeof(uint16_t);

/*-------------------------------------------------------*/
/*                        函数                           */
/*-------------------------------------------------------*/

/****************************************
*函数名称:main
*输    入:无
*输    出:无
*功    能:函数主体
******************************************/
int32_t main(void)
{

                PROTECT_REG
                (
                        /* 系统时钟初始化 */
                        SYS_Init(PLL_CLOCK);
               
                        /* 使能 DAC 模块时钟 */
                        CLK_EnableModuleClock(DAC_MODULE);

                        /* 使能 PWM0 模块时钟 */
                        CLK_EnableModuleClock(PWM0_MODULE);

                        /* 选择 PWM0 模块时钟源为PCLK0 */
                        CLK_SetModuleClock(PWM0_MODULE, CLK_CLKSEL2_PWM0SEL_PCLK0, 0);       
               
                        /* 设置 PB0引脚为DAC电压输出 */
                        SYS->GPB_MFPL &= ~SYS_GPB_MFPL_PB0MFP_Msk;
                        SYS->GPB_MFPL |= SYS_GPB_MFPL_PB0MFP_DAC;       
       
                        /* 当使用外部12MHz晶振时,设置定时器0超时为10us,120/12000000=10us */
                        TIMER_SET_CMP_VALUE(TIMER0, 120);

                        /* 启动定时器定时计数模式同时使能定时中断触发DAC */
                        TIMER0->CTL = TIMER_PERIODIC_MODE | TIMER_CTL_TRGDAC_Msk;       

                )
                /* 设置DAC由定时器0触发,并使能DAC */
    DAC_Open(DAC, 0, DAC_TIMER0_TRIGGER);

    /* 设置DAC转换的时间为8us */
    DAC_SetDelayTime(DAC, 8);

    /* 设置DAC数据精度为12bit */
    DAC_WRITE_DATA(DAC, 0, sine[index]);

    /* 清除DAC转换完成标志位 */
    DAC_CLR_INT_FLAG(DAC, 0);

    /* 使能 DAC 中断 */
    DAC_ENABLE_INT(DAC, 0);
    NVIC_EnableIRQ(DAC_IRQn);

    /* 使能定时器即启动DAC转换 */
    TIMER_Start(TIMER0);
                /* 串口0初始化 */
                UART0_Init(115200);       
       
       
                printf("+----------------------------------------------------------------------+\n");
                printf("|                      DAC software trigger test                       |\n");
                printf("+----------------------------------------------------------------------+\n");
       
       
    while(1)
    {
        /* Start A/D conversion */
        DAC_START_CONV(DAC);

        if((DEBUG_PORT->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) != 0)
            continue;
        else
            break;
    }
}


/*-------------------------------------------------------*/
/*                    中断服务函数                       */
/*-------------------------------------------------------*/
/****************************************
*函数名称:DAC_IRQHandler
*输    入:无
*输    出:无
*功    能:函数主体
******************************************/
VOID DAC_IRQHandler(VOID)
{
    if(DAC_GET_INT_FLAG(DAC, 0))
    {

        if(index == array_size)
            index = 0;
        else
        {
            DAC_WRITE_DATA(DAC, 0, sine[index++]);

            /* Clear the DAC conversion complete finish flag */
            DAC_CLR_INT_FLAG(DAC, 0);

        }
    }
    return;
}





沙发
antusheng|  楼主 | 2018-5-12 23:16 | 只看该作者
DAC是数字世界输出到模拟设计的一种手段。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

83

主题

1450

帖子

5

粉丝