国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

GD32F303固件庫(kù)開發(fā)(11)----ADC在DMA模式下掃描多個(gè)通道

發(fā)布者:RainbowGarden最新更新時(shí)間:2024-11-18 來源: elecfans關(guān)鍵字:GD32F303  固件庫(kù)開發(fā)  ADC  DMA模式 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

概述

本章主要配置,ADC在DMA模式下掃描多個(gè)通道,通過串口進(jìn)行打印。 查閱手冊(cè)可以得知,PA9、PA10為串口0的輸出和輸入口。 需要GD樣片的可以加群申請(qǐng):615061293 。

在這里插入圖片描述

ADC通道配置

在這里插入圖片描述

硬件準(zhǔn)備

這里準(zhǔn)備了1塊開發(fā)板進(jìn)行驗(yàn)證,分別是GD32303C_START開發(fā)板。

在這里插入圖片描述

keil配置

microlib 進(jìn)行了高度優(yōu)化以使代碼變得很小。 它的功能比缺省 C 庫(kù)少,并且根本不具備某些 ISO C 特性。 某些庫(kù)函數(shù)的運(yùn)行速度也比較慢,如果要使用printf(),必須開啟。

在這里插入圖片描述

使能串口

/* 使能GPI0A,用PA9、PA10為串口 */

    rcu_periph_clock_enable(RCU_GPIOA);


    /*使能串口0的時(shí)鐘 */

    rcu_periph_clock_enable(RCU_USART0);


    /*配置USARTx_Tx(PA9)為復(fù)用推挽輸出*/

    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);//設(shè)置串口0的波特率為115200

    usart_word_length_set(USART0, USART_WL_8BIT);          // 幀數(shù)據(jù)字長(zhǎng)

        usart_stop_bit_set(USART0, USART_STB_1BIT);               // 停止位1位

    usart_parity_config(USART0, USART_PM_NONE);           // 無奇偶校驗(yàn)位

    usart_receive_config(USART0, USART_RECEIVE_ENABLE);//使能接收器

    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);//使能發(fā)送器

    usart_enable(USART0);//使能USART

串口重定向

復(fù)制

/* 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進(jìn)行打印。

ADC通道設(shè)置

在這里插入圖片描述

DMA設(shè)置

在這里插入圖片描述


ADC0初始化

void rcu_config(void)

{

    /*使能GPIOA時(shí)鐘 */

    rcu_periph_clock_enable(RCU_GPIOA);

    /* 使能ADC時(shí)鐘 */

    rcu_periph_clock_enable(RCU_ADC0);

    /* 使能DMA0時(shí)鐘 */

    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); 

    /* 開啟連續(xù)轉(zhuǎn)換 */

    adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);

    /* 開啟掃描模式 */

    adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);

    /*數(shù)據(jù)右對(duì)齊 */

    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 軟件觸發(fā)(規(guī)則組) */

    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校準(zhǔn)和復(fù)位校準(zhǔn) */

    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));//外設(shè)基地址

    dma_data_parameter.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;//內(nèi)存地址增量模式

    dma_data_parameter.memory_addr  = (uint32_t)(&ADC0_Value);//數(shù)據(jù)存放地址

    dma_data_parameter.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;//內(nèi)存地址增量模式

    dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;//dma外設(shè)寬度16位,半字

    dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT;  

    dma_data_parameter.direction    = DMA_PERIPHERAL_TO_MEMORY;//傳輸模式,外設(shè)到存儲(chǔ)(接收)

    dma_data_parameter.number       = 40;//長(zhǎng)度

    dma_data_parameter.priority     = DMA_PRIORITY_HIGH;//優(yōu)先級(jí)高

    dma_init(DMA0, DMA_CH0, &dma_data_parameter);


    dma_circulation_disable(DMA0, DMA_CH0);//循環(huán)模式開啟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內(nèi)存到內(nèi)存模式不開啟 */

}

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通道傳輸完成標(biāo)志

        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);

數(shù)據(jù)采集

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);

    }


測(cè)試結(jié)果

輸入固定電壓進(jìn)行測(cè)試。

在這里插入圖片描述

測(cè)試結(jié)果如下。

在這里插入圖片描述


關(guān)鍵字:GD32F303  固件庫(kù)開發(fā)  ADC  DMA模式 引用地址:GD32F303固件庫(kù)開發(fā)(11)----ADC在DMA模式下掃描多個(gè)通道

上一篇:基于GD32L233的物聯(lián)網(wǎng)水表解決方案
下一篇:如何利用GD32F310讀取HDC1080環(huán)境溫濕度

