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

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

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

3天內不再提示

MM32F0140 GPIO學習筆記

jf_pJlTbmA9 ? 來源:靈動MM32MCU ? 作者:靈動MM32MCU ? 2023-09-26 16:42 ? 次閱讀

一、GPIO簡介

GPIO作為通用輸入輸出端口,其全稱為General Purpose Input Output,能夠通過軟件自由配置引腳狀態及工作模式。除通用輸入輸出功能外,部分GPIO端口還可被用作第二功能的配置,即為復用功能。

每個通用I/O端口都可以通過軟件自由配置為4種輸入模式與4種輸出模式。

輸入模式

通過配置GPIOx_CRL寄存器或GPIOx_CRH寄存器中的MODEx[1:0]為00,即配置為輸入模式,配置寄存器中的CNFx[1:0]選擇工作模式(MM32F0140 的GPIOx中“x”的范圍為A到D)。

poYBAGIPMLyAbSsEAACMdAhhNrc594.png 圖1. 輸入浮空/上拉輸入/下拉輸入/模擬輸入配置

輸入浮空:

浮空就是輸入引腳即不接高電平也不接低電平,如圖1所示,I/O端口的數據在每個AHB時鐘被采樣到輸入數據寄存器,通過讀訪問輸入數據寄存器獲取當前I/O狀態,輸入浮空常用于復用功能。

上拉輸入:

電阻與VDD相連,形成上拉電阻,I/O端口在空閑時為高電平,能夠用于檢測由高到低的電平變化,常用于按鍵檢測。

下拉輸入:

電阻與VSS相連,形成下拉電阻,I/O端口在空閑時為低電平,能夠用于檢測由低到高的電平變化。

模擬輸入:

模擬輸入是模擬信號的輸入,在模擬輸入模式下,上拉電阻、下拉電阻及斯密特觸發器均被禁止。

輸出模式

通過配置GPIOx_CRL寄存器或GPIOx_CRH寄存器中的CNFx[1:0]選擇輸出模式,配置GPIOx_CRL中的MODEx[1:0]選擇輸出速度(MODEx[1:0]不為00)。當I/O端口使用復用輸出功能時,端口必須配置為復用功能輸出模式(推挽或開漏),輸出配置如圖2所示。

pYYBAGIPMYqAbtnPAABy3Mf93n4282.png 圖2. 輸出配置

開漏輸出:

在開漏輸出模式中,輸出控制寄存器配置為0時,數據經過輸出控制模塊,MOS管的柵極接收到高電平,MOS管導通,此時I/O端口接通在GND上,即對應引腳輸出低電平;當輸出控制寄存器配置為1,數據經過控制模塊,給予MOS管的柵極一個低電平,此時MOS管不導通,對應的管腳處于高阻態。因此,開漏輸出通常輸出低電平,若要輸出高電平則需外加上拉電阻。

推挽輸出:

推挽輸出一般指兩個MOS管分別受兩個互補信號的控制,總是在一個MOS管導通時另一個MOS管截止。當輸出控制寄存器配置為0時,數據經過輸出控制模塊,MOS管的柵極接收到高電平,N-MOS管導通,P-MOS管不導通,此時I/O端口接通在VSS上,即對應引腳輸出為低電平;當輸出控制寄存器配置為1時,數據經過輸出控制模塊,MOS管的柵極接收到低電平,P-MOS管導通,N-MOS管不導通,此時I/O端口接通在VDD上,即對應引腳輸出為高電平。因此,推挽輸出可以輸出高低電平。

poYBAGIPMc6Aa0N6AACgGSJitjc155.png 圖3. 復用功能配置

復用開漏輸出:

配置GPIOx_AFRH與GPIOx_AFRL寄存器的AFRLx[3:0]與AFRHx[3:0]選擇復用功能。當GPIO被作為第二功能使用時,模式配置為復用模式,復用功能配置如圖3所示。以圖4為例,若要配置PB10引腳作為I2C_SCL,則在配置GPIO模式時要選擇復用模式。通過片上外設復用功能,使用MOS管實現輸出。通常I2C使用GPIO的復用功能時會使用復用開漏輸出模式,由于I2C的一個主設備可掛載多個從設備,若不使用復用開漏輸出,而使用復用推挽輸出,數據傳輸時,兩個從設備一個拉高,一個拉低,可能會造成短路。因此I2C大多使用GPIO的復用開漏輸出模式。

pYYBAGIPMiuAbYObAAFQpPrKxOU703.png 圖4. MM32F0140部分引腳復用功能

復用推挽輸出:

當GPIO被作為第二功能配置使用時,模式需配置為復用模式,通過配置GPIO_AFRH與GPIOx_AFRL寄存器的AFRLx[3:0]與AFRHx[3:0]選擇復用功能,通過片上外設復用功能,使用兩個MOS管來實現輸出。與推挽輸出不同,復用推挽輸出模式下端口的I/O操作由對應復用的功能模塊控制,而推挽輸出模式下控制I/O端口需對GPIO內部的寄存器進行操作。

二、配置GPIO

首先,使能對應I/O口的時鐘,根據所使用的外設對RCC的RCC_AHBENR寄存器進行賦值,將對應外設位置1即可使能時鐘,詳細外設如圖5所示。

poYBAGIPMoGABuh8AAGQ8YMxoLE031.png 圖5. MM32F0140 AHB外設

其次,配置所需的GPIO引腳、速度及工作模式。端口0到端口7使用GPIOx_CRL寄存器配置工作模式與速度,該寄存器中MODEx[1:0]位表示端口輸入輸出速度,CNFx[1:0]位表示端口工作模式(”MODEx”與”CNFx”的”x”表示指定端口號)。若配置GPIOx_CRL寄存器中的MODEx位等于00則端口為輸入模式,此時CNFx位有四種配置方式,分別為:00(模擬輸入模式),01(浮空輸入模式),10(上拉/下拉輸入模式);若MODEx位不為00,則對應端口為輸出模式,此時CNFx具有四種配置方式:00(推挽輸出模式),01(開漏輸出模式),10(推挽復用模式),11(開漏復用模式)。端口8到端口15的配置使用GPIOx_CRH寄存器配置指定端口的工作模式與速度,詳細配置方式與CPIOx_CRL寄存器相同。

若使用端口復用功能,需對GPIOx_AFRL(端口復用功能低位)寄存器與GPIOx_AFRH(端口復用功能高位)寄存器進行配置。端口號為0到7則使用GPIOx_AFRL寄存器,端口號為8到15則使用GPIOx_AFRH寄存器,根據端口號與復用功能表進行配置,例如若使用PA0引腳作為I2C1_SCL,則需將GPIOx_AFRL寄存器中AF3的對應位置1(GPIO的工作模式也要配置為復用模式),PA端口的復用功能表如圖6所示。

poYBAGIPMp6ANC5dAAHq7pAnIeI421.png 圖6 MM32F0140 PA端口復用功能表

三、實驗

本實驗通過使用GPIO獲取按鍵狀態控制LED亮滅,讀取指定GPIO端口引腳的輸入數據(讀GPIOx_IDR寄存器)來獲取當前的按鍵狀態,通過對端口設置/清除寄存器(GPIOx_BSRR寄存器)與端口位清除寄存器(GPIOx_BRR寄存器)的對應端口賦值,使對應的LED亮滅。具體實驗內容為配置PB3引腳對應LED2, PB4引腳對應LED3,PB2引腳對應的K2(如圖7所示),若K2按下,則K2對應的端口輸入低電平,設置實驗現象為LED2滅、LED3亮,K2處于非按下時,K2對應的端口輸入高電平,設置實驗現象為LED2亮、LED3滅。

