完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
此文档代码主要用于GD32F130F8
内部代码6主要用于GD32的官方示例程序,而不是公司自己回顾。前言此程序涉及 ADC32F130F8 ,目的是应用NTC,9路,此温度仅涉及DMA 一、时钟配置void rcu_config void rcu_config(void) { /* enable GPIO clock */ rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOB); /* enable ADC clock */ rcu_periph_clock_enable(RCU_ADC); /* enable DMA clock */ rcu_periph_clock_enable(RCU_DMA); /* config ADC clock */ rcu_adc_clock_config(RCU_ADCCK_APB2_DIV6); } 二、ADC初始化配置 void adc_config(void) { /* gpio config */ gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 ); gpio_mode_set(GPIOB, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_1); /* ADC channel length config */ adc_channel_length_config(ADC_REGULAR_CHANNEL,ADC_Num); /* ADC regular channel config */ adc_regular_channel_config(0,ADC_CHANNEL_0,ADC_SAMPLETIME_13POINT5); adc_regular_channel_config(1,ADC_CHANNEL_1,ADC_SAMPLETIME_13POINT5); adc_regular_channel_config(2,ADC_CHANNEL_2,ADC_SAMPLETIME_13POINT5); adc_regular_channel_config(3,ADC_CHANNEL_3,ADC_SAMPLETIME_13POINT5); adc_regular_channel_config(4,ADC_CHANNEL_4,ADC_SAMPLETIME_13POINT5); adc_regular_channel_config(5,ADC_CHANNEL_5,ADC_SAMPLETIME_13POINT5); adc_regular_channel_config(6,ADC_CHANNEL_6,ADC_SAMPLETIME_13POINT5); adc_regular_channel_config(7,ADC_CHANNEL_7,ADC_SAMPLETIME_13POINT5); adc_regular_channel_config(8,ADC_CHANNEL_9,ADC_SAMPLETIME_13POINT5); /* ADC external trigger enable */ adc_external_trigger_config(ADC_REGULAR_CHANNEL,ENABLE); /* ADC external trigger source config */ adc_external_trigger_source_config(ADC_REGULAR_CHANNEL,ADC_EXTTRIG_REGULAR_SWRCST); /* ADC data alignment config */ adc_data_alignment_config(ADC_DATAALIGN_RIGHT); /* ADC discontinuous mode */ adc_discontinuous_mode_config(ADC_REGULAR_CHANNEL,4); /* enable ADC interface */ adc_enable(); /* ADC calibration and reset calibration */ adc_calibration_enable(); /* ADC DMA function enable */ adc_dma_mode_enable(); /* ADC contineous function enable */ // adc_special_function_config(ADC_CONTINUOUS_MODE,ENABLE); /* ADC software trigger enable */ // adc_software_trigger_enable(ADC_REGULAR_CHANNEL); } ADC的过程中,需要注意adc_software_trigger_enable(ADC_REGULAR_CHANNEL)的使用,在使用到多通道ADC过程中,使用异常位出现数据。 。 三、DMA void dma_config(void) { /* enable DMA clock */ rcu_periph_clock_enable(RCU_DMA); /* ADC_DMA_channel configuration */ dma_deinit(DMA_CH0); dma_periph_address_config(DMA_CH0,(uint32_t)(&ADC_RDATA)); dma_memory_address_config(DMA_CH0,(uint32_t)(&adc_value)); dma_transfer_direction_config(DMA_CH0,DMA_PERIPHERAL_TO_MEMORY); dma_memory_width_config(DMA_CH0,DMA_MEMORY_WIDTH_16BIT); dma_periph_width_config(DMA_CH0,DMA_PERIPHERAL_WIDTH_16BIT); dma_priority_config(DMA_CH0,DMA_PRIORITY_HIGH); dma_transfer_number_config(DMA_CH0,ADC_Num); dma_periph_increase_disable(DMA_CH0); dma_memory_increase_enable(DMA_CH0); dma_circulation_enable(DMA_CH0); dma_channel_enable(DMA_CH0); } 在上述配置的过程中,需要注意的是: 1dma_memory_CH0,(uint32_address_t)(&adc_value)),adc_value[config、这里是DMA的数据配置] (把DMA_transfer)表示。 2、dma_number_是用于通道数量的,ADC_Num是用于通道数量的,注意ADC_Num宏定义为0x09。 需特别注意adc_value[]与ADC_Num的配合。 四变量、主函数处理与部分定义 #define AVE_NUM 8 #define ADC_Num 9 uint16_t adc_value[9]; int main(void) { uint8_t i; static uint8_t adc_date_realdy_flag = 0; static uint16_t adc_sum_count = 0; static uint16_t adc_date_buffer[AVE_NUM][ADC_Num] = {0}; static uint32_t adc_sum[ADC_Num] = {0}; static uint16_t adc_ave[ADC_Num] = {0}; rcu_config(); /* ADC configuration */ adc_config(); dma_config(); while(1) { /*adc software trigger*/ adc_software_trigger_enable(ADC_REGULAR_CHANNEL); /* get adc value, 8 times*/ if (adc_sum_count < 8) { /* 9 ch */ for (i=0; i adc_date_buffer[adc_sum_count] = adc_value; } adc_sum_count++; } else { adc_sum_count = 0; adc_date_realdy_flag = 1; } /* frist times get complete data after boot */ if (adc_date_realdy_flag == 1) { for(i=0; i /* calculate sum data of ch */ adc_sum = adc_date_buffer[0] + adc_date_buffer[1] + adc_date_buffer[2] + adc_date_buffer[3] + adc_date_buffer[4] + adc_date_buffer[5] + adc_date_buffer[6] + adc_date_buffer[7]; /* Calculated average*/ adc_ave = adc_sum >> 3; } } } } 在主函数中取DMA传输的数据存在一个二维码中,每个通道取8次值。求和,再取一次,}这里建议取2次方,求求当天时,采用操作允许。但会遗弃部分准确。 |
|
|
|
只有小组成员才能发言,加入小组>>
3316 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9060 浏览 16 评论
4088 浏览 18 评论
1180浏览 3评论
605浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
599浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 05:52 , Processed in 1.023707 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号