/************************* 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;
}