pYYBAGIPMtaAR3GuAAEfBUfMRUQ878.png 圖7 引腳配置原理圖

外設時鐘初始化

GPIO在AHB線上,實驗使用引腳均為GPIOB組的引腳,因此對RCC_AHBENR寄存器的GPIOB對應位置1。

RCC->AHB1ENR |= (1u << 18u);

按鍵初始化

實驗使用引腳為PB2的K2按鍵,按鍵原理圖如圖8所示,若K2按鍵按下則與GND導通,因此在初始化按鍵時需配置該端口的工作模式為上拉輸入。

pYYBAGIPMvCADsKTAAB9G2AR7ZE828.png 圖8. 按鍵原理圖

GPIOx_CRL寄存器為端口配置低寄存器,用于配置指定端口的速度與工作模式;GPIOx_BSRR寄存器用于設置/清除對應端口,該寄存器低16位的對應端口位置1會產生高電平。由圖9所示,K2所使用的端口2為GPIOx_CRL寄存器內第8~11位。

poYBAGIPMzCAdK0cAAGyJ73y44I238.png 圖9.端口配置低寄存器的比特位

//對應端口的配置涉及到4位,后兩位配置端口輸入輸出速度,前兩位配置工作模式;清零端口2的配置位
GPIOB->CRL  = ~(0xf << 8u); 

//速度配置位為0,端口為輸入模式,上拉輸入的工作模式位為10,因此使用0x08.
GPIOB->CRL |= (0x08 << 8u); 

//配置PB2引腳為高電平
GPIOB->BSRR |= (1u << 2u); 

LED初始化

實驗使用PB3、PB4,引腳,為觀察LED的高低電平,在配置工作模式時使用可以輸出高低電平的推挽輸出。因為PB3與PB4對應端口在端口0~7中,所以使用GPIOx_CRL寄存器對LED進行初始化配置(若使用端口為8~15則使用GPIOx_CRH寄存器)。

如圖9所示,端口3為GPIOx_CRL寄存器內第12~15位,端口4為GPIOx_CRL寄存器內第16~19位。由于LED為低電平點亮,設置GPIOx_BSRR寄存器中LED2與LED3的對應位置1使LED初始狀態為滅。

//復位將要使用的端口3與端口4的配置位
GPIOB->CRL  = ~( (0xf << 12u) | (0xf << 16u) ); 

//端口輸入輸出速度配置位不為00時,端口為輸出模式,配置最大速度為50MHz,推挽輸出模式的配置為00.
GPIOB->CRL |= ( (0x01 << 12u) | (0x01 << 16u) );

//PB3對應的LED2初始化狀態為滅
GPIOB->BSRR = (1u << 3u); 

//PB4對應的LED3初始化狀態為滅
GPIOB->BSRR = (1u << 4u); 

按鍵掃描

讀GPIOx_IDR寄存器獲取對應端口輸入數據,本實驗中K2配置為上拉輸入,即按鍵未按下時為高電平,按下按鍵后,K2對應端口輸入為低電平。若GPIOx_BSRR寄存器的低16位的對應端口位置1,則該端口為高電平;若GPIOx_BRR寄存器的對應端口位置1,則該端口為低電平。實驗設置按鍵未按下時,LED2(PB3)亮、LED3(PB4)滅;按下按鍵時LED2滅、LED3亮。

while(1)
{
    //K2的引腳為PB2,  1u<<2u = 0100u,將PB2的對應位置1,若讀出GPIOx_IDR的對應端口數據為高電平則按鍵未按下
    if ( 0u != ( GPIOB->IDR   (1u << 2u) ) ) 
    {
    //PB4引腳對應的LED3滅
        GPIOB->BSRR = (1u << 4u);

        //PB3引腳對應的LED2亮
        GPIOB->BRR = (1u << 3u); 
    }
    else  //K2 按鍵按下
    {
        //PB4引腳對應的LED3亮
        GPIOB->BRR =(1u << 4u);

        //PB3引腳對應的LED2滅
        GPIOB->BSRR = (1u << 3u);
    }
}