推薦閱讀最新更新時(shí)間:2025-07-03 09:32

GD32F303固件庫(kù)開發(fā)(12)----輸出PWM及修改PWM頻率與占空比
概述 本章STM32CUBEMX配置STM32F103,并且在GD32F303中進(jìn)行開發(fā),同時(shí)通過開發(fā)板內(nèi)進(jìn)行驗(yàn)證。 本章主要配置定時(shí)器輸出PWM,同時(shí)演示PWM頻率與占空比。 查閱手冊(cè)可以得知,PB11為定時(shí)器1的通道3,對(duì)應(yīng)ST的為定時(shí)器2的通道4。 需要GD樣片的可以加QUN申請(qǐng):615061293 。 生成例程 這里準(zhǔn)備了自己繪制的開發(fā)板進(jìn)行驗(yàn)證。 使用PB11進(jìn)行驗(yàn)證。 工作過程 在ST中查看下面工作原理圖可以得知,時(shí)鐘可以由內(nèi)部Internal clock產(chǎn)生或者外部ETR。 同時(shí)可以設(shè)置復(fù)位,使能,向上/向下,計(jì)數(shù)。 在GD中,內(nèi)部時(shí)鐘源 TIMER_CK。 同時(shí)分頻只能為1、2、4。 查看S
[單片機(jī)]
<font color='red'>GD32F303</font><font color='red'>固件庫(kù)</font><font color='red'>開發(fā)</font>(12)----輸出PWM及修改PWM頻率與占空比
GD32F303紅楓派開發(fā)板使用手冊(cè)】第十五講 USART-printf打印實(shí)驗(yàn)
15.1實(shí)驗(yàn)內(nèi)容 通過本實(shí)驗(yàn)主要學(xué)習(xí)以下內(nèi)容: 串口簡(jiǎn)介 GD32F303串口工作原理 使用printf打印信息 15.2實(shí)驗(yàn)原理 15.2.1串口簡(jiǎn)介 串口,從廣義上看,指所有串行通信接口,比如RS232、RS422、RS485、SPI、IIC等。串行通訊是指僅用一根接收線和一根發(fā)送線就能將數(shù)據(jù)以位進(jìn)行傳輸?shù)耐ㄓ嵎绞健:痛型ㄓ嵪鄬?duì)應(yīng)的是并行通訊,并行通信指一個(gè)傳輸接口可以傳輸8個(gè)bit即一個(gè)byte(有時(shí)甚至更多),雖然串行通信比并行通信慢,但是串口可以在僅僅使用兩根線的情況下就能實(shí)現(xiàn)數(shù)據(jù)的傳輸。 對(duì)于GD32F303來說,串口一般特指USART(通用同步異步收發(fā)器 )和UART(通用異步收發(fā)器 )。USART/U
[單片機(jī)]
【<font color='red'>GD32F303</font>紅楓派<font color='red'>開發(fā)</font>板使用手冊(cè)】第十五講 USART-printf打印實(shí)驗(yàn)
單片機(jī)PWM波(AT89C51、ADC0808)
一、簡(jiǎn)介 此電路由AT89C51最小系統(tǒng)和ADC0808組成。 二、運(yùn)行效果 三、代碼 /*想要更多項(xiàng)目私wo!!!*/ #include reg52.h #define uint unsigned int #define uchar unsigned char sbit CLK = P2^4; sbit ST = P2^5; sbit EOC = P2^6; sbit OE = P2^7; sbit PWM = P3^0; void DelayMS(uint ms) { uchar i; while(ms--) { for(i=0;i 120;i++); } } voi
[單片機(jī)]
單片機(jī)PWM波(AT89C51、<font color='red'>ADC</font>0808)
Easy Drive ADC簡(jiǎn)化高阻抗傳感器的測(cè)量
增量累加 ADC 憑借高準(zhǔn)確度和很強(qiáng)的抗噪聲性能,非常適合用來直接測(cè)量很多類型的傳感器。然而,輸入采樣電流可能壓垮高源阻抗或低帶寬、微功率信號(hào)調(diào)理電路。LTC2484增量累加轉(zhuǎn)換器系列通過平衡輸入電流解決了這個(gè)問題,從而簡(jiǎn)化了信號(hào)調(diào)理電路或者不再需要這種電路。增量累加 ADC 的常見應(yīng)用是熱敏電阻器測(cè)量。圖 1 顯示了直接測(cè)量高達(dá) 100kΩ的熱敏電阻器時(shí) LTC2484 的連接方式。數(shù)據(jù) I/O 通過標(biāo)準(zhǔn) SPI 接口連接,每個(gè)輸入的采樣電流約為: 其中 或者當(dāng) VREF 為 5V、兩個(gè)輸入都接地時(shí),約為 1.67μA。 圖 1:LTC2484 的連接方式 4-WIRE SPI INTERFAC
[測(cè)試測(cè)量]
Easy Drive <font color='red'>ADC</font>簡(jiǎn)化高阻抗傳感器的測(cè)量
ATmega128 ADC噪聲抑制模式
當(dāng)SM2..0 為001 時(shí), SLEEP 指令將使MCU 進(jìn)入噪聲抑制模式。在此模式下,CPU 停 止運(yùn)行,而ADC、外部中斷、兩線接口地址配置、定時(shí)器/ 計(jì)數(shù)器0 和看門狗繼續(xù)工作。 這個(gè)睡眠模式只停止了clkI/O、clkCPU 和clkFLASH,其他時(shí)鐘則繼續(xù)工作。此模式提高了ADC 的噪聲環(huán)境,使得轉(zhuǎn)換精度更高。ADC 使能的時(shí)候,進(jìn)入此模式將 自動(dòng)啟動(dòng)一次AD 轉(zhuǎn)換。ADC 轉(zhuǎn)換結(jié)束中斷、外部復(fù)位、看門狗復(fù)位、BOD 復(fù)位、兩線 接口地址匹配中斷、定時(shí)器/ 計(jì)數(shù)器0 中斷、SPM/EEPROM 準(zhǔn)備好中斷、外部中斷 INT7:4,或外部中斷INT3:0 可以將MCU 從ADC 噪聲抑制模式喚醒。
[單片機(jī)]
單片機(jī)ADC采樣算法----加權(quán)遞推平均濾波法
加權(quán)遞推平均濾波法是對(duì)遞推平均濾波法的改進(jìn),即不同時(shí)刻的數(shù)據(jù)加以不同的權(quán)。通常是,越接近現(xiàn)時(shí)刻的數(shù)據(jù),權(quán)取得越大。給予新采樣值的權(quán)系數(shù)越大,則靈敏度越高,但信號(hào)平滑度越低。 下面直接看C代碼的實(shí)現(xiàn) define N 12 unsigned int coe = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; unsigned int sum_coe = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12; unsigned int filter8( void ) { unsigned int count; un
[單片機(jī)]
單片機(jī)<font color='red'>ADC</font>采樣算法----加權(quán)遞推平均濾波法
STM8 ADC讀取數(shù)據(jù)異常問題的解決
做了一個(gè)stm8的一個(gè)測(cè)量電壓電流的項(xiàng)目,發(fā)現(xiàn)adc通道通過一個(gè)10k電阻連接VCC,的時(shí)候ADC數(shù)據(jù)出來都是只有200多,按理說,10位adc應(yīng)該出來1000多才對(duì),由于adc出來的數(shù)據(jù)是十六位的,懷疑是串口發(fā)送數(shù)據(jù)的時(shí)候數(shù)據(jù)位數(shù)不對(duì)。于是改為 uint16_t dat_tmp = 0; // ADC_conf(4); // dat_tmp = ADC_GetConversionValue(); // printf( rnddddddddddrn ); // delay(0xffff); TIM1_SR1 &= ~(1 0); //清除中斷標(biāo)志 ms_count++; if(ms_count 1000) //1ms*
[單片機(jī)]
STM8 <font color='red'>ADC</font>讀取數(shù)據(jù)異常問題的解決
MSP430--ADC程序
1.ADC和P6是復(fù)用的。所以要設(shè)置P6.0為AD功能,要確保P6DIR=0X00,即為輸入。 其次P6SEL |= 0X01;設(shè)置需要的A0端口PIN為AD功能。 2.ADC時(shí)鐘問題,通過ADCSSEL選擇進(jìn)入的時(shí)鐘源默認(rèn)為ADC12OSC,經(jīng)過分頻之后才是ADC12CLK. 當(dāng)SHP=1時(shí),t_sample是由采樣定時(shí)器來決定的,整個(gè)采樣周期的長(zhǎng)度是4n倍的ADC12CLK,n由SHT決定。 WDTCTL = WDTPW + WDTHOLD; // Stop WDT ADC12CTL0 = SHT0_2 + ADC12ON; // 設(shè)置采樣保持的時(shí)間為8倍的ADC時(shí)鐘,Set s
[單片機(jī)]
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved