色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

GD32開(kāi)發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)篇) 第9章 呼吸燈

嵌入式大雜燴 ? 2023-05-12 22:22 ? 次閱讀

開(kāi)發(fā)環(huán)境:

MDK:Keil 5.30

開(kāi)發(fā)板:GD32F207I-EVAL

MCU:GD32F207IK

1 呼吸燈的工作原理

呼吸燈,就是指燈光設(shè)備的亮度隨著時(shí)間由暗到亮逐漸增強(qiáng),再由亮到暗逐漸衰減,很有節(jié)奏感地一起一伏,就像是在呼吸一樣,因而被廣泛應(yīng)用于手機(jī)、電腦電子設(shè)備的指示燈中。

要使用數(shù)字器件控制燈光的強(qiáng)弱,我們很自然就想到 PWM(脈沖寬度調(diào)制)技術(shù)。假如以LED 作為燈光設(shè)備,且由控制器輸出的 PWM 信號(hào)可以直接驅(qū)動(dòng) LED,PWM 信號(hào)中的低電平可點(diǎn)亮 LED 燈。當(dāng) LED 以較高的頻率進(jìn)行開(kāi)關(guān)(亮滅)切換時(shí),由于視覺(jué)暫留效應(yīng),人眼是看不到 LED 燈的閃爍現(xiàn)象的,反映到人眼中能感覺(jué)到的是亮度的差別。即以一定的時(shí)間長(zhǎng)度為周期,LED 燈亮的平均時(shí)間越長(zhǎng),亮度就越高,反之越暗。因此,我們可以使用高頻率的 PWM 信號(hào),通過(guò)調(diào)制信號(hào)的占空比,控制 LED 燈的亮度。

那么具體我們應(yīng)該控制 LED 燈以怎樣的亮度曲線變化能夠達(dá)到最好的效果呢?亮度隨著時(shí)間逐漸變強(qiáng)再衰減,可以用兩種常見(jiàn)的數(shù)學(xué)函數(shù)表示,分別是半個(gè)周期的正弦函數(shù)與指數(shù)上升曲線及其對(duì)稱得到的下降曲線。

1683894862773yoqqladc47

相對(duì)來(lái)說(shuō),使用下凹函數(shù)曲線燈光處于暗的狀態(tài)更長(zhǎng),所以指數(shù)函數(shù)的曲線更符合我們呼吸燈的亮度變化要求。

2 呼吸燈實(shí)現(xiàn)

2.1 簡(jiǎn)單方式

筆者先用最簡(jiǎn)單的方式來(lái)實(shí)現(xiàn),也就是定時(shí)改變比較寄存器的值。

1.初始化 GPIO

下面分析具體的定時(shí)器配置代碼。本實(shí)驗(yàn)使用 PB0 作為定時(shí)器 PWM 輸出通道,先對(duì)它進(jìn)行初始化。作 PWM 輸出通道的引腳需要被配置為復(fù)用推挽輸出模式。

/*
    brief      configure PWM GPIO
    param[in]  none
    param[out] none
    retval     none
*/
static void timer_gpio_init(void)
{
    rcu_periph_clock_enable(RCU_GPIOB);
    rcu_periph_clock_enable(RCU_AF);

    /* Configure PB0 (TIMER2 CH2) as alternate function */
    gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
}

2.配置定時(shí)器模式

在timer2_init()函數(shù)中,完成了呼吸燈所需要的定時(shí)器 PWM 輸出模式配置。

/*
    brief      configure the Breath LED peripheral
    param[in]  none
    param[out] none
    retval     none
  */
void breath_led_init(void)
{
    /* TIMER2 configuration: generate PWM signals with different duty cycles:
       TIMER2CLK = SystemCoreClock / 120 = 1MHz */
    timer_oc_parameter_struct timer_ocintpara;
    timer_parameter_struct timer_initpara;

    /* configure the GPIO ports */
    timer_gpio_init();

    rcu_periph_clock_enable(RCU_TIMER2);

    timer_deinit(TIMER2);

    /* TIMER1 configuration */
    timer_initpara.prescaler         = 119;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 250;
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER2, &timer_initpara);

    /* CH0 configuration in PWM mode 0 */
    timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;
    timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;
    timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;
    timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;
    timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;
    timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;

    timer_channel_output_config(TIMER2, TIMER_CH_2, &timer_ocintpara);

    /* CH0 configuration in PWM mode 0,duty cycle 25% */
    timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_2, 0);
    timer_channel_output_mode_config(TIMER2, TIMER_CH_2, TIMER_OC_MODE_PWM0);
    timer_channel_output_shadow_config(TIMER2, TIMER_CH_2, TIMER_OC_SHADOW_DISABLE);

    /* auto-reload preload enable */
    timer_auto_reload_shadow_enable(TIMER2);
    /* TIMER2 enable */
    timer_enable(TIMER2);
}

