那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

GD32開發實戰指南(基礎篇) 第6章 按鍵

嵌入式大雜燴 ? 來源:嵌入式大雜燴 ? 作者:嵌入式大雜燴 ? 2023-05-11 08:57 ? 次閱讀

開發環境:

MDK:Keil 5.30

開發板:GD32F207I-EVAL

MCU:GD32F207IK

1 普通方式

1.1 普通方式工作原理

按鍵 GPIO 端口有兩個方案可以選擇,一是采用上拉輸入模式,因為按鍵在沒按下的時候,是默認為高電平的,采且內部上拉模式正好符合這個要求。第二個方案是直接采用浮空輸入模式,因為按照硬件電路圖,在芯片外部接了上拉電阻,其實就沒必要再配置成內部上拉輸入模式了,因為在外部上拉與內部上拉效果是一樣的。

1683728778172wwrwwyb44i

筆者本文將會使用KEY1。

1.2 普通方式實現

主函數代碼如下:

/*
    brief      main function
    param[in]  none
    param[out] none
    retval     none
*/
int main(void)
{
    //systick init
    sysTick_init();
	
    /* configure LED1 GPIO port */
    led_init(LED1);

    /* configure LED2 GPIO port */
    led_init(LED2);

    /* configure LED3 GPIO port */
    led_init(LED3);

    /* configure LED4 GPIO port */
    led_init(LED4);

    //key init
    key_init(KEY_WAKEUP);
	
    while(1) 
    {
        delay_ms(100);
        if(key_scan(KEY_WAKEUP))
        {
            /* turn toggle LED */
            led_toggle(LED1);
            led_toggle(LED2);
            led_toggle(LED3);
            led_toggle(LED4);
        }
    }
}
  • GPIO 初始化配置
/*
    brief      configure key
    param[in]  keynum: specify the key to be configured
      arg        KEY_TAMPER: tamper key
      arg        KEY_WAKEUP: wakeup key
      arg        KEY_USER: user key
    param[out] none
    retval     none
*/
void key_init(key_typedef_enum keynum)
{
    /* enable the key clock */
    rcu_periph_clock_enable(KEY_CLK[keynum]);
    rcu_periph_clock_enable(RCU_AF);

    /* configure button pin as input */
    gpio_init(KEY_PORT[keynum], GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, KEY_PIN[keynum]);
}

key_init()與 LED 的 GPIO 初始化函數 led_init()類似,區別只是在這個函數中,要開啟的 GPIO 的端口時鐘不一樣,并且把檢測按鍵用的引腳 Pin 的模式設置為適合按鍵應用的上拉輸入模式(由于接了外部上拉電阻,也可以使用浮空輸入,讀者可自行修改代碼做實驗)。

  • 按鍵消抖
/*
    brief      return the key state
    param[in]  keynum: specify the key to be checked
      arg        KEY_TAMPER: tamper key
      arg        KEY_WAKEUP: wakeup key
      arg        KEY_USER: user key
    param[out] none
    retval     the key's GPIO pin value
*/
key_state_enum key_scan(key_typedef_enum keynum)
{
    /* check whether the button is pressed */
    if(RESET == gpio_input_bit_get(KEY_PORT[keynum], KEY_PIN[keynum]))
    {
        delay_ms(100);

        /* check whether the button is pressed */
        if(RESET == gpio_input_bit_get(KEY_PORT[keynum], KEY_PIN[keynum]))
        {
            while(RESET == gpio_input_bit_get(KEY_PORT[keynum], KEY_PIN[keynum]))
            {
                return KEY_ON;
            }
        }
    }
    return KEY_OFF;
}

相信延時消抖的原理大家在學習其他單片機時就已經了解了,本函數的功能就是掃描輸入參數中指定的引腳,檢測其電平變化,并作延時消抖處理,最終對按鍵消息進行確認。

  • 利用 gpio_input_bit_get() 讀取輸入數據,若從相應引腳讀取的數據等于 0(KEY_ON),低電平,表明可能有按鍵按下,調用延時函數。否則返回 KEY_OFF,表示按鍵沒有被按下。
  • 延時之后再次利用 gpio_input_bit_get()讀取輸入數據,若依然為低電平,表明確實有按鍵被按下了。否則返回 KEY_OFF,表示按鍵沒有被按下。
  • 循環調用gpio_input_bit_get() 一直檢測按鍵的電平,直至按鍵被釋放,被釋放后,返回表示按鍵被按下的標志 KEY_ON。以上是按鍵消抖的流程,調用了一個庫函數 gpio_input_bit_get()。輸入參數為要讀取的端口、引腳,返回引腳的輸入電平狀態,高電平為 1,低電平為 0。

2 EXTI方式

2.1 EXTI的工作原理

EXTI(External Interrupt) 就是指外部中斷,通過 GPIO 檢測輸入脈沖,引起中斷事件,打斷原來的代碼執行流程,進入到中斷服務函數中進行處理,處理完后再返回到中斷之前的代碼中執行。

  • GD32的中斷和異常

Cortex內核具有強大的異常響應系統,它把能夠打斷當前代碼執行流程的事件分為異常(exception)和中斷(interrupt),并把它們用一個表管理起來,編號為 0 ~ 15 的稱為內核異常,而 16 以上的則稱為外部中斷(外是相對內核而言),這個表就稱為中斷向量表。

而 GD32 對這個表重新進行了編排,把編號從-3 至 6 的中斷向量定義為系統異常,編號為負的內核異常不能被設置優先級,如復位(Reset)、不可屏蔽中斷 (NMI)、硬錯誤(Hardfault)。從編號 7 開始的為外部中斷,這些中斷的優先級都是可以自行設置的。詳細的 GD32中斷向量表見下表。

168372877887081545qixac

16837287794042gup5an3bx

……

完整向量表請參考《GD32F20x_User_Manual_EN_Rev2.4》。

GD32的中斷如此之多,配置起來并不容易,因此我們需要一個強大而方便的中斷控制器 NVIC (Nested Vectored Interrupt Controller)。NVIC 是屬于 Cortex 內核的器件,不可屏蔽中斷 (NMI)和外部中斷都由它來處理,而 SYSTICK 不是由 NVIC 來控制的。

1683728779796q7jzrhgrc4

  • NVIC 結構體成員

當我們要使用 NVIC 來配置中斷時,自然想到GD庫肯定也已經把它封裝成庫函數了。查找庫幫助文檔,發現在 gd32f20x_misc查找到一個nvic_irq_enable() 函數。

/*!
    \\brief      enable NVIC request
    \\param[in]  nvic_irq: the NVIC interrupt request, detailed in IRQn_Type
    \\param[in]  nvic_irq_pre_priority: the pre-emption priority needed to set
    \\param[in]  nvic_irq_sub_priority: the subpriority needed to set
    \\param[out] none
    \\retval     none
*/
void nvic_irq_enable(uint8_t nvic_irq,
                     uint8_t nvic_irq_pre_priority,
                     uint8_t nvic_irq_sub_priority)
{
    uint32_t temp_priority = 0x00U, temp_pre = 0x00U, temp_sub = 0x00U;

    /* use the priority group value to get the temp_pre and the temp_sub */
    switch((SCB->AIRCR) & (uint32_t)0x700U) {
    case NVIC_PRIGROUP_PRE0_SUB4:
        temp_pre = 0U;
        temp_sub = 0x4U;
        break;
    case NVIC_PRIGROUP_PRE1_SUB3:
        temp_pre = 1U;
        temp_sub = 0x3U;
        break;
    case NVIC_PRIGROUP_PRE2_SUB2:
        temp_pre = 2U;
        temp_sub = 0x2U;
        break;
    case NVIC_PRIGROUP_PRE3_SUB1:
        temp_pre = 3U;
        temp_sub = 0x1U;
        break;
    case NVIC_PRIGROUP_PRE4_SUB0:
        temp_pre = 4U;
        temp_sub = 0x0U;
        break;
    default:
        nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
        temp_pre = 2U;
        temp_sub = 0x2U;
        break;
    }

    /* get the temp_priority to fill the NVIC->IP register */
    temp_priority = (uint32_t)nvic_irq_pre_priority << (0x4U - temp_pre);
    temp_priority |= nvic_irq_sub_priority & (0x0FU >> (0x4U - temp_sub));
    temp_priority = temp_priority << 0x04U;
    NVIC->IP[nvic_irq] = (uint8_t)temp_priority;

    /* enable the selected IRQ */
    NVIC->ISER[nvic_irq >> 0x05U] = (uint32_t)0x01U << (nvic_irq & (uint8_t)0x1FU);
}

