<center id="qkqgy"><optgroup id="qkqgy"></optgroup></center>
  • <menu id="qkqgy"></menu>
    <nav id="qkqgy"></nav>
    <xmp id="qkqgy"><nav id="qkqgy"></nav>
  • <xmp id="qkqgy"><menu id="qkqgy"></menu>
    <menu id="qkqgy"><menu id="qkqgy"></menu></menu>
    <tt id="qkqgy"><tt id="qkqgy"></tt></tt>

  • <>前言

    時不可以茍遇,道不可以虛行。

    <>一、GPIO 基本結構和工作方式

    * IO口引腳
    * stm32的大部分引腳除了當GPIO使用外,還可以復用為外設功能引腳(比如串口)
    1、GPIO 的工作方式

    * 四種輸入模式:
    * 輸入浮空 (_IN_FLOATING_)
    * 輸入上拉 (In Pull Up:IPU)
    * 輸入下拉 (In Pull Down:IPD)
    * 模擬輸入 (AIN:Analog In)
    * 四種輸出模式:
    * 開漏輸出(帶上拉或者下拉):_Out_OD_(Out Open Drain)
    * 開漏復用功能(帶上拉或者下拉):AF_OD
    * 推挽式輸出(帶上拉或者下拉):Out_PP(Out Push Pull),點燈
    * 推挽式復用功能(帶上拉或者下拉):AF_PP
    * 四種最大速度:
    * 2 MHz
    * 25 MHz
    * 50 MHz
    * 100 MHz
    * 推挽輸出:可以輸出強高低電平,連接數字器件
    *
    開漏輸出:只可以輸出強低電平,高電平得靠外部電阻拉高。輸出端相當于三極管的集電極,要得到高電平狀態需要上拉電阻,適合做電流型的驅動,其吸收電流的能力相對強(一般在
    20 MA 以內)
    <>二、GPIO寄存器說明

    <>GPIO 相關配置寄存器:

    <>3、STM32F4xx GPIO 引腳說明

    <>- 端口復用

    *
    STM32F4 的大部分端口都具有復用功能。

    所謂復用,就是一些端口不僅僅可以做為通用的 IO 口,還可以復用為一些外設引腳,比如:PA9、PA10 可以復用為 STM32F4 的串口 1 引腳。

    *
    作用:最大限度的利用端口資源。

    <>- 所有 IO 口都可以作為中斷輸入

    <>四、GPIO 庫函數介紹

    <>庫函數代碼:

    * main.c: #include "stm32f4xx.h" #include "LED.h" #include "delay.h" /**
    庫函數版本 **/ int main(void) { delay_init(168); LED_Init(); while(1) { GPIO_SetBits(
    GPIOF,GPIO_Pin_9); GPIO_ResetBits(GPIOF,GPIO_Pin_10); delay_ms(500);
    GPIO_SetBits(GPIOF,GPIO_Pin_10); GPIO_ResetBits(GPIOF,GPIO_Pin_9); delay_ms(500)
    ; } }
    * LED.c: #include "LED.h" /** 庫函數版本 **/ void LED_Init(void) {
    GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF
    ,ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.
    GPIO_Pin= GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_OType =
    GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.
    GPIO_Speed= GPIO_Speed_50MHz; GPIO_Init(GPIOF, &GPIO_InitStructure);
    GPIO_SetBits(GPIOF, GPIO_Pin_9 | GPIO_Pin_10); }
    * LED.h: #ifndef _LED_H_ #define _LED_H_ #include "stm32f4xx.h" void LED_Init(
    void); #endif
    <>五、寄存器配置

    <>寄存器代碼:

    * main.c: #include "stm32f4xx.h" #include "LED.h" #include "delay.h" /**
    寄存器版本 **/ int main(void) { delay_init(168); LED_Init(); while(1) { GPIOF->ODR &=
    1 << 9; //PF9:0 GPIOF->ODR &= 1 << 10; //PF10:0 delay_ms(500); GPIOF->ODR |= 1
    << 9; //PF9:1 GPIOF->ODR |= 1 << 10; //PF10:1 delay_ms(500); } }
    * LED.c: #include "LED.h" /** 寄存器版本 **/ void LED_Init(void) { RCC->AHB1ENR |=
    1 << 5; // 1 左移 5 位,將寄存器的第五位設置為1,其他位不變 //PF9 // 11 =
    3,左移18(2*9)位,然后再取反,將MODER寄存器的18、19位清零,其他位不變 GPIOF->MODER &= ~(3 << 2*9); //
    01(通用輸出功能) = 1,左移18(2*9)位,將MODER寄存器的19、18位置為01,其他位不變 GPIOF->MODER |= 1 << (2*9);
    // 11 = 3,左移18(2*9)位,然后再取反,將OSPEEDR寄存器的18、19位清零,其他位不變 GPIOF->OSPEEDR &= ~(3 << 2
    *9); // 10(50MHz:快速) = 2,左移18(2*9)位,將OSPEEDR寄存器的19、18位置為10,其他位不變 GPIOF->OSPEEDR
    |= 2 << (2*9); GPIOF->OTYPER &= ~(1 << 9); GPIOF->OTYPER |= 0 << 9; // 11 =
    3,左移18(2*9)位,然后再取反,將PUPDR寄存器的18、19位清零,其他位不變 GPIOF->PUPDR &= ~(3 << 2*9); //
    01(上拉) = 1,左移18(2*9)位,將PUPDR寄存器的19、18位置為01,其他位不變 GPIOF->PUPDR |= 1 << (2*9);
    //輸出高低電平:使用ODR寄存器 GPIOF->ODR |= 1 << 9; //1 //GPIOF->ODR &= 1 << 9; //0 //PF10
    GPIOF->MODER &= ~(3 << 2*10); GPIOF->MODER |= 1 << (2*10); GPIOF->OSPEEDR &= ~(3
    << 2*10); GPIOF->OSPEEDR |= 2 << (2*10); GPIOF->OTYPER &= ~(1 << 10); GPIOF->
    OTYPER|= 0 << 10; GPIOF->PUPDR &= ~(3 << 2*10); GPIOF->PUPDR |= 1 << (2*10);
    GPIOF->ODR |= 1 << 10; //1 }
    * LED.h: #ifndef _LED_H_ #define _LED_H_ #include "stm32f4xx.h" void LED_Init(
    void); #endif
    <>六、位操作

    <>1、位操作基本原理

    位帶操作簡單的說,就是 把每個比特膨脹為一個 32 位的字,當訪問這些字的時候就達到了訪問比特的目的,比如說 GPIO 的 ODR 寄存器有 32
    個位,那么可以映射到 32 個地址上,我們去訪問這 32 個地址就達到訪問 32 個比特的目的。這樣我們往某個地址寫 1 就達到往對應比特位寫 1
    的目的,同樣往某個地址寫 0 就達到往對應的比特位寫 0 的目的。

    <>映射關系

    * 位帶區:支持位帶操作的地址區
    * 位帶別名:對別名地址的訪問最終作用到位帶區的訪問上
    支持位帶操作的兩個內存區的范圍是:

    * 0x2000_0000 ~ 0x200F_FFFF (SRAM 區中的最低 1 MB)
    * 0x4000_0000 ~ 0x400F_FFFF (片上外設區中最低 1 MB)
    對于 SRAM 位帶區的某個比特,記它所在字節地址為 A,位序號為 n(0 <= n <= 7),則該比特在別名區的地址為:

    對于 片上外設 位帶區的某個比特,記它所在字節地址為 A,位序號為 n(0 <= n <= 7),則該比特在別名區的地址為:

    <>位帶操作代碼:

    * main.c: #include "stm32f4xx.h" #include "LED.h" #include "delay.h" #include
    "sys.h" /** 位帶操作版本 **/ int main(void) { delay_init(168); LED_Init(); while(1) {
    PFout(9) = 1; PFout(10) = 1; delay_ms(500); PFout(9) = 0; PFout(10) = 0;
    delay_ms(500); } }

    技術
    下載桌面版
    GitHub
    百度網盤(提取碼:draw)
    Gitee
    云服務器優惠
    阿里云優惠券
    騰訊云優惠券
    華為云優惠券
    站點信息
    問題反饋
    郵箱:ixiaoyang8@qq.com
    QQ群:766591547
    關注微信
    巨胸美乳无码人妻视频