這個(gè)定時(shí)器的模式配置主要分為三個(gè)部分,分別為時(shí)基初始化,輸出模式初始化。

  • 時(shí)基初始化

代碼中前面的部分是定時(shí)器的時(shí)基初始化,這部分主要負(fù)責(zé)配置定時(shí)器的定時(shí)周期、時(shí)鐘頻率、計(jì)數(shù)方式等。它使用到庫(kù)函數(shù)timer_init()函數(shù),利用結(jié)構(gòu)體timer_parameter_struct進(jìn)行配置,該結(jié)構(gòu)體有以下成員:

  1. period

定時(shí)周期,實(shí)質(zhì)是存儲(chǔ)到重載寄存器CAR的數(shù)值,脈沖計(jì)數(shù)器從 0 累加到這個(gè)值上溢或從這個(gè)值自減至 0 下溢。這個(gè)數(shù)值加 1 然后乘以時(shí)鐘源周期就是實(shí)際定時(shí)周期。

本實(shí)驗(yàn)中向該成員賦值為 255,即定時(shí)周期為(255+1)* T ,T 為定時(shí)器的時(shí)鐘周期。

  1. prescaler

對(duì)定時(shí)器時(shí)鐘CLK 的預(yù)分頻值,分頻后作為脈沖計(jì)數(shù)器TIMERx_CNT的驅(qū)動(dòng)時(shí)鐘,得到脈沖計(jì)數(shù)器的時(shí)鐘頻率為:CNT=CLK/(N+1),其中 N 為即為賦給本成員的時(shí)鐘分頻值。

本實(shí)驗(yàn)給 prescaler 成員賦值為 119,即對(duì)時(shí)鐘 120 分頻,所以定時(shí)器的時(shí)鐘周期 T 為 120/120000000。

  1. clockdivision

時(shí)鐘分頻因子。怎么又出現(xiàn)一個(gè)配置時(shí)鐘分頻的呢?要注意這個(gè)clockdivision和上面的 prescaler 是不一樣的。prescaler 預(yù)分頻配置是對(duì)CLK進(jìn)行分頻,分頻后的時(shí)鐘被輸出到脈沖計(jì)數(shù)器CNT。

本實(shí)驗(yàn)中是使用內(nèi)部時(shí)鐘CLK 作為定時(shí)器時(shí)鐘源的,沒(méi)有進(jìn)行濾波所以配置clockdivision為任何數(shù)值都沒(méi)有影響。

  1. alignedmode

本成員配置的為脈沖計(jì)數(shù)器 CNT 的計(jì)數(shù)模式,分別為向上計(jì)數(shù),向下計(jì)數(shù),及中央對(duì)齊模式。向上計(jì)數(shù)即 CNT 從 0 向上累加到 period 中的值,(重載寄存器 CAR 的值),產(chǎn)生上溢事件;向下計(jì)數(shù)則 CNT 從period 的值累減至0,產(chǎn)生下溢事件。而中央對(duì)齊模式則為向上、向下計(jì)數(shù)的合體,CNT 從 0 累加到period 的值減 1 時(shí),產(chǎn)生一個(gè)上溢事件,然后向下計(jì)數(shù)到 1 時(shí),產(chǎn)生一個(gè)計(jì)數(shù)器下溢事件,再?gòu)?0 開(kāi)始重新計(jì)數(shù)。

  • 輸出模式配置

在本函數(shù)代碼的后面是關(guān)于定時(shí)器的輸出模式配置的。通用定時(shí)器的輸出模式由 timer_oc_parameter_struct類型結(jié)構(gòu)體的主要有以下幾個(gè)成員:

  1. outputstate

配置輸出模式的狀態(tài)使能或關(guān)閉輸出。

  1. outputnstate

