Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "mik32_hal.h"
- #include "mik32_hal_timer16.h"
- #include "mik32_hal_irq.h"
- #include "mik32_hal_adc.h"
- #include "mik32_hal_spifi_w25.h"
- /*
- * Пример тестирования максимальной скорости ADC.
- * ADC запускается в непрерывном режиме преобразования,
- * в прерывании постоянно сканируется флаг прерывания от ADC,
- * 256 прерываний переключается GPIO, на котором осциллографом можно измерить
- * длительность импульса, роделить на 256 и получить время преобразования
- *
- * */
- #define SAH_TIME 0x2
- #define _ADC_SAH_TIME(sah_time) ({ \
- ANALOG_REG->ADC_CONFIG = (ANALOG_REG->ADC_CONFIG & (~ADC_CONFIG_SAH_TIME_READ_M)) \
- | ((sah_time) << ADC_CONFIG_SAH_TIME_WRITE_S); })
- ADC_HandleTypeDef hadc;
- void SystemClock_Config(void);
- void GPIO_Init();
- static void ADC_Init(void);
- volatile uint16_t adc_value = 0;
- int main()
- {
- HAL_Init();
- SystemClock_Config();
- GPIO_Init();
- ADC_Init();
- HAL_EPIC_MaskEdgeSet(HAL_EPIC_ADC_MASK);
- HAL_IRQ_EnableInterrupts();
- _ADC_SAH_TIME(SAH_TIME);
- ANALOG_REG->ADC_CONTINUOUS = 1;
- while (1)
- {
- }
- }
- void SystemClock_Config(void)
- {
- PCC_InitTypeDef PCC_OscInit = {0};
- PCC_OscInit.OscillatorEnable = PCC_OSCILLATORTYPE_ALL;
- PCC_OscInit.FreqMon.OscillatorSystem = PCC_OSCILLATORTYPE_OSC32M;
- PCC_OscInit.FreqMon.ForceOscSys = PCC_FORCE_OSC_SYS_UNFIXED;
- PCC_OscInit.FreqMon.Force32KClk = PCC_FREQ_MONITOR_SOURCE_OSC32K;
- PCC_OscInit.AHBDivider = 0;
- PCC_OscInit.APBMDivider = 0;
- PCC_OscInit.APBPDivider = 0;
- PCC_OscInit.HSI32MCalibrationValue = 128;
- PCC_OscInit.LSI32KCalibrationValue = 8;
- PCC_OscInit.RTCClockSelection = PCC_RTC_CLOCK_SOURCE_AUTO;
- PCC_OscInit.RTCClockCPUSelection = PCC_CPU_RTC_CLOCK_SOURCE_OSC32K;
- HAL_PCC_Config(&PCC_OscInit);
- }
- void GPIO_Init()
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- __HAL_PCC_GPIO_0_CLK_ENABLE();
- __HAL_PCC_GPIO_1_CLK_ENABLE();
- __HAL_PCC_GPIO_2_CLK_ENABLE();
- GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10 ;
- GPIO_InitStruct.Mode = HAL_GPIO_MODE_GPIO_OUTPUT;
- GPIO_InitStruct.Pull = HAL_GPIO_PULL_NONE;
- HAL_GPIO_Init(GPIO_0, &GPIO_InitStruct);
- }
- void __attribute__((section(".ram_text"))) trap_handler(void)
- {
- static uint8_t n = 0;
- while(1){
- if (EPIC_CHECK_ADC())
- {
- EPIC->CLEAR = 1<<29;
- n++;
- if(n==0)
- GPIO_0->OUTPUT ^= GPIO_PIN_10;
- }
- }
- }
- static void ADC_Init(void)
- {
- hadc.Instance = ANALOG_REG;
- hadc.Init.Sel = ADC_CHANNEL0;
- hadc.Init.EXTRef = ADC_EXTREF_OFF; /* Выбор источника опорного напряжения: «1» - внешний; «0» - встроенный */
- hadc.Init.EXTClb = ADC_EXTCLB_ADCREF; /* Выбор источника внешнего опорного напряжения: «1» - внешний вывод; «0» - настраиваемый ОИН */
- HAL_ADC_Init(&hadc);
- }
Add Comment
Please, Sign In to add comment