petrdynin

Mik32+ADC_Test_Speed

Oct 1st, 2025
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.35 KB | Source Code | 0 0
  1. #include "mik32_hal.h"
  2. #include "mik32_hal_timer16.h"
  3. #include "mik32_hal_irq.h"
  4. #include "mik32_hal_adc.h"
  5.  
  6. #include "mik32_hal_spifi_w25.h"
  7.  
  8.  
  9. /*
  10.  * Пример тестирования максимальной скорости ADC.
  11.  * ADC запускается в непрерывном режиме преобразования,
  12.  * в прерывании постоянно сканируется флаг прерывания от ADC,
  13.  * 256 прерываний переключается GPIO, на котором осциллографом можно измерить
  14.  * длительность импульса, роделить на 256 и получить время преобразования
  15.  *
  16.  * */
  17.  
  18.  
  19.  
  20. #define SAH_TIME   0x2
  21. #define _ADC_SAH_TIME(sah_time) ({                                                                                     \
  22.         ANALOG_REG->ADC_CONFIG  = (ANALOG_REG->ADC_CONFIG & (~ADC_CONFIG_SAH_TIME_READ_M))                            \
  23.                                  | ((sah_time) << ADC_CONFIG_SAH_TIME_WRITE_S); })
  24.  
  25.  
  26. ADC_HandleTypeDef hadc;
  27.  
  28. void SystemClock_Config(void);
  29. void GPIO_Init();
  30. static void ADC_Init(void);
  31.  
  32.  
  33.  volatile uint16_t adc_value = 0;
  34.  
  35.  
  36. int main()
  37. {
  38.     HAL_Init();
  39.  
  40.     SystemClock_Config();
  41.  
  42.     GPIO_Init();
  43.  
  44.    
  45.  
  46.     ADC_Init();
  47.    
  48.     HAL_EPIC_MaskEdgeSet(HAL_EPIC_ADC_MASK);
  49.     HAL_IRQ_EnableInterrupts();
  50.  
  51.     _ADC_SAH_TIME(SAH_TIME);
  52.      ANALOG_REG->ADC_CONTINUOUS = 1;
  53.  
  54.  
  55.     while (1)
  56.        {
  57.    
  58.  
  59.        }
  60. }
  61.  
  62. void SystemClock_Config(void)
  63. {
  64.     PCC_InitTypeDef PCC_OscInit = {0};
  65.  
  66.     PCC_OscInit.OscillatorEnable = PCC_OSCILLATORTYPE_ALL;
  67.     PCC_OscInit.FreqMon.OscillatorSystem = PCC_OSCILLATORTYPE_OSC32M;
  68.     PCC_OscInit.FreqMon.ForceOscSys = PCC_FORCE_OSC_SYS_UNFIXED;
  69.     PCC_OscInit.FreqMon.Force32KClk = PCC_FREQ_MONITOR_SOURCE_OSC32K;
  70.     PCC_OscInit.AHBDivider = 0;
  71.     PCC_OscInit.APBMDivider = 0;
  72.     PCC_OscInit.APBPDivider = 0;
  73.     PCC_OscInit.HSI32MCalibrationValue = 128;
  74.     PCC_OscInit.LSI32KCalibrationValue = 8;
  75.     PCC_OscInit.RTCClockSelection = PCC_RTC_CLOCK_SOURCE_AUTO;
  76.     PCC_OscInit.RTCClockCPUSelection = PCC_CPU_RTC_CLOCK_SOURCE_OSC32K;
  77.     HAL_PCC_Config(&PCC_OscInit);
  78. }
  79.  
  80.  
  81. void GPIO_Init()
  82. {
  83.     GPIO_InitTypeDef GPIO_InitStruct = {0};
  84.     __HAL_PCC_GPIO_0_CLK_ENABLE();
  85.     __HAL_PCC_GPIO_1_CLK_ENABLE();
  86.     __HAL_PCC_GPIO_2_CLK_ENABLE();
  87.  
  88.     GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10 ;
  89.     GPIO_InitStruct.Mode = HAL_GPIO_MODE_GPIO_OUTPUT;
  90.     GPIO_InitStruct.Pull = HAL_GPIO_PULL_NONE;
  91.     HAL_GPIO_Init(GPIO_0, &GPIO_InitStruct);
  92.  
  93. }
  94.  
  95. void __attribute__((section(".ram_text"))) trap_handler(void)
  96. {
  97.  
  98.     static uint8_t n = 0;
  99.    
  100.     while(1){
  101.     if (EPIC_CHECK_ADC())
  102.        {
  103.           EPIC->CLEAR = 1<<29;
  104.           n++;
  105.           if(n==0)
  106.            GPIO_0->OUTPUT ^= GPIO_PIN_10;
  107.        }
  108.     }
  109.  
  110.  
  111. }
  112.  
  113. static void ADC_Init(void)
  114. {
  115.     hadc.Instance = ANALOG_REG;
  116.  
  117.     hadc.Init.Sel    = ADC_CHANNEL0;
  118.     hadc.Init.EXTRef = ADC_EXTREF_OFF;    /* Выбор источника опорного напряжения: «1» - внешний; «0» - встроенный */
  119.     hadc.Init.EXTClb = ADC_EXTCLB_ADCREF; /* Выбор источника внешнего опорного напряжения: «1» - внешний вывод; «0» - настраиваемый ОИН */
  120.  
  121.     HAL_ADC_Init(&hadc);
  122. }
  123.  
Add Comment
Please, Sign In to add comment