/********************************************************************* * INCLUDES */ #include "bsp_adc.h" #include "system.h" /********************************************************************* * DEFINITIONS */ #define CHANNEL_MAX 8 #define PIN_NOT_USED 0xFF #define CHANNEL_NOT_USED 0xFF #define WAIT_TIME_VALUE 3 // 等待超时最大值 /********************************************************************* * STRUCTION */ typedef struct { uint32_t pin; uint32_t channel; }adc_config_t; /********************************************************************* * LOCAL VARIABLES */ static adc_config_t m_adc_config[CHANNEL_MAX] = {{PIN_NOT_USED,CHANNEL_NOT_USED},{PIN_NOT_USED,CHANNEL_NOT_USED},{PIN_NOT_USED,CHANNEL_NOT_USED},{PIN_NOT_USED,CHANNEL_NOT_USED},{PIN_NOT_USED,CHANNEL_NOT_USED},{PIN_NOT_USED,CHANNEL_NOT_USED},{PIN_NOT_USED,CHANNEL_NOT_USED},{PIN_NOT_USED,CHANNEL_NOT_USED}}; static nrf_saadc_channel_config_t channelConfig[CHANNEL_MAX]; static nrf_saadc_value_t s_bufferPool[CHANNEL_MAX] = {0}; static volatile bool adc_SampleOk = true; // adc采集完成标志 //定义SAADC采样数据缓存 //定义SAADC采样缓存数组大小 //只有采样结果存满该缓存之后,才会产生SAADC采样完成事件 static uint32_t sample_in_buffer = 0; /********************************************************************* * LOCAL FUNCTIONS */ /** @brief ADC中断处理回调函数 @param 无 @return 无 */ static void adcCallbackFunc(nrf_drv_saadc_evt_t const *pEvent) { ret_code_t err_code; if(pEvent->type == NRF_DRV_SAADC_EVT_DONE) // 采样完成,采集时填充顺序为,通道编号小的先填充。 { //设置好缓存,为下一次采样做准备 err_code=nrf_drv_saadc_buffer_convert(pEvent->data.done.p_buffer,sample_in_buffer); APP_ERROR_CHECK(err_code); adc_SampleOk = true; } } /** @brief 初始化ADC @param 无 @return 无 */ static void ADC_Init(void) { ret_code_t errCode; nrf_drv_saadc_config_t p_config = NRFX_SAADC_DEFAULT_CONFIG; p_config.interrupt_priority = ADC_IRQ_PRIORITY; // ADC初始化 errCode = nrf_drv_saadc_init(&p_config, adcCallbackFunc);//优先级设置为3,比定时器中断要高,不然回调会在定时器中断结束后触发。 APP_ERROR_CHECK(errCode); // ADC通道配置 for(int i=0;i 0) { // 缓冲配置 errCode = nrf_drv_saadc_buffer_convert(s_bufferPool, sample_in_buffer); APP_ERROR_CHECK(errCode); } } static void cb_adcWakeup(uint32_t t) { ADC_Enable(); } static void cb_adcSleep(uint32_t t) { ADC_Disable(); } /********************************************************************* * PUBLIC FUNCTIONS */ /** @brief 初始化ADC引脚和通道 @param pin -[in] 需要初始化的adc引脚 @param channel -[in] 需要初始化的adc通道 @return 错误代码 */ uint32_t ADC_SetPinChannel(uint32_t pin, uint32_t channel) { for(int i=0;i