本成員的參數(shù)值即為比較寄存器 CH2CV的數(shù)值,當(dāng)脈沖計(jì)數(shù)器CNT與CH2CV的比較結(jié)果發(fā)生變化時(shí),輸出脈沖將發(fā)生跳變。

  1. ocpolarity

有效電平的極性,把 PWM 模式中的有效電平設(shè)置為高電平或低電平。

本實(shí)驗(yàn)中向該成員賦值為 TIMER_OC_POLARITY_LOW (有效電平為低電平),因?yàn)樵谏厦姘演敵瞿J脚渲脼?PWM0 模式,向上計(jì)數(shù),所以在 CNT< CH0CV 時(shí),通道 n 輸出為低電平,否則為高電平。

  1. ocnpolarity

用于比較有效電平的極性。

本實(shí)驗(yàn)中就是通過(guò)不斷改變比較寄存器CH2CV的值,達(dá)到控制 PWM 信號(hào)的占空比呈指數(shù)曲線變化的目的。在本函數(shù)代碼中,我們對(duì)該成員賦予初始為 0,而改變比較寄存器 CH0CV 值的操作是在中斷服務(wù)函數(shù)中修改的。填充完輸出模式初始化結(jié)構(gòu)體后,調(diào)用輸出模式初始化函數(shù) timer_channel_output_config()對(duì)通道進(jìn)行初始化。

以上是最基本的PWM輸出調(diào)制實(shí)現(xiàn)呼吸燈。

筆者接下來(lái)還要講解一下重映射的輸出配置。在這里講解的是通過(guò)重映射 TIMER2_CH2到 PB0 上,由 TIMER2_CH2 輸出 PWM 來(lái)控制LED的亮度。下面我們介紹通過(guò)庫(kù)函數(shù)來(lái)配置該功能的步驟。

1)開(kāi)啟 TIMER2時(shí)鐘以及復(fù)用功能時(shí)鐘,配置 PB0為復(fù)用輸出。

要使用 TIMER2,我們必須先開(kāi)啟 TIMER2的時(shí)鐘,這點(diǎn)相信大家看了這么多代碼,應(yīng)該明白了。這里我們還要配置 PB0為復(fù)用輸出,此時(shí),PB0屬于復(fù)用功能輸出。在此只列出庫(kù)函數(shù)設(shè)置 AFIO 時(shí)鐘的方法。

rcu_periph_clock_enable(RCU_AF);

其余的和前面的配置一樣,就不再列出了。

2)初始化 TIMER2,設(shè)置 TIMER2的 CAR 和 PSC。

3)設(shè)置 TIMER2_CH2 的 PWM 模式,使能 TIMER2的 CH2 輸出。

4)使能 TIMER2。

在完成以上設(shè)置了之后,我們需要使能 TIMER2。 使能 TIMER2的方法前面已經(jīng)講解過(guò):

timer_enable(TIMER2);

5)修改 TIMER2_ CH2CV來(lái)控制占空比。

最后,在經(jīng)過(guò)以上設(shè)置之后, PWM 其實(shí)已經(jīng)開(kāi)始輸出了,只是其占空比和頻率都是固定的,而我們通過(guò)修改 TIMER2_CH2CV則可以控制 CH2 的輸出占空比。繼而控制LED的亮度。在庫(kù)函數(shù)中,修改 TIMER2_CH2CV占空比的函數(shù)是:

void timer_channel_output_pulse_value_config(uint32_t timer_periph, uint16_t channel, uint32_t pulse)

通過(guò)以上5個(gè)步驟,我們就可以控制 TIMER2的 CH2 輸出 PWM 波了。

接下來(lái)看看主函數(shù)的代碼:

/*
    brief      main function
    param[in]  none
    param[out] none
    retval     none
*/
int main(void)
{
    uint16_t i = 0;
    FlagStatus breathe_flag = SET;

    //systick init
    sysTick_init();

    /* configure the Breath LED peripheral */
    breath_led_init();

    while(1)
    {
        /* delay a time in milliseconds */
        delay_ms(5);
        if(SET == breathe_flag) 
        {
            i++;
        }
        else
        {
            i--;
        }
        if(250 < i)
        {
            breathe_flag = RESET;
        }
        if(0 >= i)
        {
            breathe_flag = SET;
        }
        /* configure TIMER channel output pulse value */
        //timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_2, i);
        TIMER_CH2CV(TIMER2) = (uint32_t)i;
    }
}