Main()函數

綜合上述寄存器配置到main函數中,圖10為實驗效果。

int main(void)
{
    //GPIOB時鐘初始化
    RCC->AHB1ENR |= (1u << 18u);

    //清零端口2的配置位
    GPIOB->CRL  = ~(0xfu << 8u);
    //端口2配置為上拉輸入
    GPIOB->CRL |= (0x08u << 8u);
    //端口2配置為高電平
    GPIOB->BSRR |= (1u << 2u);

    //端口3與端口4配置位清零
    GPIOB->CRL  = ~( (0xf << 12u) | (0xf << 16u) );
    //端口3與端口4配置為推挽輸出,速度最大為50MHz
    GPIOB->CRL |= ( (0x01 << 12u) | (0x01 << 16u) );

    //PB3對應的LED2初始化狀態為滅
    GPIOB->BSRR = (1u << 3u);
    //PB4對應的LED3初始化狀態為滅
    GPIOB->BSRR = (1u << 4u);

    while(1)
    {
        //K2的引腳為PB2,  1u << 2u = 0100u,將PB2的對應位置1,若讀出GPIOx_IDR的對應端口數據為高電平則按鍵未按下
        if ( 0u != ( GPIOB->IDR   (1u << 2u) ) ) 
        {
            // PB4引腳對應的LED3滅
            GPIOB->BSRR = (1u << 4u);

            //PB3引腳對應的LED2亮
            GPIOB->BRR = (1u << 3u); 
        }
        else  //按下按鍵K2
        {
            // PB4引腳對應的LED3亮
            GPIOB->BRR = (1u << 4u);

            // PB3引腳對應的LED2滅
            GPIOB->BSRR = (1u << 3u); 
        }
    }
}

pYYBAGIPM_uAZ5oNAE3b__SbHbw971.gif 圖9.實驗效果

來源:靈動MM32MCU

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

    關注

    31

    文章

    5343

    瀏覽量

    120422
  • 端口
    +關注

    關注

    4

    文章

    967

    瀏覽量

    32084
  • GPIO
    +關注

    關注

    16

    文章

    1204

    瀏覽量

    52122
