从资料可以看出,CF5010RBT60能通过10个A/D检测通道,见图1所示。

图1 检测通道与引脚关系
要实现多通道的数据采集,我们可以从例程中来获取经验。
例如在例程中就提供这样一个函数,它将相应的基本功能都涵盖到了其中,其内容为:
void demo()
{
#if (defined(UART4_TEST_EN) && (0 != UART4_TEST_EN))
uart4_demo();
#endif
#if (defined(LED_TEST_EN) && (0 != LED_TEST_EN))
led_demo();
#endif
#if (defined(USART_TEST_EN) && (0 != USART_TEST_EN))
usart_demo();
#endif
#if defined(ADC_DMA_TEST_EN)
adc_dma_demo();
#endif
#if (defined(TMR_TEST_EN) && (0 != TMR_TEST_EN))
tmr_demo();
#endif
#if (defined(GPIO_TEST_EN) && (0 != GPIO_TEST_EN))
gpio_exit_demo();
#endif
#if (defined(FLASH_TEST_EN) && (0 != FLASH_TEST_EN))
flash_demo();
#endif
#if (defined(PWM_TEST_EN) && (0 != PWM_TEST_EN))
pwm_demo();
#endif
#if (defined(PWM_DMA_TEST_EN) && (0 != PWM_DMA_TEST_EN))
pwm_dma_demo();
#endif
#if (defined(USART1_DMA_TEST_EN) && (0 != USART1_DMA_TEST_EN))
usart_dma_demo();
#endif
#if (defined(ATMR_TEST_EN) && (0 != ATMR_TEST_EN))
atmr8_demo();
#endif
}
按该函数的设计思想,当相应进行某种功能的测试时只要将其使能即可。但在实际测试时,确因异常而无法通过编译。
为此,只好将所需功能的函数放置到主程序的文件中来使用。
以多通道数据检测为例,经测试可完成编译的的文件内容为:
#include <stdio.h>
#include "main.h"
#define DEBUG_PRINTF_EN 1
#define ADC1_USE_CHANNEL_NUM 5u
#define ADC1_DMA_DATA_NUM (ADC1_USE_CHANNEL_NUM)
Dma_Handle_Type adc_dma1_ch1_hd;
uint8_t adc_dma_fns = 0;
uint16_t ad_dma_data[11] = {0};
void __attribute__((interrupt("SiFive-CLIC-preemptible"))) Dma1_Channel1_Irq_Lc11(void)
{
Dma_Global_IRQHandler(&adc_dma1_ch1_hd);
}
void adc_dma_trsf_fns_cb(struct __Dma_Handle_Type *dma_hdl)
{
adc_dma_fns = 1;
}
void adc_dma_trsf_half_cb(struct __Dma_Handle_Type *dma_hdl)
{
}
void adc_dma_trsf_err_cb(struct __Dma_Handle_Type *dma_hdl)
{
cfprintf("tr err\n");
adc_dma_init();
}
void adc_dma_init(void)
{
RCC_Peripheral_ClockEn(DMA1CLC);
adc_dma1_ch1_hd.dma_base = DMA1;
adc_dma1_ch1_hd.dma_channel = DMA1_Channel1;
adc_dma1_ch1_hd.half_transfer_complete_Callback = NULL;
adc_dma1_ch1_hd.transfer_complete_Callback = adc_dma_trsf_fns_cb;
adc_dma1_ch1_hd.transfer_error_Callback = adc_dma_trsf_err_cb;
Dma_Init_Parameter cfg;
cfg.direction = DMA_PERIPH_TO_MEMORY;
cfg.memory_addr = (uint32_t)ad_dma_data;
cfg.memory_data_size = DMA_MDATAALIGN_HALFWORD;
cfg.memory_inc = DMA_MINC_ENABLE;
cfg.number = ADC1_DMA_DATA_NUM;
cfg.periph_addr = (uint32_t)&ADC1->DR;
cfg.periph_data_size = DMA_PDATAALIGN_HALFWORD;
cfg.periph_inc = DMA_PINC_DISABLE;
cfg.priority = DMA_PRIORITY_HIGH;
Dma_Init(&adc_dma1_ch1_hd,&cfg);
Dma_Interupt_Config int_cfg;
int_cfg.half_transfer_it = DMA_IT_HALF_TRANSFER;
int_cfg.transfer_complete_it = DMA_IT_TRANSFER_COMPLETE;
int_cfg.transfer_error_it = DMA_IT_TRANSFER_ERROR;
Dma_Interrupt_Enable(&adc_dma1_ch1_hd,&int_cfg);
Clic_Interrupt_Enable(INT_ID_DMA1_CHAN1);
Dma_Circulation_Enable(&adc_dma1_ch1_hd);
Dma_Start(&adc_dma1_ch1_hd);
}
void usr_adc_init(void)
{
adc_dma_init();
RCC_Peripheral_ClockEn(ADCCLC);
cfprintf("adinit\n");
ADC_InitTypeDef cfg;
ADC_StructInit(&cfg);
cfg.ADC_ContinuousConvMode = DISABLE;
cfg.ADC_DataAlign = ADC_DataAlign_Right;
cfg.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
cfg.ADC_Mode = ADC_Mode_Independent;
cfg.ADC_NbrOfChannel = ADC1_USE_CHANNEL_NUM;
cfg.ADC_ScanConvMode = ENABLE;
ADC_Init(ADC1,&cfg);
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_13Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_13Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_13Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_13Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_4,5,ADC_SampleTime_13Cycles5);
ADC_TempSensorVrefintCmd(ENABLE);
ADC_DMACmd(ADC1,ENABLE);
ADC_ClearFlag(ADC1,ADC_FLAG_EOC);
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);
while(RESET != ADC_GetResetCalibrationStatus(ADC1));
cfprintf("adinit1,%08X\n",ADC1->CR2);
ADC_StartCalibration(ADC1);
while(RESET != ADC_GetCalibrationStatus(ADC1));
}
void usr_adc_test(void)
{
ADC_Cmd(ADC1,ENABLE);
while(0 == adc_dma_fns);
cfprintf("ad_ch1:%u\n",ad_dma_data[0]);
cfprintf("ad_ch2:%u\n",ad_dma_data[1]);
cfprintf("ad_ch3:%u\n",ad_dma_data[2]);
cfprintf("ad_ch4:%u\n",ad_dma_data[3]);
cfprintf("ad_ch5:%u\n",ad_dma_data[4]);
}
void adc_dma_demo(void)
{
cfprintf("adc dma demo\n");
usr_adc_init();
while(1)
{
usr_adc_test();
cf_delay_ms(1000);
}
}
void main(void)
{
#if defined(DEBUG_PRINTF_EN)
debug_uart4_init();
cfprintf("SYS_FREQ = 0d%d; AHB_FREQ = 0d%d; \n", SYS_FREQ, AHB_FREQ);
cfprintf("APB1_FREQ = 0d%d; APB2_FREQ = 0d%d;.\n", APB1_FREQ, APB2_FREQ);
cfprintf("cal:%u\r\n",cstatus);
cfprintf("Start user program...\r\n");
#endif
adc_dma_demo();
}
经编译,其结果如图2所示。

图2 编译结果
经此探索,要对函数 demo()中所提供的功能进行测试将不再是难题。
尽管通过编译,可以得到所需的*.elf和*.hex文件,但在编译过程中,想同时生成*.bin文件的要求一直没有实现。

否则,就可以尝试一下升级下载的效果了。