代碼很簡(jiǎn)單,就是不斷改變CH2CV的值從而控制 CH2 的輸出占空比。

2.2 中斷方式

1.生成指數(shù)曲線 PWM 數(shù)據(jù)

要實(shí)現(xiàn) LED 亮度隨著指數(shù)曲線變化,我們需要使用占空比呈指數(shù)曲線變化的 PWM 信號(hào),而這樣的信號(hào)由定時(shí)器經(jīng)過(guò)查表產(chǎn)生。這個(gè)表的數(shù)據(jù)存儲(chǔ)在程序中的數(shù)組 indexWave中。

uint8_t indexWave[] = {1,1,2,2,3,4,6,8,10,14,19,25,33,44,59,80,
107,143,191,255,255,191,143,107,80,59,44,33,25,19,14,10,8,6,4,3,2,2,1,1};

這個(gè)表有 40 個(gè)數(shù)字,從圖中可以看到這些數(shù)字呈指數(shù)上升再衰減,正好是呼吸燈的一個(gè)控制周期。數(shù)字的大小范圍是 0255,即把 LED 的亮度分為了 0255 個(gè)等級(jí)。

假如我們把定時(shí)器的脈沖計(jì)數(shù)器 CNT 上限設(shè)置為 255,把這個(gè)表的數(shù)據(jù)一個(gè)一個(gè)地賦值到定時(shí)器的比較寄存器CH2CV中,那么在每個(gè) PWM 周期中,當(dāng) CNT的計(jì)數(shù)值小于比較寄存器 CH2CV的值時(shí), 就會(huì)在通道中輸出低電平,點(diǎn)亮 LED,而隨著 CCR 的值由 LED 亮度表得來(lái),所以 LED 點(diǎn)亮的時(shí)間就會(huì)呈圖中的曲線變化,實(shí)現(xiàn)呼吸燈的功能。

這個(gè)表的數(shù)據(jù)是使用 matlab 軟件生成的。該代碼運(yùn)行后會(huì)生成一個(gè)“index_wave.c”的文件,用戶把該文件中的數(shù)據(jù)復(fù)制到工程中的數(shù)組中即可。

%本代碼用于產(chǎn)生呼吸燈使用的指數(shù)函數(shù)數(shù)據(jù)
clear;

x = [0 : 8/19 : 8];       %設(shè)置序列 ,指數(shù)上升
up = 2.^x ;               %求上升指數(shù)序列  
up = uint8(up);           %化為8位數(shù)據(jù)

y = [8: -8/19 :0];       %設(shè)置序列 ,指數(shù)下降
down = 2.^y ;            %求下降指數(shù)序列
down = uint8(down);      %化為8位數(shù)據(jù)

line = [[0:8/19:8],[8:8/19:16]]         %拼接序列
val = [up , down]                       %拼接輸出序列

dlmwrite('index_wave.c',val);       %輸出到文件index_wave.c
plot(line,val,'.');                 %顯示波形圖

2.初始化 GPIO

這部分和前面的一樣,沒(méi)啥好說(shuō)的。

3.配置定時(shí)器模式

這里也差不多,只是將分頻系數(shù)設(shè)置的稍微大些,另外開(kāi)啟了中斷。

/*
    brief      configure the Breath LED peripheral
    param[in]  none
    param[out] none
    retval     none
  */
void breath_led_init(void)
{
    /* TIMER2 configuration: generate PWM signals with different duty cycles*/
    timer_oc_parameter_struct timer_ocintpara;
    timer_parameter_struct timer_initpara;

    /* configure the GPIO ports */
    timer_gpio_init();

    rcu_periph_clock_enable(RCU_TIMER2);

    timer_deinit(TIMER2);

    /* TIMER2 configuration */
    timer_initpara.prescaler         = 3999;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 255;
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER2, &timer_initpara);

    /* CH2 configuration in PWM mode 0 */
    timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;
    timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;
    timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;
    timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;
    timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;
    timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;

    timer_channel_output_config(TIMER2, TIMER_CH_2, &timer_ocintpara);

    /* CH2 configuration in PWM mode 0,duty cycle 25% */
    timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_2, 0);
    timer_channel_output_mode_config(TIMER2, TIMER_CH_2, TIMER_OC_MODE_PWM0);
    timer_channel_output_shadow_config(TIMER2, TIMER_CH_2, TIMER_OC_SHADOW_DISABLE);

    /* auto-reload preload enable */
    timer_auto_reload_shadow_enable(TIMER2);

    /* Timer2 interrupt setting, preemptive priority 0, sub-priority 2 */
    nvic_irq_enable(TIMER2_IRQn, 0, 2); 

    /* Enable Timer2 update interrupt */
    timer_interrupt_enable(TIMER2, TIMER_INT_UP);

    /* TIMER2 enable */
    timer_enable(TIMER2);
}