收藏 人收藏

    評論

    相關推薦

    靈動微課堂 (第201講) | MM32F0140 GPIO 學習筆記

    模式。圖4. MM32F0140部分引腳復用功能復用推挽輸出:當GPIO被作為第二功能配置使用時,模式需配置為復用模式,通過配置GPIO_AFRH與GPIOx_AFRL寄存器的AFRLx[3:0
    發表于 02-18 13:53

    AN0052從MM32F0130移植到MM32F0140(英文版)

    AN0052 從MM32F0130移植到MM32F0140(英文版)
    發表于 02-22 18:43 ?0次下載
    AN0052從<b class='flag-5'>MM32F</b>0130移植到<b class='flag-5'>MM32F0140</b>(英文版)

    MM32F0140 產品手冊(中文版)

    MM32F0140 產品手冊(中文版)
    發表于 02-22 18:45 ?0次下載
    <b class='flag-5'>MM32F0140</b> 產品手冊(中文版)

    MM32F0140 產品手冊(英文版)

    MM32F0140 產品手冊(英文版)
    發表于 02-22 18:45 ?0次下載
    <b class='flag-5'>MM32F0140</b> 產品手冊(英文版)

    MM32F0140 用戶手冊(中文版)

    MM32F0140 用戶手冊(中文版)
    發表于 02-22 18:46 ?0次下載
    <b class='flag-5'>MM32F0140</b> 用戶手冊(中文版)

    MM32F0140 用戶手冊(英文版)

    MM32F0140 用戶手冊(英文版)
    發表于 02-22 18:46 ?0次下載
    <b class='flag-5'>MM32F0140</b> 用戶手冊(英文版)

    MM32F0140 勘誤表(中文版)

    MM32F0140 勘誤表(中文版)
    發表于 02-22 18:47 ?0次下載
    <b class='flag-5'>MM32F0140</b> 勘誤表(中文版)

    MM32F0140 勘誤表(英文版)

    MM32F0140 勘誤表(英文版)
    發表于 02-22 18:48 ?0次下載
    <b class='flag-5'>MM32F0140</b> 勘誤表(英文版)

    基于MM32F0140的UDS Bootloader學習筆記

    基于MM32F0140的UDS Bootloader學習筆記
    的頭像 發表于 10-30 17:11 ?778次閱讀
    基于<b class='flag-5'>MM32F0140</b>的UDS Bootloader<b class='flag-5'>學習</b><b class='flag-5'>筆記</b>

    MM32F0140學習筆記——CRC

    MM32F0140學習筆記——CRC
    的頭像 發表于 11-10 18:27 ?626次閱讀
    <b class='flag-5'>MM32F0140</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>——CRC

    MM32F0140學習筆記——窗口看門狗(WWDG)

    MM32F0140學習筆記——窗口看門狗(WWDG)
    的頭像 發表于 10-27 09:45 ?637次閱讀
    <b class='flag-5'>MM32F0140</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>——窗口看門狗(WWDG)

    MM32F0140學習筆記——FlexCAN 控制器局域網

    MM32F0140學習筆記——FlexCAN 控制器局域網
    的頭像 發表于 10-27 09:25 ?1479次閱讀
    <b class='flag-5'>MM32F0140</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>——FlexCAN 控制器局域網

    MM32F0140 SPI學習筆記

    MM32F0140 SPI學習筆記
    的頭像 發表于 09-26 16:51 ?604次閱讀
    <b class='flag-5'>MM32F0140</b> SPI<b class='flag-5'>學習</b><b class='flag-5'>筆記</b>

    MM32F0140 DMA學習筆記

    MM32F0140 DMA 學習筆記
    的頭像 發表于 09-18 16:57 ?713次閱讀
    <b class='flag-5'>MM32F0140</b> DMA<b class='flag-5'>學習</b><b class='flag-5'>筆記</b>

    MM32F0140 UART學習筆記

    MM32F0140 UART學習筆記
    的頭像 發表于 09-26 16:45 ?768次閱讀
    <b class='flag-5'>MM32F0140</b> UART<b class='flag-5'>學習</b><b class='flag-5'>筆記</b>
    主站蜘蛛池模板: 2018年免费三级av观看| 免费欧美大片| 美女的让男人桶爽网站| 亚洲国产欧美另类| 超碰97超碰在线视频哦| 成电影人免费网站| 妞干网手机免费视频| 影音先锋电影资源av| 大陆老太交xxxxxhd在线| 欧美久久综合网| a视频在线看| 琪琪午夜福利免费院| 成人免费视频在线观看| 黑兽在线观看高清在线播放樱花| 四房播播最新地址| 国产精品一区二区亚瑟不卡| 污污又黄又爽免费的网站| 国产 交换 丝雨 巅峰| 久久综久久美利坚合众国| 偷拍亚洲制服另类无码专区| 高中生被C到爽哭视频免费| 挺进绝色老师的紧窄小肉六| 国产视频www| 在线亚洲黄色| 热の中文 AV天堂| 国产露脸无码A区久久蘑菇| 亚洲 日韩 自拍 视频一区| 国产亚洲精品久久久无码狼牙套| 一本色道久久综合亚洲精品 | GOGOGO高清免费播放| 日本阿v片在线播放免费| 国产热久久精| 98久久人妻少妇激情啪啪| 久久久免费观看| jizz非洲| 亚洲AV成人无码999WWW| 久久中文字幕无码A片不卡| 被黑人做的白浆直流| 亚洲AV无码影院在线播放| 久久资源365| 国产久久热99视频|