該函數有三個參數,需要配置的中斷向量,中斷向量搶占優先級和中斷向量的響應優先級。

前面兩個結構體成員都很好理解,首先要用 nvic_irq參數來選擇將要配置的中斷向量。用nvic_irq_pre_priority參數要配置中斷向量的搶占優先級,用nvic_irq_sub_priority參數配置中斷向量的響應優先級。對于中斷的配置,最重要的便是配置其優先級,但 GD32 的同一個中斷向量為什么需要設置兩種優先級?這兩種優先級有什么區別?

  • 搶占優先級和響應優先級

GD32的中斷向量具有兩個屬性,一個為搶占屬性,另一個為響應屬性,其屬性編號越小,表明它的優先級別越高。

搶占,是指打斷其他中斷的屬性,即因為具有這個屬性會出現嵌套中斷(在執行中斷服務函數 A 的過程中被中斷 B 打斷,執行完中斷服務函數 B 再繼續執行中斷服務函數A),搶占屬性由nvic_irq_pre_priority參數配置。

而響應屬性則應用在搶占屬性相同的情況下,當 兩個中斷向量的搶占優先級相同時,如 果兩個中斷同時到達,則先處理響應優先級高的中斷,響應屬性 由nvic_irq_sub_priority參數配置。例如,現在有三個中斷向量,見下表。

中斷向量 搶占優先級 響應優先級
A 0 0
B 1 0
C 1 1

若內核正在執行 C 的中斷服務函數,則它能被搶占優先級更高的中斷 A 打斷,由于 B和 C 的搶占優先級相同,所以 C 不能被 B 打斷。但如果 B 和 C 中斷是同時到達的,內核就會首先響應響應優先級別更高的 B 中斷。

  • NVIC 的優先級組

在配置優先級的時候,還要注意一個很重要的問題,即中斷種類的數量。NVIC 只可以配置 16 種中斷向量的優先級,也就是說,搶占優先級和響應優先級的數量由一個 4 位的數字來決定,把這個 4 位數字的位數分配成搶占優先級部分和響應優先級部分。有 5 組分配方式 :

  • 第 0 組:所有 4 位用來配置響應優先級。即 16 種中斷向量具有都不相同的響應優先級。
  • 第 1 組:最高 1 位用來配置搶占優先級,低 3 位用來配置響應優先級。表示有 21=2 種級別的搶占優先級(0 級,1 級),有 23=8 種響應優先級,即在 16 種中斷向量之中,有8 種中斷,其搶占優先級都為 0 級,而它們的響應優先級分別為 0~7,其余 8 種中斷向量的搶占優先級則都為 1 級,響應優先級別分別為 0~7。
  • 第 2 組:2 位用來配置搶占優先級,2 位用來配置響應優先級。即 22=4 種搶占優先級,22=4 種響應優先級。
  • 第 3 組:高 3 位用來配置搶占優先級,最低 1 位用來配置響應優先級。即有 8 種搶占優先級,2 種響應 2 優先級。
  • 第 4 組:所有 4 位用來配置搶占優先級,即 NVIC 配置的 24 =16 種中斷向量都是只有搶占屬性,沒有響應屬性。

要配置這些優先級組,可以采用庫函數 nvic_priority_group_set(),可輸入的參數為NVIC_PRIGROUP_PRE0_SUB4 ~ NVIC_PRIGROUP_PRE4_SUB0,分別為以上介紹的 5 種分配組。

