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

歷史上的今天

今天是:2025年07月17日(星期四)

2020年07月17日 | ST之GPIO使用之理解

發(fā)布者:Ziyu2022 來源: eefocus關(guān)鍵字:ST  GPIO使用  結(jié)構(gòu)體 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

在使用ST單片機(jī)的GPIO時(shí),會(huì)經(jīng)常涉及到2個(gè)結(jié)構(gòu)體的使用


typedef struct

{

  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.         This parameter can be any value of @ref GPIO_pins_define */



  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.    This parameter can be a value of @ref GPIOSpeed_TypeDef */



  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.  This parameter can be a value of @ref GPIOMode_TypeDef */

}GPIO_InitTypeDef;



typedef struct

{

  __IO uint32_t CRL;

  __IO uint32_t CRH;

  __IO uint32_t IDR;

  __IO uint32_t ODR;

  __IO uint32_t BSRR;

  __IO uint32_t BRR;

  __IO uint32_t LCKR;

} GPIO_TypeDef;


這2個(gè)結(jié)構(gòu)體在使用時(shí)往往會(huì)令初學(xué)者感到混淆,GPIO_InitTypeDef 和  GPIO_TypeDef 都是一個(gè)結(jié)構(gòu)體類型,我們要用它來定義一個(gè)結(jié)構(gòu)體變量。


我們一般這樣來使用GPIO_InitTypeDef,


GPIO_InitTypeDef GPIO_InitStructure;   /*先定義一個(gè)結(jié)構(gòu)體變量 */


/* 對(duì)變量中的成員進(jìn)行初始化定義*/

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;


/* 開啟相應(yīng)的端口時(shí)鐘*/


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);


/* 將定義的結(jié)構(gòu)體的變量中的知傳給GPIO的寄存器*/


GPIO_Init(GPIOB, &GPIO_InitStructure);




我們?cè)賮砜纯磛oid GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) 這個(gè)函數(shù),


void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

{

  uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;

  uint32_t tmpreg = 0x00, pinmask = 0x00;

  /* Check the parameters */

  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));

  assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));  

  

/*---------------------------- GPIO Mode Configuration -----------------------*/

  currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);

  if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)

  { 

    /* Check the parameters */

    assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));

    /* Output mode */

    currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;

  }

/*---------------------------- GPIO CRL Configuration ------------------------*/

  /* Configure the eight low port pins */

  if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00)

  {

    tmpreg = GPIOx->CRL;

    for (pinpos = 0x00; pinpos < 0x08; pinpos++)

    {

      pos = ((uint32_t)0x01) << pinpos;

      /* Get the port pins position */

      currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;

      if (currentpin == pos)

      {

        pos = pinpos << 2;

        /* Clear the corresponding low control register bits */

        pinmask = ((uint32_t)0x0F) << pos;

        tmpreg &= ~pinmask;

        /* Write the mode configuration in the corresponding bits */

        tmpreg |= (currentmode << pos);

        /* Reset the corresponding ODR bit */

        if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)

        {

          GPIOx->BRR = (((uint32_t)0x01) << pinpos);

        }

        else

        {

          /* Set the corresponding ODR bit */

          if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)

          {

            GPIOx->BSRR = (((uint32_t)0x01) << pinpos);

          }

        }

      }

    }

    GPIOx->CRL = tmpreg;

  }

/*---------------------------- GPIO CRH Configuration ------------------------*/

  /* Configure the eight high port pins */

  if (GPIO_InitStruct->GPIO_Pin > 0x00FF)

  {

    tmpreg = GPIOx->CRH;

    for (pinpos = 0x00; pinpos < 0x08; pinpos++)

    {

      pos = (((uint32_t)0x01) << (pinpos + 0x08));

      /* Get the port pins position */

      currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos);

      if (currentpin == pos)

      {

        pos = pinpos << 2;

        /* Clear the corresponding high control register bits */

        pinmask = ((uint32_t)0x0F) << pos;

        tmpreg &= ~pinmask;

        /* Write the mode configuration in the corresponding bits */

        tmpreg |= (currentmode << pos);

        /* Reset the corresponding ODR bit */

        if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)

        {

          GPIOx->BRR = (((uint32_t)0x01) << (pinpos + 0x08));

        }

        /* Set the corresponding ODR bit */

        if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)

        {

          GPIOx->BSRR = (((uint32_t)0x01) << (pinpos + 0x08));

        }

      }

    }

    GPIOx->CRH = tmpreg;

  }

}


