概述
本章主要配置,ADC在DMA模式下掃描多個通道,通過串口進行打印。 查閱手冊可以得知,PA9、PA10為串口0的輸出和輸入口。 需要GD樣片的可以加群申請:615061293 。
ADC通道配置
硬件準備
這里準備了1塊開發板進行驗證,分別是GD32303C_START開發板。
keil配置
microlib 進行了高度優化以使代碼變得很小。 它的功能比缺省 C 庫少,并且根本不具備某些 ISO C 特性。 某些庫函數的運行速度也比較慢,如果要使用printf(),必須開啟。
使能串口
/* 使能GPI0A,用PA9、PA10為串口 */
rcu_periph_clock_enable(RCU_GPIOA);
/*使能串口0的時鐘 */
rcu_periph_clock_enable(RCU_USART0);
/*配置USARTx_Tx(PA9)為復用推挽輸出*/
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
/*配置USARTx_RxPA9)為浮空輸入 */
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
/* USART 配置 */
usart_deinit(USART0);//重置串口0
usart_baudrate_set(USART0, 115200U);//設置串口0的波特率為115200
usart_word_length_set(USART0, USART_WL_8BIT); // 幀數據字長
usart_stop_bit_set(USART0, USART_STB_1BIT); // 停止位1位
usart_parity_config(USART0, USART_PM_NONE); // 無奇偶校驗位
usart_receive_config(USART0, USART_RECEIVE_ENABLE);//使能接收器
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);//使能發送器
usart_enable(USART0);//使能USART
串口重定向
/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{
usart_data_transmit(USART0, (uint8_t)ch);
while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
return ch;
}
串口重定向后就可以使用printf進行打印。
ADC通道設置
DMA設置
ADC0初始化
void rcu_config(void)
{
/*使能GPIOA時鐘 */
rcu_periph_clock_enable(RCU_GPIOA);
/* 使能ADC時鐘 */
rcu_periph_clock_enable(RCU_ADC0);
/* 使能DMA0時鐘 */
rcu_periph_clock_enable(RCU_DMA0);
/* 配置ADC速率 */
rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6);
}
GPIO初始化
void gpio_config(void)
{
/* config the GPIO as analog mode */
gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_0);
gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_1);
gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_3);
}
ADC0配置
void adc_config(void)
{
adc_deinit(ADC0);
/* ADC mode config */
adc_mode_config(ADC_MODE_FREE);
/* 開啟連續轉換 */
adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);
/* 開啟掃描模式 */
adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
/*數據右對齊 */
adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
/* ADC channel length config */
adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 4);
/* ADC regular channel config */
adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_55POINT5);
adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_1, ADC_SAMPLETIME_55POINT5);
adc_regular_channel_config(ADC0, 2, ADC_CHANNEL_2, ADC_SAMPLETIME_55POINT5);
adc_regular_channel_config(ADC0, 3, ADC_CHANNEL_3, ADC_SAMPLETIME_55POINT5);
/* ADC 軟件觸發(規則組) */
adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
/* ADC DMA function enable */
adc_dma_mode_enable(ADC0);
/* enable ADC interface */
adc_enable(ADC0);
/* ADC校準和復位校準 */
adc_calibration_enable(ADC0);
}
DMA0初始化
void dma_config(void)
{
/* ADC_DMA_channel configuration */
dma_parameter_struct dma_data_parameter;
/* ADC DMA0_0初始化 */
dma_deinit(DMA0, DMA_CH0);
/* initialize DMA single data mode */
dma_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADC0));//外設基地址
dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;//內存地址增量模式
dma_data_parameter.memory_addr = (uint32_t)(&ADC0_Value);//數據存放地址
dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;//內存地址增量模式
dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;//dma外設寬度16位,半字
dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT;
dma_data_parameter.direction = DMA_PERIPHERAL_TO_MEMORY;//傳輸模式,外設到存儲(接收)
dma_data_parameter.number = 40;//長度
dma_data_parameter.priority = DMA_PRIORITY_HIGH;//優先級高
dma_init(DMA0, DMA_CH0, &dma_data_parameter);
dma_circulation_disable(DMA0, DMA_CH0);//循環模式開啟dma_circulation_enable(DMA0, DMA_CH0)//dma_circulation_disable
/* enable DMA transfer complete interrupt */
dma_interrupt_enable(DMA0, DMA_CH0, DMA_INT_FTF); //打開全部完成中斷
/* enable DMA channel */
dma_channel_enable(DMA0, DMA_CH0); /* DMA內存到內存模式不開啟 */
}
DMA0_Channel0_IRQHandler()
void DMA0_Channel0_IRQHandler(void)
{
if(dma_interrupt_flag_get(DMA0, DMA_CH0, DMA_INT_FLAG_FTF)==SET)
{
dma_interrupt_flag_clear(DMA0, DMA_CH0, DMA_FLAG_FTF);//清除DMA通道傳輸完成標志
dma_channel_disable(DMA0, DMA_CH0);
ADC0_Flag=1;
}
}
初始化定義
/* system clocks configuration */
rcu_config();
nvic_irq_enable(DMA0_Channel0_IRQn, 0, 0);
/* GPIO configuration */
gpio_config();
/* DMA configuration */
dma_config();
/* ADC configuration */
adc_config();
/* ADC software trigger enable */
adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
數據采集
while (1)
{
if(ADC0_Flag==1)
{
ADC0_0=0;
ADC0_1=0;
ADC0_2=0;
ADC0_3=0;
for(i=0;i<40;)
{
ADC0_0+=ADC0_Value[i++];
ADC0_1+=ADC0_Value[i++];
ADC0_2+=ADC0_Value[i++];
ADC0_3+=ADC0_Value[i++];
}
printf("\\n");
printf("adc1_IN0(PA0)=%4.0d,ADC_IN0=%1.4f\\r\\n",ADC0_0/10,ADC0_0/10*3.3f/4096);
printf("adc1_IN1(PA1)=%4.0d,ADC_IN1=%1.4f\\r\\n",ADC0_1/10,ADC0_1/10*3.3f/4096);
printf("adc1_IN2(PA2)=%4.0d,ADC_IN2=%1.4f\\r\\n",ADC0_2/10,ADC0_2/10*3.3f/4096);
printf("adc1_IN3(PA3)=%4.0d,ADC_IN3=%1.4f\\r\\n",ADC0_3/10,ADC0_3/10*3.3f/4096);
ADC0_Flag=0;
adc_config();
dma_memory_address_config(DMA0, DMA_CH0, (uint32_t)(&ADC0_Value));
dma_transfer_number_config(DMA0, DMA_CH0, 40);
dma_channel_enable(DMA0, DMA_CH0);
adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
}
delay_1ms(1000);
}
測試結果
輸入固定電壓進行測試。
測試結果如下。
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
adc
+關注
關注
99文章
6531瀏覽量
545392 -
dma
+關注
關注
3文章
566瀏覽量
100811 -
固件庫
+關注
關注
2文章
97瀏覽量
14967 -
gd32f303
+關注
關注
4文章
38瀏覽量
3708
發布評論請先 登錄
相關推薦
STM32CUBEMX開發GD32F303(9)----USART通過DMA收發
概述 本章STM32CUBEMX配置STM32F103,并且在GD32F303中進行開發,同時通過GD32303C_START
【GD32F303】星空派介紹
GD32官方資料的基礎上,提供GD32F303的庫函數開發資料、例程講解、視頻課程等。同時還提供RT-Thread相關的驅動開發、應用開發、
發表于 09-11 17:55
GD32F303固件庫開發(3)----使用固件庫點亮LED
概述 在GD的官網中有許多的DEMO文件,可以使用開發板的案例或者對應的MCU標準固件庫。需要樣片的可以加群申請:6_15061293。 下
GD32F303固件庫開發(5)----GPIO輸出模式,速率測試、開漏和輸出說明
以STM32CUBEMX創建STM32F103工程,同時移植在GD32F303中,同時通過GD32303C_START開發板內進行驗證。
STM32CUBEMX開發GD32F303(10)----雙ADC輪詢模式掃描多個通道
本章STM32CUBEMX配置STM32F103,并且在GD32F303中進行開發,同時通過GD32303C_START
GD32F303固件庫開發(10)----雙ADC輪詢模式掃描多個通道
本章主要配置,雙ADC輪詢模式掃描多個通道,通過串口進行打印。 查閱手冊可以得知,PA9、PA10為串口0的輸出和輸入口。 查閱手冊可以得知
STM32CUBEMX開發GD32F303(11)----ADC在DMA模式下掃描多個通道
本章STM32CUBEMX配置STM32F103,并且在GD32F303中進行開發,同時通過GD32303C_START
GD32F303固件庫開發(12)----輸出PWM及修改PWM頻率與占空比
本章STM32CUBEMX配置STM32F103,并且在GD32F303中進行開發,同時通過開發板內進行驗證。 本章主要配置定時器輸出PWM
AN029 GD32F103程序在GD32F303和GD32F403芯片上運行DSP
AN029 GD32F103程序在GD32F303和GD32F403芯片上運行DSP
發表于 02-27 18:33
?0次下載
【GD32F303紅楓派開發板使用手冊】第十六講 USART-DMA串口收發實驗
在前面ADC章節中,我們介紹了DMA的工作原理,這里就不多做介紹。從GD32F303用戶手冊中可以查到,各串口的TX和RX分別對應DMA的不同通道
評論