GD32的所有 I/O 端口都可以配置為 EXTI 中斷模式,用來捕捉外部信號,可以配置為下降沿中斷、上升沿中斷和上升下降沿中斷這三種模式。它們以圖2所示方式連接到外部中斷 / 事件線上。

  • EXTI 外部中斷

GD32的所有 GPIO 都引入到 EXTI 外部中斷線上,使得所有的 GPIO 都能作為外部中斷的輸入源。GPIO 與 EXTI 的連接方式見下表。

由下表可知,PA0 ~ PI0 連接到 EXTI0 、PA1~ PI1 連接到 EXTI1、……、PA15 ~ PI15 連接到 EXTI15。這里大家要注意的是 :PAx ~ PIx 端口的中斷事件都連接到了 EXTIx,即同一時刻 EXTIx 只能響應一個端口的事件觸發,不能夠同一時間響應所有GPIO 端口的事件,但可以分時復用。它可以配置為上升沿觸發、下降沿觸發或雙邊沿觸發。EXTI 最普通的應用就是接上一個按鍵,設置為下降沿觸發,用中斷來檢測按鍵。

16837287803731iicow74v2

2.2 2 EXTI的寄存器描述

EXTI 寄存器的寄存器主要有6個,下面分別描述。

  • 中斷使能寄存器(EXTI_INTEN)

168372878086925fpvkv808

  • 事件使能寄存器(EXTI_EVEN)

1683728781270z65ikushbx

1683728781667lr52pege20

  • 上升沿觸發選擇寄存器(EXTI_RTEN)

16837287819546y9sa7lt8l

注意: 外部喚醒線是邊沿觸發的,這些線上不能出現毛刺信號。在寫EXTI_RTSR寄存器時,在外部中斷線上的上升沿信號不能被識別,掛起位也不會被置位。在同一中斷線上,可以同時設置上升沿和下降沿觸發。即任一邊沿都可觸發中斷。

  • 下降沿觸發選擇寄存器(EXTI_FTEN)

1683728782395kdebg1j966

注意: 外部喚醒線是邊沿觸發的,這些線上不能出現毛刺信號。在寫EXTI_FTSR寄存器時,在外部中斷線上的下降沿信號不能被識別,掛起位不會被置位。在同一中斷線上,可以同時設置上升沿和下降沿觸發。即任一邊沿都可觸發中斷。

  • 軟件中斷事件寄存器(EXTI_SWIEV)

1683728782836102ykdro3b

  • 掛起寄存器(EXTI_PD)

1683728783212gqkpbuuo0g

2.3 EXTI方式實現

主函數代碼如下:

/*
    brief      main function
    param[in]  none
    param[out] none
    retval     none
*/
int main(void)
{
    //systick init
    sysTick_init();
	
    /* configure LED1 GPIO port */
    led_init(LED1);

    /* configure LED2 GPIO port */
    led_init(LED2);

    /* configure LED3 GPIO port */
    led_init(LED3);

    /* configure LED4 GPIO port */
    led_init(LED4);
	
    //key init
    key_init(KEY_WAKEUP, KEY_MODE_EXTI);
	
    while(1) 
    {
        delay_ms(100);
    }
}
  • 配置外部中斷

現在我們重點分析 key_init() 這個函數,它完成了配置一個 I/O 為 EXTI 中斷的一般步驟,主要有以下功能 :

1)使能 EXTIx 線的時鐘和第二功能 AFIO 時鐘。

2)配置 EXTIx 線的中斷優先級。

3)配置 EXTI 中斷線 I/O。

4)選定要配置為 EXTI 的 I/O 口線和 I/O 口的工作模式。

5)EXTI 中斷線工作模式配置。