乍一看,沒看懂,但我們能清楚地看到這些語句


GPIOx->BRR = (((uint32_t)0x01) << pinpos);


GPIOx->BSRR = (((uint32_t)0x01) << pinpos);


GPIOx->CRL = tmpreg;


GPIOx->CRH = tmpreg;


具體過程是怎么執(zhí)行的我也沒看明白,但沒關(guān)系,只要知道這個(gè)函數(shù)是對(duì)GPIO的BRR,BSRR,CRL,CRH寄存器進(jìn)行了相關(guān)操作就OK了,


最后的結(jié)果就是對(duì)單片機(jī)的PB口進(jìn)行了這些設(shè)置:


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;




另外,這個(gè)結(jié)構(gòu)體


typedef struct

{

  __IO uint32_t CRL;

  __IO uint32_t CRH;

  __IO uint32_t IDR;

  __IO uint32_t ODR;

  __IO uint32_t BSRR;

  __IO uint32_t BRR;

  __IO uint32_t LCKR;

} GPIO_TypeDef;


是用來定義這些變量的,如下:


#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)

#define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)

#define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)

#define GPIOD               ((GPIO_TypeDef *) GPIOD_BASE)

#define GPIOE               ((GPIO_TypeDef *) GPIOE_BASE)

#define GPIOF               ((GPIO_TypeDef *) GPIOF_BASE)

#define GPIOG               ((GPIO_TypeDef *) GPIOG_BASE)


而如下結(jié)構(gòu)體


typedef struct

{

  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.         This parameter can be any value of @ref GPIO_pins_define */



  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.    This parameter can be a value of @ref GPIOSpeed_TypeDef */



  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.  This parameter can be a value of @ref GPIOMode_TypeDef */

}GPIO_InitTypeDef;


一般用來定義一個(gè)變量就OK,如GPIO_InitTypeDef GPIO_InitStructure;

關(guān)鍵字:ST  GPIO使用  結(jié)構(gòu)體 引用地址:ST之GPIO使用之理解

上一篇:GPIO復(fù)位函數(shù)void GPIO_DeInit(GPIO_TypeDef* GPIOx) 的理解
下一篇:ST官方庫函數(shù)之GPIO口讀寫函數(shù)

推薦閱讀

在ARM Cortex-M3內(nèi)核中有一個(gè)Systick定時(shí)器,它是一個(gè)24位的倒計(jì)數(shù)定時(shí)器,當(dāng)計(jì)數(shù)到0時(shí),它就會(huì)從Load寄存器中自動(dòng)重裝定時(shí)初值,只要不把CTRL寄存器中的ENABLE清0,它就永不停。對(duì)于滴答定時(shí)器的理解主要分為下面幾項(xiàng):1.滴答定時(shí)器的時(shí)鐘來源看上面的圖會(huì)有一個(gè)錯(cuò)覺,以為滴答定時(shí)器是系統(tǒng)時(shí)鐘的1/8,其實(shí)不是,滴答定時(shí)器的時(shí)鐘既可以是HCLK/8,也可以...
據(jù)BusinessKorea報(bào)道,隨著日本政府限制向韓國出口半導(dǎo)體材料,內(nèi)存芯片的國際現(xiàn)貨價(jià)格正在快速反彈。在這種情況下,預(yù)計(jì)全球半導(dǎo)體市場(chǎng)狀況將比先前預(yù)期更好。根據(jù)市場(chǎng)研究公司DRAMeXchange的數(shù)據(jù),DRAM現(xiàn)貨價(jià)格在上周和本周均有所上漲,而NAND閃存價(jià)格在上個(gè)月末開始逐漸上漲。PC DRAM(DDR4 8Gb)價(jià)格從7月11日到15日,上漲了11.8%,而DDR3 4Gb上漲...
中央社消息,臺(tái)積電美國存托憑證漲多回檔,總市值仍達(dá)3127億美元,超越三星的2926億美元,位居全球半導(dǎo)體企業(yè)之冠。臺(tái)積電7月以來在營運(yùn)前景樂觀,市場(chǎng)買盤積極涌入下,ADR頻創(chuàng)歷史新高,15日早盤一度達(dá)67.21美元,再創(chuàng)新高。臺(tái)積電今日公布2020年第二季財(cái)務(wù)報(bào)告,單季合并營收約3,107億元新臺(tái)幣(下同),與上季相較大致持平,較2019年同期則增加28.9%;...
(文/程文智)7月15日,在第七屆中國機(jī)器人峰會(huì)暨智能經(jīng)濟(jì)人才峰會(huì)上,中國工程院院士、國家農(nóng)業(yè)信息化工程技術(shù)研究趙春江分享了《農(nóng)業(yè)機(jī)器人展望》的報(bào)告。他在分享中提到,2020年農(nóng)業(yè)機(jī)器人市場(chǎng)的規(guī)模大概為74億美元,預(yù)計(jì)2025年達(dá)到206億美元。他同時(shí)提到了目前農(nóng)業(yè)機(jī)器人遇到的瓶頸問題,以及目前我國在農(nóng)業(yè)機(jī)器人方面的一些實(shí)踐案例。圖:中國工程院...

