硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6388|回复: 2
收起左侧

[HRTIM] STM32H7的HRTIM触发ADC和DAC转换

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-9-1 02:33:23 | 显示全部楼层 |阅读模式
说明:

官方例程:HRTIM_DAC_ADC_Interconnect

HRTIM触发DAC输出方波。

HRTIM触发ADC采集DAC的输出,这里是在芯片内部实现互联采集,内部有一个连接通道,并将采集的数值作为TIMA的比较值,没采集一次,更新一次TIMA的比较值,并将进行PWM输出。

44.png



下面是DAC和TIMA的输出效果:

1.png

2.png



代码:

  1. /* Private typedef -----------------------------------------------------------*/
  2. /* Private define ------------------------------------------------------------*/
  3. #define HRTIM_MASTER_PERIOD  0x7
  4. #define HRTIM_TIMA_PERIOD    0xFFF
  5. /* Private macro -------------------------------------------------------------*/
  6. /* Private variables ---------------------------------------------------------*/
  7. uint32_t HRTIM_TIMA_PULSE = 0;
  8. uint32_t uwConvertedValue = 0;

  9. /* Timer handler declaration */
  10. HRTIM_HandleTypeDef                 HrtimHandle;
  11. DAC_HandleTypeDef                   DacHandle;
  12. ADC_HandleTypeDef                   AdcHandle;

  13. HRTIM_TimeBaseCfgTypeDef            sConfig_time_base;
  14. HRTIM_TimerCfgTypeDef               sConfig_timerA;
  15. HRTIM_TimerCfgTypeDef               sConfig_master;
  16. HRTIM_OutputCfgTypeDef              sConfig_output_config;
  17. HRTIM_CompareCfgTypeDef             sConfig_compare;
  18. DAC_ChannelConfTypeDef              sConfig_dac;
  19. ADC_ChannelConfTypeDef              sConfig_adc;
  20. HRTIM_ADCTriggerCfgTypeDef          sConfig_adctrig;

  21. /* Private function prototypes -----------------------------------------------*/
  22. static void SystemClock_Config(void);
  23. static void Error_Handler(void);
  24. static void CPU_CACHE_Enable(void);
  25. static void DAC_Configuration(void);
  26. static void ADC_Configuration(void);

  27. /* Private functions ---------------------------------------------------------*/

  28. /**
  29.   * @brief  Main program
  30.   * @param  None
  31.   * @retval None
  32.   */
  33. int main(void)
  34. {

  35.   /* Enable the CPU Cache */
  36.   CPU_CACHE_Enable();

  37.   /* STM32H7xx HAL library initialization:
  38.        - Configure the Systick to generate an interrupt each 1 msec
  39.        - Set NVIC Group Priority to 4
  40.        - Low Level Initialization
  41.   */
  42.   HAL_Init();

  43.   /* Configure the system clock to 400 MHz */
  44.   SystemClock_Config();

  45.   /*##-1- Configure the HRTIM peripheral ######################################################*/
  46.   /* Initialize the HRTIM structure */
  47.   HrtimHandle.Instance = HRTIM1;
  48.   HrtimHandle.Init.HRTIMInterruptResquests = HRTIM_IT_NONE;
  49.   HrtimHandle.Init.SyncOptions = HRTIM_SYNCOPTION_NONE;

  50.   HAL_HRTIM_Init(&HrtimHandle);

  51.   /*##-2- Configure the HRTIM MASTER ########################################################*/
  52.   /* Initialize the HRTIM Master timing structure */
  53.   sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
  54.   sConfig_time_base.Period = HRTIM_MASTER_PERIOD;
  55.   sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
  56.   sConfig_time_base.RepetitionCounter = 0;
  57.          
  58.   HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_MASTER, &sConfig_time_base);

  59.   sConfig_master.DMARequests = HRTIM_TIM_DMA_NONE;
  60.   sConfig_master.HalfModeEnable = HRTIM_HALFMODE_DISABLED;
  61.   sConfig_master.StartOnSync = HRTIM_SYNCSTART_DISABLED;
  62.   sConfig_master.ResetOnSync = HRTIM_SYNCRESET_DISABLED;
  63.   sConfig_master.DACSynchro = HRTIM_DACSYNC_DACTRIGOUT_1;
  64.   sConfig_master.PreloadEnable = HRTIM_PRELOAD_ENABLED;
  65.   sConfig_master.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;
  66.   sConfig_master.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK;
  67.   sConfig_master.RepetitionUpdate = HRTIM_UPDATEONREPETITION_ENABLED;
  68.   sConfig_master.ResetUpdate = HRTIM_TIMUPDATEONRESET_DISABLED;
  69.   sConfig_master.InterruptRequests = HRTIM_TIM_IT_NONE;

  70.   HAL_HRTIM_WaveformTimerConfig(&HrtimHandle, HRTIM_TIMERINDEX_MASTER,&sConfig_master);

  71. /* Configure the HRTIM Master to trigger the ADC */
  72. sConfig_adctrig.Trigger = HRTIM_ADCTRIGGEREVENT13_MASTER_PERIOD;
  73. sConfig_adctrig.UpdateSource = HRTIM_ADCTRIGGERUPDATE_MASTER;

  74. HAL_HRTIM_ADCTriggerConfig(&HrtimHandle, HRTIM_ADCTRIGGER_1, &sConfig_adctrig);

  75. /*##-3- Configure the HRTIM TIMA ########################################################*/
  76. /* Initialize the HRTIM TIMA timing structure */
  77.   sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
  78.   sConfig_time_base.Period = HRTIM_TIMA_PERIOD;
  79.   sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
  80.   sConfig_time_base.RepetitionCounter = 0;
  81.          
  82.   HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A, &sConfig_time_base);

  83.   sConfig_timerA.DMARequests = HRTIM_TIM_DMA_NONE;
  84.   sConfig_timerA.HalfModeEnable = HRTIM_HALFMODE_DISABLED;
  85.   sConfig_timerA.StartOnSync = HRTIM_SYNCSTART_DISABLED;
  86.   sConfig_timerA.ResetOnSync = HRTIM_SYNCRESET_DISABLED;
  87.   sConfig_timerA.DACSynchro = HRTIM_DACSYNC_NONE;
  88.   sConfig_timerA.PreloadEnable = HRTIM_PRELOAD_ENABLED;
  89.   sConfig_timerA.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;
  90.   sConfig_timerA.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK;
  91.   sConfig_timerA.RepetitionUpdate = HRTIM_UPDATEONREPETITION_ENABLED;
  92.   sConfig_timerA.ResetUpdate = HRTIM_TIMUPDATEONRESET_DISABLED;
  93.   sConfig_timerA.InterruptRequests = HRTIM_TIM_IT_NONE;
  94.   sConfig_timerA.PushPull = HRTIM_TIMPUSHPULLMODE_DISABLED;
  95.   sConfig_timerA.FaultEnable = HRTIM_TIMFAULTENABLE_NONE;
  96.   sConfig_timerA.FaultLock = HRTIM_TIMFAULTLOCK_READWRITE;
  97.   sConfig_timerA.DeadTimeInsertion = HRTIM_TIMDEADTIMEINSERTION_DISABLED;
  98.   sConfig_timerA.DelayedProtectionMode = HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DISABLED;
  99.   sConfig_timerA.UpdateTrigger= HRTIM_TIMUPDATETRIGGER_NONE;
  100.   sConfig_timerA.ResetTrigger = HRTIM_TIMRESETTRIGGER_NONE;

  101.   HAL_HRTIM_WaveformTimerConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A, &sConfig_timerA);

  102.   /* Configure the HRTIM TIMA compare unit */
  103.   sConfig_compare.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR;
  104.   sConfig_compare.AutoDelayedTimeout = 0;
  105.   sConfig_compare.CompareValue = HRTIM_TIMA_PULSE;

  106.   HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, &sConfig_compare);

  107.   sConfig_output_config.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
  108.   sConfig_output_config.SetSource = HRTIM_OUTPUTSET_TIMPER;
  109.   sConfig_output_config.ResetSource = HRTIM_OUTPUTRESET_TIMCMP1;
  110.   sConfig_output_config.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;
  111.   sConfig_output_config.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
  112.   sConfig_output_config.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;
  113.   sConfig_output_config.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;
  114.   sConfig_output_config.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;

  115.   HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1, &sConfig_output_config);

  116.   /*##-3- DAC Configuration ##################################################################*/
  117.   DAC_Configuration();

  118.   /*##-4- ADC Configuration ##################################################################*/
  119.   ADC_Configuration();

  120.   /*##-5- Enable DAC Channel1 ################################################################*/
  121.   if (HAL_DAC_Start(&DacHandle, DAC_CHANNEL_1) != HAL_OK)
  122.   {
  123.     /* Start Error */
  124.     Error_Handler();
  125.   }
  126.   /* ### -6 - Start ADC conversion ############################################################ */
  127.   if (HAL_ADC_Start_IT(&AdcHandle) != HAL_OK)
  128.   {
  129.     Error_Handler();
  130.   }

  131.   /*##-7- Start PWM signals generation ########################################################*/
  132.   if (HAL_HRTIM_WaveformOutputStart(&HrtimHandle, HRTIM_OUTPUT_TA1) != HAL_OK)
  133.   {
  134.     /* PWM Generation Error */
  135.     Error_Handler();
  136.   }

  137.   /*##-8- Start HRTIM counter ###################################################################*/
  138.   if (HAL_HRTIM_WaveformCounterStart(&HrtimHandle, HRTIM_TIMERID_MASTER + HRTIM_TIMERID_TIMER_A) != HAL_OK)
  139.   {
  140.     /* PWM Generation Error */
  141.     Error_Handler();
  142.   }
  143.   /* ### -9 - Start DAC conversion ############################################################ */
  144.   if (HAL_DACEx_TriangleWaveGenerate(&DacHandle, DAC_CHANNEL_1, DAC_TRIANGLEAMPLITUDE_4095) != HAL_OK)
  145.   {
  146.     Error_Handler();
  147.   }
  148.   /* Infinite loop */
  149.   while (1)
  150.   {
  151.   }
  152. }


  153. /**
  154.   * @brief  End of conversion callback in non blocking mode
  155.   * @param  hadc : hadc handle
  156.   * @retval None
  157.   */
  158. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
  159. {
  160.   /* Read the converted value */
  161.   uwConvertedValue = HAL_ADC_GetValue(hadc);
  162.   
  163.   __HAL_HRTIM_SetCompare(&HrtimHandle, 0, HRTIM_COMPAREUNIT_1, uwConvertedValue);
  164. }
  165. /**
  166.   * @brief  System Clock Configuration
  167.   *         The system Clock is configured as follow :
  168.   *            System Clock source            = PLL (HSE)
  169.   *            SYSCLK(Hz)                     = 400000000 (CPU Clock)
  170.   *            HCLK(Hz)                       = 200000000 (AXI and AHBs Clock)
  171.   *            AHB Prescaler                  = 2
  172.   *            D1 APB3 Prescaler              = 2 (APB3 Clock  100MHz)
  173.   *            D2 APB1 Prescaler              = 2 (APB1 Clock  100MHz)
  174.   *            D2 APB2 Prescaler              = 2 (APB2 Clock  100MHz)
  175.   *            D3 APB4 Prescaler              = 2 (APB4 Clock  100MHz)
  176.   *            HSE Frequency(Hz)              = 25000000
  177.   *            PLL_M                          = 5
  178.   *            PLL_N                          = 160
  179.   *            PLL_P                          = 2
  180.   *            PLL_Q                          = 4
  181.   *            PLL_R                          = 2
  182.   *            VDD(V)                         = 3.3
  183.   *            Flash Latency(WS)              = 4
  184.   * @param  None
  185.   * @retval None
  186.   */
  187. static void SystemClock_Config(void)
  188. {
  189.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
  190.   RCC_OscInitTypeDef RCC_OscInitStruct;
  191.   HAL_StatusTypeDef ret = HAL_OK;
  192.   
  193.   /*!< Supply configuration update enable */
  194.   MODIFY_REG(PWR->CR3, PWR_CR3_SCUEN, 0);

  195.   /* The voltage scaling allows optimizing the power consumption when the device is
  196.      clocked below the maximum system frequency, to update the voltage scaling value
  197.      regarding system frequency refer to product datasheet.  */
  198.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  199.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
  200.   
  201.   /* Enable HSE Oscillator and activate PLL with HSE as source */
  202.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  203.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  204.   RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
  205.   RCC_OscInitStruct.CSIState = RCC_CSI_OFF;
  206.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  207.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  208.   RCC_OscInitStruct.PLL.PLLM = 5;
  209.   RCC_OscInitStruct.PLL.PLLN = 160;
  210.   RCC_OscInitStruct.PLL.PLLP = 2;
  211.   RCC_OscInitStruct.PLL.PLLR = 2;
  212.   RCC_OscInitStruct.PLL.PLLQ = 4;

  213.   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  214.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
  215.   ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
  216.   if(ret != HAL_OK)
  217.   {
  218.     Error_Handler();
  219.   }
  220.   
  221. /* Select PLL as system clock source and configure  bus clocks dividers */
  222.   RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \
  223.                                  RCC_CLOCKTYPE_PCLK2  | RCC_CLOCKTYPE_D3PCLK1);

  224.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  225.   RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  226.   RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  227.   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;  
  228.   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  229.   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  230.   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
  231.   ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
  232.   if(ret != HAL_OK)
  233.   {
  234.     Error_Handler();
  235.   }
  236. }

  237. /**
  238.   * @brief  This function is executed in case of error occurrence.
  239.   * @param  None
  240.   * @retval None
  241.   */
  242. static void Error_Handler(void)
  243. {
  244.   /* User may add here some code to deal with this error */
  245.   while(1)
  246.   {
  247.   }
  248. }

  249. /**
  250.   * @brief  CPU L1-Cache enable.
  251.   * @param  None
  252.   * @retval None
  253.   */
  254. static void CPU_CACHE_Enable(void)
  255. {
  256.   /* Enable I-Cache */
  257.   SCB_EnableICache();

  258.   /* Enable D-Cache */
  259.   SCB_EnableDCache();
  260. }

  261. /**
  262.   * @brief  DAC Configuration
  263.   * @param  None
  264.   * @retval None
  265.   */
  266. void DAC_Configuration(void)
  267. {
  268.   DacHandle.Instance          = DAC1;

  269.   if (HAL_DAC_Init(&DacHandle) != HAL_OK)
  270.   {
  271.     /* Initialization Error */
  272.     Error_Handler();
  273.   }
  274.   sConfig_dac.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_ENABLE;
  275.   sConfig_dac.DAC_Trigger = DAC_TRIGGER_HR1_TRGO1;
  276.   sConfig_dac.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;


  277.   if (HAL_DAC_ConfigChannel(&DacHandle, &sConfig_dac, DAC_CHANNEL_1) != HAL_OK)
  278.   {
  279.     /* Channel configuration Error */
  280.     Error_Handler();
  281.   }
  282. }

  283. /**
  284.   * @brief  ADC Configuration
  285.   * @param  None
  286.   * @retval None
  287.   */
  288. void ADC_Configuration(void)
  289. {
  290.   AdcHandle.Instance          = ADC2;

  291.   if (HAL_ADC_DeInit(&AdcHandle) != HAL_OK)
  292.   {
  293.     /* ADC de-initialization Error */
  294.     Error_Handler();
  295.   }

  296.   AdcHandle.Init.ClockPrescaler           = ADC_CLOCK_SYNC_PCLK_DIV2;      /* Synchronous clock mode */
  297.   AdcHandle.Init.Resolution               = ADC_RESOLUTION_12B;            /* 16-bit resolution for converted data */
  298.   AdcHandle.Init.ScanConvMode             = DISABLE;                       /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */
  299.   AdcHandle.Init.EOCSelection             = ADC_EOC_SINGLE_CONV;           /* EOC flag picked-up to indicate conversion end */
  300.   AdcHandle.Init.LowPowerAutoWait         = DISABLE;                       /* Auto-delayed conversion feature disabled */
  301.   AdcHandle.Init.ContinuousConvMode       = ENABLE;                        /* Continuous mode enabled (automatic conversion restart after each conversion) */
  302.   AdcHandle.Init.NbrOfConversion          = 1;                             /* Parameter discarded because sequencer is disabled */
  303.   AdcHandle.Init.DiscontinuousConvMode    = DISABLE;                       /* Parameter discarded because sequencer is disabled */
  304.   AdcHandle.Init.NbrOfDiscConversion      = 1;                             /* Parameter discarded because sequencer is disabled */
  305.   AdcHandle.Init.ExternalTrigConv         = ADC_EXTERNALTRIG_HR1_ADCTRG1;  /* Software start to trig the 1st conversion manually, without external event */
  306.   AdcHandle.Init.ExternalTrigConvEdge     = ADC_EXTERNALTRIGCONVEDGE_FALLING; /* Parameter discarded because software trigger chosen */
  307.   AdcHandle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR;         /* DR register used as output (DMA mode disabled) */
  308.   AdcHandle.Init.LeftBitShift             = ADC_LEFTBITSHIFT_NONE;         /* Left shift of final results */
  309.   AdcHandle.Init.BoostMode                = ENABLE;                        /* Enable Boost mode as ADC clock frequency is bigger than 20 MHz */
  310.   AdcHandle.Init.Overrun                  = ADC_OVR_DATA_OVERWRITTEN;      /* DR register is overwritten with the last conversion result in case of overrun */
  311.   AdcHandle.Init.OversamplingMode         = DISABLE;                       /* Oversampling disable */

  312.   /* Initialize ADC peripheral according to the passed parameters */
  313.   if (HAL_ADC_Init(&AdcHandle) != HAL_OK)
  314.   {
  315.     Error_Handler();
  316.   }

  317.   if (HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
  318.   {
  319.     Error_Handler();
  320.   }

  321.   sConfig_adc.Channel          = ADC_CHANNEL_DAC1CH1_ADC2;        /* Select DAC1 internal channel */
  322.   sConfig_adc.Rank             = ADC_REGULAR_RANK_1;              /* Rank of sampled channel number ADCx_CHANNEL */
  323.   sConfig_adc.SamplingTime     = ADC_SAMPLETIME_810CYCLES_5;      /* Sampling time (number of clock cycles unit) */
  324.   sConfig_adc.SingleDiff       = ADC_SINGLE_ENDED;                /* Single input channel */
  325.   sConfig_adc.OffsetNumber     = ADC_OFFSET_NONE;                 /* No offset subtraction */
  326.   sConfig_adc.Offset           = 0;                               /* Parameter discarded because offset correction is disabled */
  327.   sConfig_adc.OffsetRightShift = DISABLE;                         /* No Right Offset Shift */
  328.   sConfig_adc.OffsetSignedSaturation  = DISABLE;                  /* No Signed Saturation */

  329.   if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig_adc) != HAL_OK)
  330.   {
  331.     Error_Handler();
  332.   }
  333. }
复制代码







回复

使用道具 举报

9

主题

59

回帖

86

积分

初级会员

积分
86
发表于 2020-4-29 16:39:57 | 显示全部楼层
这玩意是不是用来玩数字电源的?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-4-30 07:37:41 | 显示全部楼层
chenlijian80 发表于 2020-4-29 16:39
这玩意是不是用来玩数字电源的?

是的,ST做了很多这方面的案例。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 01:54 , Processed in 0.247086 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表