2026-05-11 19:55:43 +08:00
|
|
|
#include "adc_driver.h"
|
|
|
|
|
#include "py32md530.h"
|
|
|
|
|
#include "config.h"
|
|
|
|
|
|
|
|
|
|
ret_code_t adc_init(void)
|
|
|
|
|
{
|
|
|
|
|
RCC->APB2ENR |= RCC_APB2ENR_ADCEN;
|
|
|
|
|
|
|
|
|
|
ADC1->CR &= ~ADC_CR_ADEN_Msk;
|
|
|
|
|
|
|
|
|
|
ADC1->CFGR1 = ADC_CFGR1_RES_1;
|
|
|
|
|
|
2026-05-12 12:44:14 +08:00
|
|
|
ADC1->CHSMPR2 = (0x7 << 3);
|
2026-05-11 19:55:43 +08:00
|
|
|
|
|
|
|
|
ADC1->SMPR1 = 0x07;
|
|
|
|
|
|
|
|
|
|
ADC1->ISR &= ~ADC_ISR_ADRDY_Msk;
|
|
|
|
|
ADC1->CR |= ADC_CR_ADEN_Msk;
|
|
|
|
|
while (!(ADC1->ISR & ADC_ISR_ADRDY_Msk));
|
|
|
|
|
|
|
|
|
|
return RET_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret_code_t adc_deinit(void)
|
|
|
|
|
{
|
|
|
|
|
ADC1->CR |= ADC_CR_ADDIS_Msk;
|
|
|
|
|
while (ADC1->CR & ADC_CR_ADEN_Msk);
|
|
|
|
|
|
|
|
|
|
RCC->APB2ENR &= ~RCC_APB2ENR_ADCEN;
|
|
|
|
|
return RET_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint16_t adc_read_channel(adc_channel_t ch)
|
|
|
|
|
{
|
|
|
|
|
ADC1->CHDR1 = (uint32_t)ch;
|
|
|
|
|
|
|
|
|
|
ADC1->ISR &= ~ADC_ISR_EOC_Msk;
|
|
|
|
|
|
|
|
|
|
ADC1->CR |= ADC_CR_ADSTART_Msk;
|
|
|
|
|
|
|
|
|
|
while (!(ADC1->ISR & ADC_ISR_EOC_Msk));
|
|
|
|
|
|
|
|
|
|
return (uint16_t)(ADC1->CHDR1 & 0x0FFF);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret_code_t adc_start_dma(uint16_t *buffer, uint32_t len)
|
|
|
|
|
{
|
|
|
|
|
ADC1->CFGR1 |= ADC_CFGR1_DMAEN_Msk
|
|
|
|
|
| ADC_CFGR1_DMACFG_Msk;
|
|
|
|
|
|
|
|
|
|
ADC1->CR |= ADC_CR_ADSTART_Msk;
|
|
|
|
|
|
|
|
|
|
return RET_OK;
|
|
|
|
|
}
|