[DemoCode下载] M451定时器触发输出正弦波

[复制链接]
1221|1
 楼主| antusheng 发表于 2018-5-12 23:12 | 显示全部楼层 |阅读模式
  1. /************************* Copyright (c) 2014 SmartMcu Team *****************************
  2. *项目名称:DAC 输出正弦波-定时器触发模式

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

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

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

  16. /*-------------------------------------------------------*/
  17. /*                        函数                           */
  18. /*-------------------------------------------------------*/

  19. /****************************************
  20. *函数名称:main
  21. *输    入:无
  22. *输    出:无
  23. *功    能:函数主体
  24. ******************************************/
  25. int32_t main(void)
  26. {

  27.                 PROTECT_REG
  28.                 (
  29.                         /* 系统时钟初始化 */
  30.                         SYS_Init(PLL_CLOCK);
  31.                
  32.                         /* 使能 DAC 模块时钟 */
  33.                         CLK_EnableModuleClock(DAC_MODULE);

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

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

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

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

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

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

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

  56.     /* 使能 DAC 中断 */
  57.     DAC_ENABLE_INT(DAC, 0);
  58.     NVIC_EnableIRQ(DAC_IRQn);

  59.     /* 使能定时器即启动DAC转换 */
  60.     TIMER_Start(TIMER0);
  61.                 /* 串口0初始化 */
  62.                 UART0_Init(115200);       
  63.        
  64.        
  65.                 printf("+----------------------------------------------------------------------+\n");
  66.                 printf("|                      DAC software trigger test                       |\n");
  67.                 printf("+----------------------------------------------------------------------+\n");
  68.        
  69.        
  70.     while(1)
  71.     {
  72.         /* Start A/D conversion */
  73.         DAC_START_CONV(DAC);

  74.         if((DEBUG_PORT->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) != 0)
  75.             continue;
  76.         else
  77.             break;
  78.     }
  79. }


  80. /*-------------------------------------------------------*/
  81. /*                    中断服务函数                       */
  82. /*-------------------------------------------------------*/
  83. /****************************************
  84. *函数名称:DAC_IRQHandler
  85. *输    入:无
  86. *输    出:无
  87. *功    能:函数主体
  88. ******************************************/
  89. VOID DAC_IRQHandler(VOID)
  90. {
  91.     if(DAC_GET_INT_FLAG(DAC, 0))
  92.     {

  93.         if(index == array_size)
  94.             index = 0;
  95.         else
  96.         {
  97.             DAC_WRITE_DATA(DAC, 0, sine[index++]);

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

  100.         }
  101.     }
  102.     return;
  103. }





 楼主| antusheng 发表于 2018-5-12 23:16 | 显示全部楼层
DAC是数字世界输出到模拟设计的一种手段。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

86

主题

1521

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部