/*
    brief      configure key
    param[in]  keynum: specify the key to be configured
      arg        KEY_TAMPER: tamper key
      arg        KEY_WAKEUP: wakeup key
      arg        KEY_USER: user key
    param[in]  keymode: specify button mode
      arg        KEY_MODE_GPIO: key will be used as simple IO
      arg        KEY_MODE_EXTI: key will be connected to EXTI line with interrupt
    param[out] none
    retval     none
*/
void key_init(key_typedef_enum keynum, keymode_typedef_enum keymode)
{
    /* enable the key clock */
    rcu_periph_clock_enable(KEY_CLK[keynum]);
    rcu_periph_clock_enable(RCU_AF);

    /* configure button pin as input */
    gpio_init(KEY_PORT[keynum], GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, KEY_PIN[keynum]);

    if (keymode == KEY_MODE_EXTI) 
    {
        /* enable and set key EXTI interrupt to the lowest priority */
        nvic_irq_enable(KEY_IRQn[keynum], 2U, 0U);

        /* connect key EXTI line to key GPIO pin */
        gpio_exti_source_select(KEY_PORT_SOURCE[keynum], KEY_PIN_SOURCE[keynum]);

        /* configure key EXTI line */
        exti_init(KEY_EXTI_LINE[keynum], EXTI_INTERRUPT, EXTI_TRIG_FALLING);
        exti_interrupt_flag_clear(KEY_EXTI_LINE[keynum]);
    }
}

key_init()代碼中,不僅配置了NVIC ,還對按鍵的GPIO進行了初始化,這部分和按鍵輪詢的設置類似。

接下來,調用 gpio_exti_source_select () 函數把 GPIOA、Pin0 與EXTI連接起來。

最后調用 exti_init() 把 EXTI 初始化,函數如下:

/*!
    \\brief      initialize the EXTI
    \\param[in]  linex: EXTI line number, refer to exti_line_enum
                only one parameter can be selected which is shown as below:
      \\arg        EXTI_x (x=0..19): EXTI line x
    \\param[in]  mode: interrupt or event mode, refer to exti_mode_enum
                only one parameter can be selected which is shown as below:
      \\arg        EXTI_INTERRUPT: interrupt mode
      \\arg        EXTI_EVENT: event mode
    \\param[in]  trig_type: interrupt trigger type, refer to exti_trig_type_enum
                only one parameter can be selected which is shown as below:
      \\arg        EXTI_TRIG_RISING: rising edge trigger
      \\arg        EXTI_TRIG_FALLING: falling trigger
      \\arg        EXTI_TRIG_BOTH: rising and falling trigger
      \\arg        EXTI_TRIG_NONE: without rising edge or falling edge trigger
    \\param[out] none
    \\retval     none
*/
void exti_init(exti_line_enum linex, exti_mode_enum mode, exti_trig_type_enum trig_type)
{
    /* reset the EXTI line x */
    EXTI_INTEN &= ~(uint32_t)linex;
    EXTI_EVEN &= ~(uint32_t)linex;
    EXTI_RTEN &= ~(uint32_t)linex;
    EXTI_FTEN &= ~(uint32_t)linex;

    /* set the EXTI mode and enable the interrupts or events from EXTI line x */
    switch(mode) {
    case EXTI_INTERRUPT:
        EXTI_INTEN |= (uint32_t)linex;
        break;
    case EXTI_EVENT:
        EXTI_EVEN |= (uint32_t)linex;
        break;
    default:
        break;
    }

    /* set the EXTI trigger type */
    switch(trig_type) {
    case EXTI_TRIG_RISING:
        EXTI_RTEN |= (uint32_t)linex;
        EXTI_FTEN &= ~(uint32_t)linex;
        break;
    case EXTI_TRIG_FALLING:
        EXTI_RTEN &= ~(uint32_t)linex;
        EXTI_FTEN |= (uint32_t)linex;
        break;
    case EXTI_TRIG_BOTH:
        EXTI_RTEN |= (uint32_t)linex;
        EXTI_FTEN |= (uint32_t)linex;
        break;
    case EXTI_TRIG_NONE:
    default:
        break;
    }
}
  • AFIO 時鐘

代碼中調用rcu_periph_clock_enable(RCU_AF)表示開啟 AFIO的時鐘。

