[demo程序] NV32F101x-硬件触发ADC转换(FIFO模式)

[复制链接]
 楼主| 詹求实 发表于 2020-5-28 10:27 | 显示全部楼层 |阅读模式
/********************************************************************************
*
* 实验名称:硬件触发ADC转换(FIFO模式)
* 实验平台:NV32开发板
* 板载芯片:NV32F101FL64E
* 实验效果: 设定FIFO深度,初始化ADC模块,ADC开始采集数据放入FIFO中,FIFO满
                                                        后等待硬件触发信号。
                                                        1:单次转换模式,当ADC检测到第一个硬件触发信号后,开始转换FIFO
                                                                        中第一个数据,检测到第二个硬件触发信号后,开始
                                                                                                                        转换FIFO中第2个数据,以此类推直到FIFO中的数据全部
                                                                                                                        转换完,然后触发ADC中断读取转换结果。当转换完成后,
                                                                                                                        如果出现新的触发脉冲,将生产新的转换集合。
                                                                                                                        例:当FIFO深度设定为3时,ADC要检测到三个硬件触发信号
                                                                                                                        才能将FIFO中的数据全部转换完成,然后产生中断。
                                                        2:多次转换模式,当ADC检测到第一个硬件触发信号后,开始触发ADC多次转换,依次转换FIFO通道中
                                                                        的数据,直到FIFO中所有数据全部转换完成。然后触发ADC中断读取
                                                                                                                        转换结果,当转换完成后,如果出现新的触发脉冲,将生产新的转换
                                                                                                                        集合
***********************************************************************************/

 楼主| 詹求实 发表于 2020-5-28 10:28 | 显示全部楼层
  1. #include "common.h"
  2. #include "ics.h"
  3. #include "sim.h"
  4. #include "rtc.h"
  5. #include "pit.h"
  6. #include "uart.h"
  7. #include "adc.h"
  8. #include "etm.h"
  9. #include "sysinit.h"

  10. uint16_t u16ADC_ConversionBuff[16];
  11. uint16_t u16ADC_ConversionCount = 0;
  12. volatile uint8_t  u8ADC_ConversionFlag = 0;

  13. int main (void);
  14. void ADC0_CallBack( void );
  15. /********************************************************************/
  16. int main (void)
  17. {
  18.     uint16_t u16ModuloValue;
  19.     uint32_t        u32LoadValue0;
  20.     ADC_ConfigType  sADC_Config = {0};
  21.     RTC_ConfigType  sRTCConfig;
  22.     RTC_ConfigType  *pRTC_Config=&sRTCConfig;
  23.     PIT_ConfigType  sPITConfig0;
  24.     PIT_ConfigType  *pPIT_Config0   =&sPITConfig0;
  25.   
  26.     /*系统初始化*/
  27.     sysinit();
  28.                
  29.                
  30.     printf("\nRunning the ADC_HWT_demo project.\r\n");
  31.     /*********************ADC硬件触发源选择**********************************/
  32.     //SIM_TriggerADC0ByRTC();         //选择RTC溢出触发ADC转换
  33.      SIM_TriggerADC0ByPIT();         //选择PIT溢出触发ADC
  34.     //SIM_TriggerADCBy0ETM2Init();    //选择ETM2初始后延时一段时间触发ADC转换
  35.     //SIM_TriggerADCBy0ETM2Match();   //选择ETM2匹配后延时一段时间触发ADC转换
  36.                
  37.     /**********设置ETM2从匹配/初始化到触发ADC转换的延时时间*****************/
  38.     SIM_SetClockOutputDivide(0x07); //总线时钟输出分频
  39.     SIM_DelayETM2Trig2ADC(0xff);  //延时计数模数值
  40.                
  41.     UART_WaitTxComplete(TERM_PORT);
  42.     LED0_Init();
  43.                
  44.     /* 初始化ADC模块*/
  45.     sADC_Config.u8ClockDiv = ADC_ADIV_DIVIDE_8;         /*!< ADC时钟源分频系数为8*/
  46.     sADC_Config.u8ClockSource = CLOCK_SOURCE_ADACK;   /*!< ADC时钟源选择异步时钟*/
  47.     sADC_Config.u8Mode = ADC_MODE_12BIT;                /*!< 12位转换*/
  48.     sADC_Config.sSetting.bIntEn = 1;                  /*!< 使能中断*/
  49.     sADC_Config.u8FiFoLevel = ADC_FIFO_LEVEL3;        /*!< 3级FIFO */
  50.     sADC_Config.sSetting.bContinuousEn=0;            //单次转换模式
  51.     sADC_Config.sSetting.bHardwareTriggerEn=1; //硬件触发
  52.     ADC_SetCallBack(ADC0,ADC0_CallBack);
  53.     ADC_Init( ADC0, &sADC_Config);    //初始化ADC模块
  54.                
  55.     /*RTC溢出触发ADC */
  56.        
  57. //    u16ModuloValue = 0x09;
  58. //    pRTC_Config->u16ModuloValue = u16ModuloValue; //设定模数值
  59. //    pRTC_Config->bInterruptEn=0;   //禁用中断
  60. //    pRTC_Config->bClockSource   = RTC_CLKSRC_1KHZ;  //选择1KHz时钟源
  61. //    pRTC_Config->bClockPresaler = RTC_CLK_PRESCALER_100;   //时钟分频系数100
  62. //    RTC_Init(pRTC_Config);
  63.                
  64.                
  65.     /*PIT0溢出触发ADC */
  66.    
  67.       u32LoadValue0   = 0xFFFFFF;       //设定装载值
  68.       pPIT_Config0->u32LoadValue      = u32LoadValue0;
  69.       pPIT_Config0->bFreeze           = FALSE;    //在调试模式时仍然运行
  70.       pPIT_Config0->bModuleDis        = FALSE;    //使能PIT模块
  71.       pPIT_Config0->bChainMode        = FALSE;    //禁用链模式
  72.       pPIT_Config0->bInterruptEn      = FALSE;    //禁用中断
  73.       pPIT_Config0->bETMerEn          = TRUE;     //使能PIT通道
  74.       PIT_Init(PIT_CHANNEL0, pPIT_Config0);
  75.    
  76.     /*选择ETM2匹配触发*/
  77.     /*
  78.                         ETM_PWMInit(ETM2, ETM_PWMMODE_EDGEALLIGNED, ETM_PWM_HIGHTRUEPULSE);
  79.                         ETM_SetETMEnhanced(ETM2);
  80.                         ETM2->EXTTRIG |= ETM_EXTTRIG_CH1TRIG_MASK;//使能通道1匹配触发
  81.                         ETM_SetModValue(ETM2, 29999);  // 设置ETM2模值
  82.                         ETM_SetChannelValue(ETM2, ETM_CHANNEL_CHANNEL1, 5000); //设置ETM2通道值
  83.                         ETM_ClockSet(ETM2, ETM_CLOCK_SYSTEMCLOCK, ETM_CLOCK_PS_DIV128);  //设置ETM2模块时钟源及分频系数.
  84.                         NVIC_DisableIRQ(ETM2_IRQn);
  85.     */
  86.     /*选择ETM2初始触发*/
  87.     /*
  88.                         ETM_PWMInit(ETM2, ETM_PWMMODE_EDGEALLIGNED, ETM_PWM_HIGHTRUEPULSE);
  89.                         ETM_SetETMEnhanced(ETM2);
  90.                         ETM_SetCounterInitValue(ETM2, 3000);
  91.                         ETM2->EXTTRIG |= ETM_EXTTRIG_INITTRIGEN_MASK; //初始化触发使能
  92.                         ETM_SetModValue(ETM2, 9999); // 设置ETM2模值
  93.                         ETM_SetChannelValue(ETM2, ETM_CHANNEL_CHANNEL1, 5000);  //设置ETM2通道值
  94.                         ETM_ClockSet(ETM2, ETM_CLOCK_SYSTEMCLOCK, ETM_CLOCK_PS_DIV128);  //设置ETM2模块时钟源及分频系数.
  95.      */
  96.                  
  97.     /***********设置转换通道,等待触发信号 ***********************/
  98.     ADC_SetChannel(ADC0,ADC_CHANNEL_AD14_TEMPSENSOR);
  99.     ADC_SetChannel(ADC0,ADC_CHANNEL_AD29_VREFH);
  100.     ADC_SetChannel(ADC0,ADC_CHANNEL_AD30_VREFL);
  101.     while(1)
  102.     {
  103.     }
  104. }
 楼主| 詹求实 发表于 2020-5-28 10:28 | 显示全部楼层
  1. /***************************************************************************
  2. +FUNCTION----------------------------------------------------------------
  3. *
  4. * [url=home.php?mod=space&uid=247401]@brief[/url]  ADC回调函数中,在回调函数里读取转换结果
  5. *
  6. * @param  none
  7. *
  8. * [url=home.php?mod=space&uid=266161]@return[/url] none
  9. *
  10. *****************************************************************************/
  11. void ADC0_CallBack( void )
  12. {
  13.     uint8_t         u8Ch;
  14.     LED0_Toggle();
  15.     while( !ADC_IsFIFOEmptyFlag(ADC0) )  ////结果FIFO中有有效的新数据
  16.     {
  17.         if( u16ADC_ConversionCount < 3 )  //读取转换结果,将结果FIFO中的数据全部读出
  18.         {
  19.             u16ADC_ConversionBuff[u16ADC_ConversionCount++] = ADC_ReadResultReg(ADC0);
  20.         }
  21.         else
  22.         {
  23.             ADC_ReadResultReg(ADC0);
  24.         }
  25.     }
  26.     /*打印转换结果*/
  27.     printf("ADC conversion result as below:\r\n");
  28.     for( u8Ch =0 ; u8Ch< u16ADC_ConversionCount; u8Ch ++)
  29.     {
  30.         printf("0x%x,",u16ADC_ConversionBuff[u8Ch]);
  31.     }
  32.     printf("\r\n");
  33.     u16ADC_ConversionCount = 0;;
  34. }
  35. /********************************************************************/
dami 发表于 2020-5-28 10:40 | 显示全部楼层
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

135

帖子

0

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

13

主题

135

帖子

0

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