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