配置好中斷,下面就要編寫中斷服務(wù)函數(shù)。

/*!
    \\brief      this function handles TIMER2 exception
    \\param[in]  none
    \\param[out] none
    \\retval     none
*/
void TIMER2_IRQHandler(void)
{
    static uint8_t pwm_index = 0; //用于PWM查表
    static uint8_t period_cnt = 0; //用于計(jì)算周期數(shù)
	
    if(timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_UP))
    {
        /* 清除TIMER2 中斷標(biāo)志位 */
        timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP);

        period_cnt++;
        if(period_cnt >= 10)	//若輸出的周期數(shù)大于10,輸出下一種脈沖寬的PWM波
        {
            //根據(jù)PWM表修改定時(shí)器的比較寄存器值
            TIMER_CH2CV(TIMER2) = indexWave[pwm_index];
            pwm_index++; //標(biāo)志PWM表的下一個(gè)元素
            //若PWM脈沖表已經(jīng)輸出完成一遍,重置PWM查表標(biāo)志
            if( pwm_index >=  40)	
            {
                pwm_index=0;
            }
            period_cnt=0; //重置周期計(jì)數(shù)標(biāo)志
        }
    }
}

本中斷服務(wù)函數(shù)在每次定時(shí)器更新事件發(fā)生時(shí)執(zhí)行一次(即 256 個(gè)定時(shí)器時(shí)鐘周期)。函數(shù)中使用了靜態(tài)變量 pwm_index 和 period_cnt,它們分別用來(lái)查找 PWM 表元素和記錄同樣占空比的脈沖輸出了多少次。

本代碼的目的是每 10 次定時(shí)器中斷更新一次 PWM 表中的數(shù)據(jù)到比較寄存器中,當(dāng)遍歷完 PWM 表的 40 個(gè)元素時(shí),再重頭開(kāi)始遍歷 PWM 表,周而復(fù)始,重復(fù) LED 的呼吸過(guò)程。

整個(gè)呼吸過(guò)程的時(shí)間計(jì)算方法如下:

因?yàn)槎〞r(shí)器的 prescaler 設(shè)置為 3999;

所以定時(shí)器的時(shí)鐘頻率:fTIMER = 120000000/(prescaler+1) = 30000 Hz

即定時(shí)器的時(shí)鐘周期為:tTIMER = 1/fTIMER = 1/30000 s

因?yàn)槎〞r(shí)器的 period 設(shè)置為 255;

所以定時(shí)器的中斷周期為:tint= tTIMER * (period+1) =0.00753s

因?yàn)?PWM 表有 pwm_index = 40 個(gè)亮度占空比數(shù)據(jù),同種占空比信號(hào)輸出 period_cnt =10 次

所以一個(gè)呼吸周期 T = tint *40 *10 = 3.41s

3 呼吸燈的實(shí)驗(yàn)現(xiàn)象