史海拾趣

問答坊 | AI 解惑

做單片機(jī)編程

做單片機(jī)編程   聯(lián)系人QQ263539498                         聯(lián)系人郵箱jidexiu2001@yahoo.com.cn            ...…

查看全部問答∨

有人用tftpd32.exe做服務(wù)器下載程序到開發(fā)板么?

我怎么下載不了 在PC本機(jī)上測(cè)試,可以下載。 但用開發(fā)板下載不了,在PC上用抓包軟件能看到開發(fā)板發(fā)來的請(qǐng)求,但tftpd32.exe沒反應(yīng)…

查看全部問答∨

wince看門狗的問題

wince啟動(dòng)后,怎樣判斷這次啟動(dòng)是看門狗重啟,還是正常啟動(dòng)?…

查看全部問答∨

尋求幫助 2010芯片

請(qǐng)問誰有2010芯片的資料,來控制LED用的!非常感謝阿…

查看全部問答∨

arm-linux-gcc 交叉工具鏈的安裝方法

今天看了國嵌的視頻,覺得里面的交叉工具連的制作講得很清楚、明了,之前在網(wǎng)上找了好多資料,不是說的很繁瑣,就是講得含糊不清。我想總結(jié)一下,希望能幫助初學(xué)者能快速的學(xué)會(huì),其實(shí)我也是初學(xué)者!1. 需要的文件: 已經(jīng)編譯好的 arm-linux-gcc壓 ...…

查看全部問答∨

Am29lv400b的Verilog模型

看到論壇上有SDRAM和SRAM的模型,我來上傳一個(gè)FALSH的模型,幫忙補(bǔ)全!…

查看全部問答∨

急死了

馬上就要答辯了 還沒弄好畢業(yè)設(shè)計(jì) 愁愁愁~~…

查看全部問答∨

高速PCB設(shè)計(jì)之布局篇

 高速PCB設(shè)計(jì)之布局篇                                  & ...…

查看全部問答∨

請(qǐng)?jiān)敿?xì)講解一下#define st(x) do { x } while (__LINE__ == -1)

#define st(x)      do { x } while (__LINE__ == -1) 那么程序中 st( EA = 0; );//EA當(dāng)作一個(gè)變量吧 怎么理解?…

查看全部問答∨

【MSP430 編譯器使用經(jīng)驗(yàn)】IAR開發(fā)MSP430入門篇

本帖最后由 霹靂之火 于 2014-8-5 20:49 編輯 IAR有針對(duì)很對(duì)種芯片的版本,比如針對(duì)ARM核的IAR for ARM. IAR for AVR是針對(duì)AVR單片機(jī)的,IAR for MSP430是針對(duì)TI出品的MSP430系列單片機(jī)的. 你需要根據(jù)你使用的芯片選擇. 為了學(xué)習(xí)用,可以下載先嘗 ...…

查看全部問答∨
小廣播
設(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