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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8975|回復: 0
收起左側

STM32標準庫中的GPIO_Pin_N與GPIO_PinSourceN話題

[復制鏈接]
ID:98618 發表于 2015-12-8 03:17 | 顯示全部樓層 |閱讀模式
整理: MilerShao

某日,有個工程師電話跟我交流,他在使用STM32F042芯片開發產品,用到其中的硬件I2C。利用ST官方提供的標準固件庫開發應用軟件。他說發現I2C功能基本不受控,尤其令他奇怪的是,I2C即使關閉了,卻發現I2C腳上還有脈沖出現。

他問我是否STM32F0芯片在I2C這里做了什么特別的調整,因為他之前用過STM32F1系列的芯片。我心想,再怎么調整也不應該調整出這個效果啊,我首先懷疑他代碼是否哪里有問題,尤其I2C及相關GPIO的配置。建議其做與I2C有關的初始化配置代碼的檢查確認。

后來,他通過QQ留言反饋給我,說找到原因了。原因就是將有關PA9,PA10的復用功能配置語句做了調整就OK。顯然,這里PA9,PA10是被復用為I2C通信腳。



調整前的代碼
GPIO_PinAFConfig(GPIOA,GPIO_Pin_9,GPIO_AF_4);
GPIO_PinAFConfig(GPIOA,GPIO_Pin_10,GPIO_AF_4);

調整后的代碼
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_4);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_4);


不難看出,該工程師調整的就是上面紅色參數部分。一個是GPIO_Pin_N,一個是GPIO_PinSourceN,其實這2個參數是不一樣的。

GPIO_Pin_n可以理解為某端口腳在整個端口的位置。比方某GPIO口的第6管腳位置編碼GPIO_Pin_6 被定義為 ((uint16_t)0x0040) ,對相應GPIO管腳做基本屬性配置時會用到,如配置輸入輸出模式、模擬輸入模式的選擇等。有興趣的話,可以點擊GPIO_Init( )進去看看。

GPIO_PinSourceN一般是在對某GPIO口相應pin腳的復用功能進行選擇配置才會用到。它是根據端口各腳位的位置按順序從0開始依次遞增編號,可以理解為該管腳在該端口的序號。比方某GPIO口的第6號復用功能腳的序號GPIO_PinSource6 被定義為 ((uint8_t)0x06)有興趣的話,也可以打開GPIO_PinAFConfig( )函數看看。顯然,GPIO_PinSource6跟上面的GPIO_Pin_6的值相差甚遠。


下面是ST官方庫代碼中有關GPIO_Pin_N的定義:

#define GPIO_Pin_0 ((uint16_t)0x0001)

#define GPIO_Pin_1 ((uint16_t)0x0002)

#define GPIO_Pin_2 ((uint16_t)0x0004)

#define GPIO_Pin_3 ((uint16_t)0x0008)

#define GPIO_Pin_4 ((uint16_t)0x0010)

#define GPIO_Pin_5 ((uint16_t)0x0020)

#define GPIO_Pin_6 ((uint16_t)0x0040)

#define GPIO_Pin_7 ((uint16_t)0x0080)

#define GPIO_Pin_8 ((uint16_t)0x0100)

#define GPIO_Pin_9 ((uint16_t)0x0200)

#define GPIO_Pin_10 ((uint16_t)0x0400)

。。。。。。

#define GPIO_Pin_15 ((uint16_t)0x8000)

#define GPIO_Pin_All ((uint16_t)0xFFFF)

下面是有關GPIO_PinSourceN的定義:

#define GPIO_PinSource0 ((uint8_t)0x00)

#define GPIO_PinSource1 ((uint8_t)0x01)

#define GPIO_PinSource2 ((uint8_t)0x02)

#define GPIO_PinSource3 ((uint8_t)0x03)

#define GPIO_PinSource4 ((uint8_t)0x04)

#define GPIO_PinSource5 ((uint8_t)0x05)

#define GPIO_PinSource6 ((uint8_t)0x06)

#define GPIO_PinSource7 ((uint8_t)0x07)

#define GPIO_PinSource8 ((uint8_t)0x08)

#define GPIO_PinSource9 ((uint8_t)0x09)

#define GPIO_PinSource10 ((uint8_t)0x0A)

。。。。。。

#define GPIO_PinSource15 ((uint8_t)0x0F)


小結:上面的問題只有基于STM32官方固件庫開發時才會碰到。說實在的,這兩個參數的確容易讓人誤解成一個東西或者弄混淆,尤其剛接觸的人。經常有人在這個地方遇到麻煩,之前我在一篇文章中提到過。這里再特意提醒下。

不過ST官方后來推出的STM32CUBE庫在這個地方的代碼寫法做了調整,不再定義GPIO_PinSourceN。當然,因為管腳配置導致異常的問題時有發生,建議使用ST官方推出的STM32CUBE配置環境及CUBE參考固件庫著手開發,這樣會省不少事。

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品99久久久久 | 国产一区2区 | 99视频免费| 91久久久久 | 理论片87福利理论电影 | 一级毛片免费看 | 免费高清成人 | 黄色片在线 | 国产精品爱久久久久久久 | 日本一区二区三区四区 | 欧美一区视频 | 中文字幕日韩欧美一区二区三区 | 操久久| 日韩欧美国产综合 | 91色综合 | 国产精品日日夜夜 | 看片国产| 午夜寂寞影院在线观看 | 日干夜干 | 国产一区二区在线播放 | 日韩一区二区三区在线观看 | 日本在线观看网址 | 秋霞a级毛片在线看 | 国产成人精品一区 | 亚欧精品 | 91久久精品国产91久久性色tv | 青青久草 | 久久久国产一区二区三区 | 久久精品久久综合 | 色综久久 | 欧美精品久久久久 | 丁香五月网久久综合 | 亚洲成av片人久久久 | 综合久久久久 | 日本天堂一区二区 | 久久久久国产精品一区二区 | www.青青草| 成人av一区二区三区 | 欧美午夜视频 | 久久久视频在线 | 国产福利观看 |