將程序編譯好下載到板子中,將PF6接到PB0上,可一看到LED1像呼吸一樣漸漸變明或者漸漸變暗,但是方法二明顯比方法一更流暢,效果更好。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Cortex-M
    +關(guān)注

    關(guān)注

    2

    文章

    229

    瀏覽量

    29752
  • 呼吸燈
    +關(guān)注

    關(guān)注

    10

    文章

    110

    瀏覽量

    42722
  • GD32
    +關(guān)注

    關(guān)注

    7

    文章

    403

    瀏覽量

    24328
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    GD32開(kāi)發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 1 開(kāi)發(fā)環(huán)境搭建

    開(kāi)發(fā)環(huán)境: MDK:Keil 5.30 開(kāi)發(fā)板:GD32F207I-EVAL MCU:GD32F207IK 1 GD32F207I-EVAL
    的頭像 發(fā)表于 05-07 23:35 ?1.1w次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>1<b class='flag-5'>章</b> <b class='flag-5'>開(kāi)發(fā)</b>環(huán)境搭建

    GD32開(kāi)發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 4 GD32啟動(dòng)流程詳解(Keil版)

    ,所有的一切都需要由開(kāi)發(fā)者來(lái)設(shè)置,這里處理器是沒(méi)有堆棧,沒(méi)有中斷,更沒(méi)有外圍設(shè)備,這些工作是需要軟件來(lái)指定的,而且不同的CPU類型、不同大小的內(nèi)存和不同種類的外設(shè),其初始化工作都是不同的。本文將以GD32F207IK (基于Cortex-M3)為例進(jìn)行講解。
    的頭像 發(fā)表于 05-10 09:00 ?1.7w次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>4<b class='flag-5'>章</b> <b class='flag-5'>GD32</b>啟動(dòng)流程詳解(Keil版)

    GD32開(kāi)發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 7 定時(shí)器

    系統(tǒng)滴答定時(shí)器一般用來(lái)提供“心跳”作用,而GD32定時(shí)器最基本功能也是定時(shí),可以設(shè)置不同時(shí)間長(zhǎng)度的定時(shí)。定時(shí)器除了最基本的定時(shí)功能外,定時(shí)器與GPIO有掛鉤使得它可以發(fā)揮強(qiáng)大的作用,比如可以輸出
    的頭像 發(fā)表于 05-11 09:00 ?1.2w次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>7<b class='flag-5'>章</b> 定時(shí)器

    GD32開(kāi)發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 8 定時(shí)器

    開(kāi)發(fā)環(huán)境: MDK:Keil 5.30 開(kāi)發(fā)板:GD32F207I-EVAL MCU:GD32F207IK 1 PWM輸出的工作原理 脈沖寬度調(diào)制(PWM) ,是英文“Pulse Wi
    的頭像 發(fā)表于 05-12 22:14 ?7926次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>8<b class='flag-5'>章</b> 定時(shí)器

    GD32開(kāi)發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 11 CPU的高級(jí)代理-DMA

    或者存儲(chǔ)器和存儲(chǔ)器之間的高速數(shù)據(jù)傳輸,因而被廣泛地使用。早在 8086 的應(yīng)用中就已經(jīng)有 Intel 的 8237 這種典型的 DMA 控制器,而 GD32的 DMA 則是以類似外設(shè)的形式添加到 Cortex 內(nèi)核之外的??梢哉f(shuō),DMA就是CPU的高級(jí)代理,DMA大大減輕了CPU的負(fù)擔(dān)。
    的頭像 發(fā)表于 05-16 08:59 ?3864次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>11<b class='flag-5'>章</b> CPU的高級(jí)代理-DMA

    GD32開(kāi)發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 12 ADC

    GD32F2系列有 3 個(gè)逐次逼近型的ADC,精度為 12 位,有18個(gè)多路復(fù)用通道,可以轉(zhuǎn)換來(lái)自16個(gè)外部通道和2個(gè)內(nèi)部通道的模擬信號(hào)。其中ADC0 和 ADC1都有 16 個(gè)外部通道, ADC2
    的頭像 發(fā)表于 05-16 09:03 ?1.1w次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>12<b class='flag-5'>章</b> ADC

    GD32開(kāi)發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 14 內(nèi)部溫度傳感器

    GD32 有一個(gè)內(nèi)部的溫度傳感器,可以用來(lái)測(cè)量 CPU 及周圍的溫度(TA)。該溫度傳感器在內(nèi)部和 ADCx_IN16 輸入通道相連接,此通道把傳感器輸出的電壓轉(zhuǎn)換成數(shù)字值。溫度傳感器模擬輸入
    的頭像 發(fā)表于 05-17 08:58 ?5339次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>14<b class='flag-5'>章</b> 內(nèi)部溫度傳感器

    GD32開(kāi)發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 15 低功耗

    GD32的工作電壓(VDD)為2.0~3.6V。通過(guò)內(nèi)置的電壓調(diào)節(jié)器提供所需的1.8V電源。當(dāng)主電源VDD掉電后,通過(guò)VBAT腳為實(shí)時(shí)時(shí)鐘(RTC)和備份寄存器提供電源。
    的頭像 發(fā)表于 05-17 08:59 ?8048次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>15<b class='flag-5'>章</b> 低功耗

    GD32開(kāi)發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 16 RTC

    開(kāi)發(fā)環(huán)境: MDK:Keil 5.30 開(kāi)發(fā)板:GD32F207I-EVAL MCU:GD32F207IK 1 RTC工作原理 1.1 RTC簡(jiǎn)介
    的頭像 發(fā)表于 05-18 22:14 ?7153次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>16<b class='flag-5'>章</b> RTC

    GD32開(kāi)發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 17 看門狗

    開(kāi)發(fā)環(huán)境: MDK:Keil 5.30 開(kāi)發(fā)板:GD32F207I-EVAL MCU:GD32F207IK GD32 有兩個(gè)看門狗, 一個(gè)是
    的頭像 發(fā)表于 06-03 16:00 ?1.1w次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>17<b class='flag-5'>章</b> 看門狗

    【圖書分享】《STM32庫(kù)開(kāi)發(fā)實(shí)戰(zhàn)指南

    GPIO入門之流水燈 4 深入分析流水燈例程 5 調(diào)試程序第二部分 庫(kù)開(kāi)發(fā)中級(jí) 
    發(fā)表于 03-13 17:01

    Arduino開(kāi)發(fā)實(shí)戰(zhàn)指南 AVR

    模塊的應(yīng)用第三應(yīng)用8打造自己的遙控履帶車9
    發(fā)表于 08-03 16:14

    GD32 MCU原理及固件庫(kù)開(kāi)發(fā)指南》 + 初讀感悟

    GD32 MCU原理固件庫(kù)開(kāi)發(fā)指南這本書內(nèi)容豐富,囊括了GD32中的所有外設(shè),書中首先介紹了如何使用MDK或IAR軟件搭建GD32工程環(huán)境,讓初學(xué)者能快速基于工程上手編程。書中主要對(duì)
    發(fā)表于 03-31 22:11

    GD32 MCU原理及固件庫(kù)開(kāi)發(fā)指南》+讀后感

    。 2介紹GD32 MCU快速入門與開(kāi)發(fā)平臺(tái)搭建的方法,包括對(duì)軟硬件開(kāi)發(fā)平臺(tái)、調(diào)試工具、GD32
    發(fā)表于 06-06 21:52

    GD32開(kāi)發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 19 程序加密

    GD32通過(guò)讀取芯片唯一ID號(hào)來(lái)實(shí)現(xiàn)程序的保護(hù),防止被抄襲。96位的產(chǎn)品唯一身份標(biāo)識(shí)所提供的參考號(hào)碼對(duì)任意一個(gè)GD32微控制器
    的頭像 發(fā)表于 05-20 09:10 ?4140次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>19<b class='flag-5'>章</b> 程序加密
    主站蜘蛛池模板: 国产精品色吧国产精品| 亚洲精品日韩在线观看视频| 成人中文字幕在线观看| 欧美日韩精品一区二区三区高清视频 | 亚洲无遮挡| 黄色片中文| 伊人久久精品99热超碰| 久久婷婷国产五月综合色啪最新 | h片下载地址| 轻点灬大ji巴太粗太双性高h| videossexo乌克兰| 日本日本熟妇中文在线视频| 成人特级毛片| 午夜福利免费体检区| 国产亚洲精品AV麻豆狂野| 亚洲精品美女久久777777| 极品少妇高潮XXXXX| 尤物99久久久合集一区区| 伦理电影2499伦理片| free乌克兰性xxxxhd| 日日射夜夜干夜夜插在线播放| 国产成人啪精品视频免费网| 香蕉97超级碰碰碰碰碰久| 红桃传媒少妇人妻网站无码抽插| 一二三区乱码不卡手机版| 麻豆国产成人AV在线| Y8848高清私人影院软件优势| 国产性夜夜春夜夜爽1A片| 亚洲三级大片| 老师xxxx69动漫| jk制服喷水| 特级毛片内射WWW无码| 国产一区二区三区内射高清 | 小莹的性荡生活45章| 激情内射亚州一区二区三区爱妻| 最近免费中文字幕MV在线视频3| 欧美丰满熟妇无码XOXOXO| 国产99精品视频| 亚洲欧洲日本天天堂在线观看| 伦理片天堂eeuss影院2o12| 把英语老师强奷到舒服动态图 |