<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          STM32 GPIO入門學習

          作者: 時間:2016-11-13 來源:網(wǎng)絡 收藏
          今天下午開始學習STM32GPIO控制,開始以為跟AVR單片機一樣,只是設(shè)置方向寄存器跟引腳寄存器,一排引腳由8位變16位而已,誰知道一看資料才發(fā)現(xiàn)居然還有IO口狀態(tài)設(shè)置,設(shè)置速度設(shè)置…

          不過還好,使用的是STM32的FWLib3.0軟件包,里面的GPIO口函數(shù)都做好了,只要看一下使用就可以了。

          先看一些網(wǎng)上跟書上找到的資料跟自己總結(jié)的咚咚:

          1.STM32每個GPI/O 端口有兩個32 位配置寄存器(GPIOx_CRL,GPIOx_CRH),兩個32位數(shù)據(jù)寄存器(GPIOx_IDR,GPIOx_ODR),一個32 位置位/復位寄存器(GPIOx_BSRR),一個16 位復位寄存器(GPIOx_BRR)和一個32 位鎖定寄存器(GPIOx_LCKR)。

          2.GPIO 端口的每個位可以由軟件分別配置成多種模式。每個I/O 端口位可以自由編程,然而I/0 端口寄存器必須按32 位字被訪問(不允許半字或字節(jié)訪問)。GPIOx_BSRR 和GPIOx_BRR 寄存器允許對任何GPIO 寄存器的讀/更改的獨立訪問;這樣,在讀和更改訪問之間產(chǎn)生IRQ 時不會發(fā)生危險。端口位配置 CNFx[1:0]=xxb,MODEx[1:0]=xxb

          3.GPIO_InitTypeDef是GPIO口的一個定義結(jié)構(gòu)體,包含一個16位的變量GPIO_Pin;一個GPIOSpeed_TypeDef枚舉結(jié)構(gòu)體GPIO_Speed;一個GPIOMode_TypeDef 枚舉結(jié)構(gòu)體GPIO_Mode;這3個變量可以在外部被定義,用于初始化或者改變某些GPIO的速度跟類型。

          typedef enum
          {
          GPIO_Speed_10MHz = 1,
          GPIO_Speed_2MHz,
          GPIO_Speed_50MHz
          }GPIOSpeed_TypeDef;

          typedef enum表示定義了一個枚舉型的數(shù)據(jù)結(jié)構(gòu),可以用GPIOSpeed_TypeDef去定義變量,這個變量的取值就是
          GPIO_Speed_10MHz ,GPIO_Speed_2MHz, GPIO_Speed_50MHz中的一個。默認為零,其后面的依次加1。這些都可以自己取值,如
          GPIO_Speed_10MHz 就等于1,其后還是依次加1.




          4.強大的GPIO口設(shè)置:

          GPIOMode_TypeDef GPIO mode定義及偏移地址
          GPIO_Mode_AIN 0x00 模擬輸入
          GPIO_Mode_IN_FLOATING 0x04 懸空輸入
          GPIO_Mode_IPD 0x28 下拉輸入
          GPIO_Mode_IPU 0x48 上拉輸入
          GPIO_Mode_Out_OD 0x14 開漏輸出
          GPIO_Mode_Out_PP 0x10 推挽輸出 推挽模式,寫數(shù)據(jù)時,需要設(shè)置IO口為有上拉電阻模式
          GPIO_Mode_AF_OD 0x1c 開漏復用
          GPIO_Mode_AF_PP 0x18 推挽復用



          5.輸出速度可選擇:2MHz,10MHz,50MHz。

          6.IO口功能:通用I/O(GPIO)用,輸入輸出;單獨的位設(shè)置或位清除;外部中斷/喚醒線:端口必須配置成輸入模式時,所有端口都有外部中斷能力;復用功能(AF),并且軟件能重新映射I/O復用功能;GPIO鎖定機制:主要針對復位設(shè)定的,當某端口位lock后,復位后將不改變的此端口的位配置。

          使用起來如果自己去讀寫寄存器地址操作,還是十分麻煩的,還好FWLib3.0軟件包里面的GPIO庫文件已經(jīng)為我們準備好了很多的操作函數(shù),可以直接使用。

          下面熟悉一些會比較經(jīng)常使用的:

          1.void GPIO_DeInit(GPIO_TypeDef* GPIOx):直接初始化某排引腳的外圍寄存器到復位的默認值。

          2.void GPIO_AFIODeInit(void):字面理解是復用IO的初始化,但是IO的服用現(xiàn)在還沒學習到…先空起

          3.void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct):根據(jù)GPIO_InitTypeDef里面的值,初始化某排里面的某些引腳的模式跟速度

          4.void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct):給GPIO_InitTypeDef里面的項目賦默認值

          5.uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin):讀某一排引腳里面某個引腳的值

          6.uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx):讀整排引腳的值

          7.uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin):讀某排引腳里面的輸出寄存器的某個引腳值

          8.uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx):讀某排引腳輸出寄存器里面值

          9.void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin):某排引腳某個引腳輸出1

          10.void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin):某排引腳某個引腳輸出0

          11.void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal):設(shè)置某排引腳某個引腳的輸出值

          12.void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal):設(shè)置某排引腳輸出值

          13.void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin):鎖定某排引腳中某個引腳,復位時候設(shè)置不變。

          14.void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource):選擇某個引腳當事件輸出,不清楚蝦米意思…

          15.void GPIO_EventOutputCmd(FunctionalState NewState):啟用或禁止事件輸出..同上,不解

          16.void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState):修改復用引腳映射

          17.void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource):選擇某個引腳當外部中斷用

          >.< 具體函數(shù)里面的操作看得有點暈 ..哎 后悔在學校時候C/C++沒學好,給UESTC丟人了…不過看注釋,參數(shù)加名字猜,作用還是可以猜到的,使用起來也比較方便…

          在昨天建好的新project里面,打開main.c,把里面內(nèi)容刪除,開始寫跑馬燈程序…

          #include "stm32f10x.h"
          #include "stm32f10x_conf.h"

          GPIO_InitTypeDef PC;

          void LED_Init(void)
          {
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//開GPIOC時鐘
          PC.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
          PC.GPIO_Mode = GPIO_Mode_Out_PP;
          PC.GPIO_Speed = GPIO_Speed_2MHz;
          GPIO_Init(GPIOC, &PC);

          }

          void Delay(vu32 nCount)
          {
          for(; nCount != 0; nCount—);
          }

          main()
          {
          LED_Init();
          while(1)
          { GPIO_SetBits(GPIOC, GPIO_Pin_6);//GPIOC.6=1
          Delay(0x8ffff);
          GPIO_ResetBits(GPIOC, GPIO_Pin_6);//GPIOC.6=0
          Delay(0x8ffff);
          GPIO_SetBits(GPIOC, GPIO_Pin_7);//GPIOC.7=1
          Delay(0x8ffff);
          GPIO_ResetBits(GPIOC, GPIO_Pin_7);//GPIOC.7=0
          Delay(0x8ffff);
          GPIO_SetBits(GPIOC, GPIO_Pin_8);//GPIOC.8=1
          Delay(0x8ffff);
          GPIO_ResetBits(GPIOC, GPIO_Pin_8);//GPIOC.8=0
          Delay(0x8ffff);
          GPIO_SetBits(GPIOC, GPIO_Pin_9);//GPIOC.9=1
          Delay(0x8ffff);
          GPIO_ResetBits(GPIOC, GPIO_Pin_9);//GPIOC.9=0
          Delay(0x8ffff);
          }

          }

          把LED的正極連在GPIO的6-9pin上,負極都連到地上后,Rebuilt All~然后Download and Debug… 然后在調(diào)試界面里面Run~ 嘿嘿 看到跑馬燈效果了…N年前開始玩51的時候也是這個開始的…不過那個程序多簡單- -||| 直接把一個1位移,然后PC等于過去就行了…

          跑馬燈之后我又試著用5個GPIO口來驅(qū)動一個串口的點陣屏幕,估計是2MHz還太快的原因,一直沒把它點亮…明天加延時跟修改下其他的,看看能不能把它點亮。


          關(guān)鍵詞: STM32GPIO入門學

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();