久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3210|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32達(dá)人的GPIO使用心得

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:82083 發(fā)表于 2015-6-6 15:17 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
1. 我使用GPIO的不同就是,GPIO 操作是直接動(dòng)用了STM32 內(nèi)部的寄存器的.雖說(shuō)庫(kù)好用,但對(duì)于某些IO 操作,很多人都會(huì)嫌庫(kù)的效率底下(包括我自己在內(nèi)),總得對(duì)STM32 的寄存器看兩眼的吧,不然還不敢叫STM32 達(dá)人!

2. 當(dāng)然了,即使直接操作寄存器了,但一些方便的宏定義還是用庫(kù)里面的好,反正宏定義本身并不影響效率.這里要說(shuō)一下MDK 的一個(gè)重要技巧,就是把工程編譯完以后,在變量或函數(shù)體上按下F12 鍵,就會(huì)自動(dòng)跳轉(zhuǎn)到這個(gè)變量或函數(shù)的定義處.要研究庫(kù)代碼,這個(gè)技巧必不可少,不然在大堆C文件里找一個(gè)定義是相當(dāng)累人的.

大家看看ST 官方庫(kù)里面對(duì)各個(gè)寄存器的定義,是使用結(jié)構(gòu)體的,可謂相當(dāng)有技巧,首先要定義幾個(gè)基礎(chǔ)地址:

//定義片內(nèi)外設(shè)基礎(chǔ)地址
#define PERIPH_BASE ((uint32_t)0x40000000)

//定義APB2地址,APB2地址在片內(nèi)外設(shè)的0x10000偏移處.
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)

//這個(gè)定義了GPIOA首地址:,在APB2 的0x800偏移處
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)

//定義GPIOA的結(jié)構(gòu)體
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
GPIO_TypeDef結(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;

那個(gè)__IO 的東西也是庫(kù)定義的類型,還有__I 和__O 呢,主要方便表達(dá)這個(gè)寄存器是讀寫,還是只讀,只寫:

#define __I volatile const /*!< defines 'read only' permissions */
#define __O volatile /*!< defines 'write only' permissions */
#define __IO volatile /*!< defines 'read / write' permissions */

好了,說(shuō)了這么多,其實(shí)每組GPIO 就7 個(gè)寄存器:
CRL,CRH,IDR,ODR,BSSR,BRR,LCKR.

庫(kù)函數(shù)之所以用如此繁瑣的定義,也是為了代碼結(jié)構(gòu)的一致和更系統(tǒng)的使用庫(kù)調(diào)用,當(dāng)然你看庫(kù)會(huì)覺(jué)得這樣很麻煩,但相對(duì)的是,我們使用起來(lái)就很簡(jiǎn)單.例如要操作GPIOA 的

CRL寄存器,那么就是:
GPIOA->CRL=0x00;就可以了.
這些GPIO 寄存器STM32F10xxx_CH_Rev7V3 中文用戶手冊(cè).pdf 中的P75 里有詳細(xì)介紹.

另外,IO 還有一些重映射和事件寄存器等的,將在以后討論.

3. 例程中IO 的輸入輸出控制都是直接操作的寄存器,例如:
#define LED1_ON GPIOA->BRR = GPIO_Pin_8
#define GET_LEFT() (!(GPIOD->IDR&GPIO_Pin_3))
這個(gè)GPIO_Pin_8,其實(shí)就是(1<<8), GPIO_Pin_3,就是(1<<3).
這些操作都要比調(diào)用庫(kù)函數(shù)快不少的.對(duì)于實(shí)際項(xiàng)目中需要快速IO操作的,建議像這樣直接操作寄存器.

另外在GPIO.C 文件里的GPIO_Configuration()函數(shù)中,配置按鍵的輸入,也采用了直接操作寄存器的方式,這里只是簡(jiǎn)單地介紹一下使用寄存器配置GPIO 的方法,實(shí)際使用中,還是建議用庫(kù)函數(shù)配置,畢竟,配置硬件這類操作一般不會(huì)十分頻繁地調(diào)用,而是在系統(tǒng)上電的時(shí)候調(diào)用一次的,所以這些情況下都不會(huì)在乎執(zhí)行效率.而且,直接操作寄存器,出低級(jí)錯(cuò)誤的幾率挺大~

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久99精品久久 | 黑人巨大精品欧美一区二区免费 | 国产三区精品 | 欧美一区二区成人 | 九色av | 欧美精品久久久久久久久久 | 夜夜骑综合 | 日本精品一区二区三区在线观看视频 | 久久久激情视频 | 超碰av在线| 精品91久久 | 97久久超碰 | 国产免费国产 | 国产91精品久久久久久久网曝门 | 国产高清免费 | 日韩国产欧美一区 | 岛国av免费看 | 一级片子 | 综合天天久久 | 亚洲国产精品久久久久久 | 国产高清亚洲 | 久草视频观看 | 成人精品久久日伦片大全免费 | 国产污视频在线 | 在线亚洲免费 | 国产一区二区三区视频免费观看 | 久热久| 国产福利精品一区 | 911精品国产 | 激情综合五月 | 久久9视频 | 国产精品中文字幕在线播放 | 在线看亚洲 | 亚洲国产高清免费 | 瑟瑟视频在线看 | 波多野结衣中文字幕一区二区三区 | 欧美一区二区三区视频 | 成人在线精品 | 谁有毛片 | 国产精品海角社区在线观看 | 日韩在线看片 |