AFIO (alternate-function I/O),指 GPIO 端口的復用功能,GPIO 除了用作普通的輸入輸出(主功能),還可以作為片上外設的復用輸入輸出,如串口、ADC,這些就是復用功能。大多數 GPIO 都有一個默認復用功能,有的 GPIO 還有重映射功能。重映射功能是指把原來屬于 A 引腳的默認復用功能,轉移到B引腳進行使用,前提是 B 引腳具有這個重映射功能。

當把 GPIO 用作 EXTI 外部中斷或使用重映射功能的時候,必須開啟 AFIO 時鐘,而在使用默認復用功能的時候,就不必開啟 AFIO 時鐘了。

  • 編寫中斷服務函數

在這個 EXTI 設置中我們把 PA0 連接到內部的 EXTI0,GPIO 配置為上拉輸入,工作在下降沿中斷。在外圍電路上我們將 PA0 接到了 key上。當按鍵沒有按下時,PA0 始終為高,當按鍵按下時 PA0 變為低,從而 PA0 上產生一個下降沿跳變,EXTI0 會捕捉到這一跳變,并產生相應的中斷,中斷服務程序在 gd32f20x_it.c 中實現。gd32f20x_it.c 文件是專門用來存放中斷服務函數的。文件中默認只有幾個關于系統異常的中斷服務函數,而且都是空函數,在需要的時候自行編寫。那么中斷服務函數名是不是可以自己定義呢?不可以。中斷服務函數的名字必須要與啟動文件startup_gd32f20x_cl.s 中的中斷向量表定義一致。

16837287836368hav0m3p26

EXTI0_IRQHandler 表示為 EXTI0 中斷向量的服務函數名。于是,我們就可以在 gd32f20x_it.c文件中加入名為 EXTI0_IRQHandler() 的函數。

/*!
    \\brief      this function handles external lines 0 interrupt request
    \\param[in]  none
    \\param[out] none
    \\retval     none
*/
void EXTI0_IRQHandler(void)
{
    if(RESET != exti_interrupt_flag_get(EXTI_0))
    {
        /* turn toggle LED */
        led_toggle(LED1);
        led_toggle(LED2);
        led_toggle(LED3);
        led_toggle(LED4);

       exti_interrupt_flag_clear(EXTI_0);
   }
}

其內容比較容易理解,進入中斷后,調用exti_interrupt_flag_get() 庫函數來重新檢查是否產生了 EXTI_Line 中斷,接下來把 LED 取反,操作完畢后,調用 exti_interrupt_flag_clear()清除中斷標志位再退出中斷服務函數。

3 實驗現象

編譯好程序后,下載到板子上,不管是普通方式還是中斷方式,當按在按鍵KEY1時,LED或亮或滅。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17317

    瀏覽量

    352620
  • 按鍵
    +關注

    關注

    4

    文章

    223

    瀏覽量

    57656
  • 開發板
    +關注

    關注

    25

    文章

    5121

    瀏覽量

    98183
  • Cortex-M
    +關注

    關注

    2

    文章

    229

    瀏覽量

    29841
  • GD32
    +關注

    關注

    7

    文章

    413

    瀏覽量

    24467
