CH585/CH584 ADC SCAN功能
功能实现:
例如采集5通道ADC数据,BUF配置20,则实现channel0数据放在BUF[0],channel1=BUF[1]...channel0=BUF[5]...
可以实现快速采集数据。
注意:不需要使用中断。
实现代码:
volatile uint8_t i = 0; volatile uint8_t PRINT_flag = 0; #define ADC_PBUFFER_LENGTH 20//(96*15) __attribute__ ((aligned(4))) uint16_t adc_buffer[ADC_PBUFFER_LENGTH] ; /* 注意当使用ADC扫描功能时,例程默认打印脚由PA14更改为PB7*/ #define ADC_SCAN_MODE_EXAM 1 #define ADC_SCAN_CH_NUM 5//14 #define ADC_SCAN1_CH_IDX_1 (0) #define ADC_SCAN1_CH_IDX_2 (4) #define ADC_SCAN1_CH_IDX_3 (8) #define ADC_SCAN1_CH_IDX_4 (12) #define ADC_SCAN1_CH_IDX_5 (16) #define ADC_SCAN1_CH_IDX_6 (20) #define ADC_SCAN1_CH_IDX_7 (24) #define ADC_SCAN1_CH_IDX_8 (28) #define ADC_SCAN2_CH_IDX_9 (0) #define ADC_SCAN2_CH_IDX_10 (4) #define ADC_SCAN2_CH_IDX_11 (8) #define ADC_SCAN2_CH_IDX_12 (12) #define ADC_SCAN2_CH_IDX_13 (16) const uint32_t ADC_PIN[14] = { 0x00000010, // PA4,AIN0 0x00000020, // PA5,AIN1 0x00001000, // PA12,AIN2 0x00002000, // PA13,AIN3 0x00004000, // PA14,AIN4 0x00008000, // PA15,AIN5 0x00000008, // PA3,AIN6 0x00000004, // PA2,AIN7 0x00000002, // PA1,AIN8 0x00000001, // PA0,AIN9 0x00000040, // PA6,AIN10 0x00000080, // PA7,AIN11 0x00000100, // PA8,AIN12 0x00000200 // PA9,AIN13 }; const uint8_t adc_ch_seq[14] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; #define printLen 80 volatile uint16_t adcBuff[printLen]; volatile uint8_t adclen; volatile uint8_t DMA_end = 0; __HIGH_CODE void adc_scan_test() { uint32_t temp = 0; GPIOA_ModeCfg( ADC_PIN[adc_ch_seq[0]] | ADC_PIN[adc_ch_seq[1]] | ADC_PIN[adc_ch_seq[2]] | ADC_PIN[adc_ch_seq[3]] | ADC_PIN[adc_ch_seq[4]] | ADC_PIN[adc_ch_seq[5]] | ADC_PIN[adc_ch_seq[6]] | ADC_PIN[adc_ch_seq[7]] | ADC_PIN[adc_ch_seq[8]] | ADC_PIN[adc_ch_seq[9]] | ADC_PIN[adc_ch_seq[10]] | ADC_PIN[adc_ch_seq[11]] | ADC_PIN[adc_ch_seq[12]] | ADC_PIN[adc_ch_seq[13]], GPIO_ModeIN_Floating); ADC_ExtSingleChSampInit(SampleFreq_4_or_2, ADC_PGA_0); //4M采样频率,0dB增益 R8_ADC_CONVERT |= RB_ADC_SAMPLE_TIME; //7个采样周期 ADC_ChannelCfg(adc_ch_seq[0]); temp = (adc_ch_seq[1] << ADC_SCAN1_CH_IDX_1) | (adc_ch_seq[2] << ADC_SCAN1_CH_IDX_2) | (adc_ch_seq[3] << ADC_SCAN1_CH_IDX_3) | (adc_ch_seq[4] << ADC_SCAN1_CH_IDX_4) | (adc_ch_seq[5] << ADC_SCAN1_CH_IDX_5) | (adc_ch_seq[6] << ADC_SCAN1_CH_IDX_6) | (adc_ch_seq[7] << ADC_SCAN1_CH_IDX_7) | (adc_ch_seq[8] << ADC_SCAN1_CH_IDX_8); R32_ADC_SCAN_CFG1 = temp; temp = 0; temp = (adc_ch_seq[9] << ADC_SCAN2_CH_IDX_9) | (adc_ch_seq[10] << ADC_SCAN2_CH_IDX_10) | (adc_ch_seq[11] << ADC_SCAN2_CH_IDX_11) | (adc_ch_seq[12] << ADC_SCAN2_CH_IDX_12) | (adc_ch_seq[13] << ADC_SCAN2_CH_IDX_13); ADC_AutoConverCycle(192); // temp |= RB_ADC_SCAN_SEL | ((ADC_SCAN_CH_NUM - 1) << 24); temp |= RB_ADC_SCAN_SEL | RB_ADC_IE_SCAN_END | ((ADC_SCAN_CH_NUM - 1) << 24); R32_ADC_SCAN_CFG2 = temp; ADC_DMACfg(ENABLE, (uint32_t)&adcBuff[0] , (uint32_t)&adcBuff[printLen] , ADC_Mode_LOOP); // PFIC_EnableIRQ(ADC_IRQn); ADC_StartAutoDMA(); } __HIGH_CODE __attribute__((noinline)) void Main_Circulation() { while(1) { TMOS_SystemProcess(); if(PRINT_flag == 1){ PRINT_flag = 0; for (i = 0; i < 10; i++) { PRINT("%02d:%04d ",i, adcBuff[i]); adcBuff[i] = 0; }PRINT("\n");PRINT("\n"); } } } VOID TMR_TEST(){ TMR0_TimerInit(FREQ_SYS / 10); // 设置定时时间 100ms TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END); // 开启中断 PFIC_EnableIRQ(TMR0_IRQn); } int main(void) { #if(defined(DCDC_ENABLE)) && (DCDC_ENABLE == TRUE) PWR_DCDCCfg(ENABLE); #endif HSECFG_Capacitance(HSECap_18p); SetSysClock(SYSCLK_FREQ); #if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE) GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU); GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU); #endif #ifdef DEBUG GPIOB_SetBits(GPIO_Pin_7); GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_PU); GPIOB_ModeCfg(GPIO_Pin_7, GPIO_ModeOut_PP_5mA); UART0_DefInit(); UART0_BaudRateCfg(2000000); #endif GPIOB_SetBits(GPIO_Pin_0|GPIO_Pin_1); GPIOB_ModeCfg(GPIO_Pin_0|GPIO_Pin_1, GPIO_ModeOut_PP_5mA); PRINT("%s\n", VER_LIB); CH58x_BLEInit(); HAL_Init(); GAPRole_PeripheralInit(); Peripheral_Init(); TMR_TEST(); R32_PIN_IN_DIS |= RB_PAx_IN_DIS; // 关闭数字输入 adc_scan_test(); mDelaymS(100); Main_Circulation(); } __INTERRUPT __HIGH_CODE void TMR0_IRQHandler(void) // TMR0 定时中断 { if(TMR0_GetITFlag(TMR0_3_IT_CYC_END)) { TMR0_ClearITFlag(TMR0_3_IT_CYC_END); // 清除中断标志 PRINT_flag = 1; } }
浙公网安备 33010602011771号