收藏 人收藏

    評論

    相關推薦

    GD32開發實戰指南(基礎) 1 開發環境搭建

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

    GD32開發實戰指南(基礎) 4 GD32啟動流程詳解(Keil版)

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

    GD32開發實戰指南(基礎) 7 定時器

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

    GD32開發實戰指南(基礎) 8 定時器

    Modulation” 的縮寫,簡稱脈寬調制,是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術。簡單一點,就是對脈沖寬度的控制。 GD32 的定時器除了 TIMER5 和 6(基本定時器
    的頭像 發表于 05-12 22:14 ?8082次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發</b><b class='flag-5'>實戰</b><b class='flag-5'>指南</b>(基礎<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>8<b class='flag-5'>章</b> 定時器

    GD32開發實戰指南(基礎) 11 CPU的高級代理-DMA

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

    GD32開發實戰指南(基礎) 12 ADC

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

    GD32開發實戰指南(基礎) 14 內部溫度傳感器

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

    GD32開發實戰指南(基礎) 15 低功耗

    GD32的工作電壓(VDD)為2.0~3.6V。通過內置的電壓調節器提供所需的1.8V電源。當主電源VDD掉電后,通過VBAT腳為實時時鐘(RTC)和備份寄存器提供電源。
    的頭像 發表于 05-17 08:59 ?8199次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發</b><b class='flag-5'>實戰</b><b class='flag-5'>指南</b>(基礎<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>15<b class='flag-5'>章</b> 低功耗

    GD32開發實戰指南(基礎) 16 RTC

    開發環境: MDK:Keil 5.30 開發板:GD32F207I-EVAL MCU:GD32F207IK 1 RTC工作原理 1.1 RTC簡介
    的頭像 發表于 05-18 22:14 ?7289次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發</b><b class='flag-5'>實戰</b><b class='flag-5'>指南</b>(基礎<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>16<b class='flag-5'>章</b> RTC

    GD32開發實戰指南(基礎) 17 看門狗

    開發環境: MDK:Keil 5.30 開發板:GD32F207I-EVAL MCU:GD32F207IK GD32 有兩個看門狗, 一個是
    的頭像 發表于 06-03 16:00 ?1.2w次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發</b><b class='flag-5'>實戰</b><b class='flag-5'>指南</b>(基礎<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>17<b class='flag-5'>章</b> 看門狗

    【圖書分享】《STM32庫開發實戰指南

    GPIO入門之流水燈 4 深入分析流水燈例程 5 調試程序第二部分 庫開發中級 
    發表于 03-13 17:01

    Arduino開發實戰指南 AVR

    第一基礎1初識Arduino2編寫Arduino程序
    發表于 08-03 16:14

    GD32 MCU原理及固件庫開發指南》 + 初讀感悟

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

    GD32 MCU原理及固件庫開發指南》+讀后感

    2介紹GD32 MCU快速入門與開發平臺搭建的方法,包括對軟硬件開發平臺、調試工具、GD32
    發表于 06-06 21:52

    GD32開發實戰指南(基礎) 19 程序加密

    GD32通過讀取芯片唯一ID號來實現程序的保護,防止被抄襲。96位的產品唯一身份標識所提供的參考號碼對任意一個GD32微控制器
    的頭像 發表于 05-20 09:10 ?4258次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發</b><b class='flag-5'>實戰</b><b class='flag-5'>指南</b>(基礎<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>19<b class='flag-5'>章</b> 程序加密
    大嘴棋牌手机版| 澳门百家乐官网游戏玩法| 石景山区| 哈巴河县| 百家乐官网怎样投注好| 广德县| 利高百家乐官网娱乐城| 百家乐赌台| 大发888怎么打不开| 大发888娱乐城 34hytrgwsdfpv| 澳门博彩在线| 廉江市| 太阳城百家乐官网怎样开户| 作弊百家乐官网赌具价格| 单机百家乐官网的玩法技巧和规则| 旅百家乐官网赢钱律| 百家乐注册送免费金| 网上百家乐能作弊吗| 百家乐澳门百家乐澳门赌场| 蓝盾百家乐具体玩法技巧| 威尼斯人娱乐电子游戏| 最新娱乐城送彩金| 百家乐官网看点打法| 免费百家乐官网在线| 跨国际百家乐官网的玩法技巧和规则 | 百家乐网页游戏| 太阳城娱乐城官网| 豪杰百家乐官网游戏| 奔驰百家乐官网游戏电玩| 澳门赌百家乐官网的玩法技巧和规则| 百家乐官网真人游戏网| 澳门百家乐官网赢钱公式不倒翁| 网上百家乐官网试玩网址| 百家乐官方游戏| 大发888下载大发888游戏平台| 石泉县| 新天地百家乐官网的玩法技巧和规则| 单机百家乐棋牌| 大发888下载不了| 百家乐官网下注口诀| 御匾会百家乐官网的玩法技巧和规则 |