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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

初學(xué)stm32,對GPIO的理解(非常詳細的源碼解釋說明)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:371549 發(fā)表于 2018-7-14 16:16 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式


單片機源程序如下:

  1. #include "stm32f10x.h"   
  2. #include "gpio.h"

  3. //對于STM32  GPIO一般用法配置(這里不包括復(fù)用功能),以下的說明可以應(yīng)用點亮燈多種方式
  4. void GPIO_Configure_GPIOA(void)
  5. {
  6.        
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//設(shè)置時鐘,針對GPIOA時鐘使能
  8.         /*        為什么要設(shè)置時鐘呢???
  9.         任何外設(shè)都需要時鐘,51單片機,stm32,430等等,
  10.         因為寄存器是由D觸發(fā)器組成的,往觸發(fā)器里面寫東西,前提條件是有時鐘輸入。
  11.         stm32之所以是低功耗,他將所有的門都默認設(shè)置為disable,在你需要用哪個門的時候,
  12.         開哪個門就可以,也就是說用到什么外設(shè),只要打開對應(yīng)外設(shè)的時鐘就可以,
  13.         其他的沒用到的可以還是disable,這樣耗能就會減少。
  14.         stm32的時鐘是有分工的,并且每類時鐘的頻率不一樣,因為沒必要所有的時鐘都是最高頻率,只要夠用就行,
  15.         好比一個門出來水流大小,我只要洗臉,但是出來的是和洪水一樣涌出來的水,那就gg了,消耗能源也多,
  16.         所以不同的時鐘也會有頻率差別,或者在配置的時候可以配置時鐘分頻。
  17.         */
  18.        
  19.        
  20.         GPIO_InitTypeDef GPIO_InitStructure;//GPIO設(shè)備的初始化函數(shù)
  21.          //GPIO_InitTypeDef是一個結(jié)構(gòu)體類型同義字,其功能是定義一個結(jié)構(gòu)體,
  22.         //該結(jié)構(gòu)體有三個成員分別是 u16類型的GPIO_Pin、
  23. //        GPIOSpeed_TypeDef 類型的GPIO_Speed  和GPIOMode_TypeDef 類型的GPIO_Mode。即以下三種:
  24.        
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//普通推挽輸出
  26.         //GPIO有8種工作模式(4種輸入模式和4種輸出模式):
  27.         /*
  28.         4種輸入模式:
  29.         上拉輸入模式(GPIO_Mode_IPU)-->在默認狀態(tài)下(GPIO引腳無輸入),讀取得的GPIO引腳
  30.         數(shù)據(jù)為1,高電平。
  31.        
  32.         而下拉輸入模式(GPIO_Mode_IPD)則相反。在默認狀態(tài)下(GPIO引腳無輸入),讀取得的GPIO引腳
  33.         數(shù)據(jù)為0,低電平。
  34.        
  35.         浮空輸入模式(GPIO_Mode_IN_FLOATING)在芯片內(nèi)部既沒有接上拉,也沒有接下拉電阻,
  36.         經(jīng)由觸發(fā)器輸入。這種模式用于標準的通信協(xié)議如I2C、USART的接收端
  37.        
  38.         模擬輸入模式(GPIO_Mode_AIN)則關(guān)閉了施密特觸發(fā)器,不接上、下拉電阻,經(jīng)由另一線路
  39.         把電壓信號傳送到片上外設(shè)模塊。如傳送至ADC模塊,由ADC采集電壓信號。所以使用ADC外設(shè)時,必須設(shè)置為模擬輸入模式
  40.        
  41.         4種輸出模式:
  42.         普通推挽輸出(GPIO_Mode_Out_PP)一般應(yīng)用在輸出電平為0和3.3伏的場合
  43.        
  44.         普通開漏輸出(GPIO_Mode_Out_OD)一般在電平不匹配的場合,如需要輸出5伏的高電平,就需要在外部接一個
  45.         上拉電阻,電源為5伏,把GPIO設(shè)置為開漏模式,當輸出高阻態(tài)時,由上拉電阻和電源向外輸出5伏的電平
  46.        
  47.         復(fù)用推挽輸出(GPIO_Mode_AF_PP),是根據(jù)GPIO的復(fù)用功能來選擇的,如GPIO的引腳用作串口的輸出,
  48.         則使用復(fù)用推挽輸出模式。
  49.        
  50.         復(fù)用開漏輸出(GPIO_Mode_AF_OD),同理,其用在IC、SMBUS這些需要線與功能的復(fù)用場合
  51.         在使用任何一種開漏模式時,都需要接上拉電阻。
  52.         */
  53.        
  54.        
  55.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//針對某組的一個引腳進行初始化
  56.         //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;//針對某組的兩個引腳進行初始化
  57.         //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//針對某組的16個引腳進行初始化
  58.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  59.         /*
  60.          又稱輸出驅(qū)動電路的響應(yīng)速度:(芯片內(nèi)部在I/O口的輸出部分安排了多個響應(yīng)速度不同的輸出驅(qū)動電路,
  61.          用戶可以根據(jù)自己的需要選擇合適的驅(qū)動電路,通過選擇速度來選擇不同的輸出驅(qū)動模塊,
  62.          達到最佳的噪聲控制和降低功耗的目的。)

  63.     可理解為: 輸出驅(qū)動電路的帶寬:即一個驅(qū)動電路可以不失真地通過信號的最大頻率。

  64.         (如果一個信號的頻率超過了驅(qū)動電路的響應(yīng)速度,就有可能信號失真。失真因素?)

  65.         如果信號頻率為10MHz,而你配置了2MHz的帶寬,則10MHz的方波很可能就變成了正弦波。
  66.         就好比是公路的設(shè)計時速,汽車速度低于設(shè)計時速時,可以平穩(wěn)地運行,
  67.         如果超過設(shè)計時速就會顛簸,甚至翻車。

  68.         關(guān)鍵是: GPIO的引腳速度跟應(yīng)用相匹配,速度配置越高,噪聲越大,功耗越大。

  69.         帶寬速度高的驅(qū)動器耗電大、噪聲也大,帶寬低的驅(qū)動器耗電小、噪聲也小。
  70.         使用合適的驅(qū)動器可以降低功耗和噪聲

  71.         比如:高頻的驅(qū)動電路,噪聲也高,當不需要高的輸出頻率時,請選用低頻驅(qū)動電路,
  72.         這樣非常有利于提高系統(tǒng)的EMI性能。當然如果要輸出較高頻率的信號,
  73.         但卻選用了較低頻率的驅(qū)動模塊,很可能會得到失真的輸出信號。
  74.         關(guān)鍵是GPIO的引腳速度跟應(yīng)用匹配(推薦10倍以上?)。
  75.         */
  76.         GPIO_Init(GPIOA,&GPIO_InitStructure);//進行GPIOA初始化
  77. }

  78. void Delay_ms(u16 ms)
  79. {
  80.         int i;
  81.         while(ms--)
  82.         {
  83.                 i = 12000;
  84.                 while(i--);
  85.         }
  86.                
  87. }

  88. void GPIO_Achieve(u8 n,u16 ms)
  89. {
  90. //        u8 Readoutbit;
  91. //        u16 Readoutdate;
  92.         if(n == 0)
  93.         {
  94.                 GPIO_ResetBits(GPIOA,GPIO_Pin_1);//設(shè)置PA0引腳為低電平,清除引腳位
  95.                 Delay_ms(ms);//不精準的延時函數(shù),毫秒單位
  96.                
  97.                
  98.                 /*這是GPIO_ResetBits(GPIOx,GPIO_Pin)代碼
  99.                 void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  100.         {
  101.   //Check the parameters
  102.   assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  103.   assert_param(IS_GPIO_PIN(GPIO_Pin));
  104.   GPIOx->BRR = GPIO_Pin;//位復(fù)位寄存器賦值(將某個引腳變?yōu)榈碗娖剑?br />
  105.         }
  106.                 */
  107.                
  108.                
  109.                 //Readoutbit = GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0);//將PA0引腳輸出的值賦給Readoutbit
  110.                 //Readoutdate = GPIO_ReadOutputData(GPIOA);//將PA所有引腳輸出的值賦給Readoutdate
  111.                
  112.                 //GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);//獲取PA0引腳的值
  113.                 //GPIO_ReadInputData(GPIOA);//獲取PA所有引腳的值
  114.                 //GPIO_WriteBit(GPIOA,GPIO_Pin_0,RESET);//將RESET值寫入給PA0引腳(其實就是將PA0引腳置0)
  115.                 //GPIO_Write(GPIOA,0xffff);//將0xffff值寫入PA端口(其實就是將PA所有引腳置1)
  116.         }
  117.         else
  118.         {
  119.                 GPIO_SetBits(GPIOA,GPIO_Pin_1);//設(shè)置PA0引腳為高電平,置位引腳
  120.                 Delay_ms(ms);
  121.                 /*
  122.                 void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  123.         {
  124.    //Check the parameters
  125.                 assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  126.                 assert_param(IS_GPIO_PIN(GPIO_Pin));
  127.                 GPIOx->BSRR = GPIO_Pin;//位置位寄存器賦值(將某個引腳變?yōu)楦唠娖剑?br />
  128.         }
  129.                 */       
  130.                 //Readoutbit = GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0);
  131.                 //Readoutdate = GPIO_ReadOutputData(GPIOA,GPIO_Pin_0);
  132.         }
  133. }
  134. /*
  135. 注釋:
  136. GPIOx->BSRR= GPIO_Pin;-----------位置位寄存器---這是單個引腳的
  137. GPIOx->BRR= GPIO_Pin;------------位復(fù)位寄存器---這是單個引腳的
  138. GPIOx-ODR= PortVal;--------------端口輸出寄存器---這是16個引腳的
  139. GPIOx-IDR= PortVal;--------------端口輸入寄存器---這是16個引腳的


  140. 對于GPIO來說,還有其他函數(shù)

  141. 以上,是我對GPIO的部分理解,有些可能理解不到位,請諒解(有些是從網(wǎng)上查找的)
  142. */
復(fù)制代碼

所有資料51hei提供下載:
TEXT1.rar (707 KB, 下載次數(shù): 114)


評分

參與人數(shù) 2黑幣 +62 收起 理由
YJGG + 12 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

來自 10#
ID:325058 發(fā)表于 2020-4-2 16:54 | 只看該作者
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//針對某組的一個引腳進行初始化
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;//針對某組的兩個引腳進行初始化
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//針對某組的16個引腳進行初始化
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
請教,后面兩個是對全部16個引腳進行設(shè)置,還是只對選擇的引腳進行設(shè)置?看.h文件一頭零水,沒有看明白。
回復(fù)

使用道具 舉報

無效樓層,該帖已經(jīng)被刪除
板凳
ID:349194 發(fā)表于 2018-10-18 22:23 | 只看該作者
優(yōu)秀
回復(fù)

使用道具 舉報

地板
ID:345396 發(fā)表于 2018-10-19 18:05 | 只看該作者
復(fù)用,映射
回復(fù)

使用道具 舉報

5#
ID:346711 發(fā)表于 2019-4-17 13:15 | 只看該作者
優(yōu)秀!!!!!!
回復(fù)

使用道具 舉報

6#
ID:515970 發(fā)表于 2019-4-18 23:18 來自觸屏版 | 只看該作者
可以,夠詳細
回復(fù)

使用道具 舉報

7#
ID:554513 發(fā)表于 2019-6-4 11:22 | 只看該作者
學(xué)習(xí)了
回復(fù)

使用道具 舉報

8#
ID:537887 發(fā)表于 2019-6-6 09:11 | 只看該作者
可以,很詳細的說明
回復(fù)

使用道具 舉報

9#
ID:325058 發(fā)表于 2020-4-2 16:49 | 只看該作者
本帖最后由 suinile 于 2020-4-7 15:18 編輯

同一個端口的不同引腳配置成不同的輸出模式,比如:端口A的1腳輸出配置成頻率2M 推挽輸出、2腳輸出配置設(shè)置成頻率10M 開漏輸出。
GPIO_InitTypeDef   GPIO_INIT_GPIOA;         //端口參數(shù)配置
     GPIO_INIT_GPIOA.GPIO_Pin = GPIO_Pin_1;                          
     GPIO_INIT_GPIOA.GPIO_Mode = GPIO_Mode_Out_PP;
     GPIO_INIT_GPIOA.GPIO_Speed = GPIO_Speed_2MHz;

     GPIO_INIT_GPIOA.GPIO_Pin = GPIO_Pin_2;
     GPIO_INIT_GPIOA.GPIO_Mode = GPIO_Mode_Out_OD;
     GPIO_INIT_GPIOA.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_INIT_GPIOA);//端口配置初始化
這種寫法的話,是不是1腳的輸出配置被2腳的輸出配置覆蓋掉了??
回復(fù)

使用道具 舉報

11#
ID:722576 發(fā)表于 2020-4-5 14:54 | 只看該作者
優(yōu)秀,學(xué)習(xí)一下
回復(fù)

使用道具 舉報

12#
ID:128463 發(fā)表于 2020-4-11 10:16 | 只看該作者

優(yōu)秀,學(xué)習(xí)一下
回復(fù)

使用道具 舉報

13#
無效樓層,該帖已經(jīng)被刪除
14#
ID:636987 發(fā)表于 2022-4-3 20:43 | 只看該作者
suinile 發(fā)表于 2020-4-2 16:49
同一個端口的不同引腳配置成不同的輸出模式,比如:端口A的1腳輸出配置成頻率2M 推挽輸出、2腳輸出配置設(shè)置 ...

是的。相當于對參數(shù)進行了兩次賦值,當然,最后一次保留,然后通過初始化函數(shù)把參數(shù)設(shè)置傳遞到端口寄存器去。我也是初學(xué)者,不一定對。彼此學(xué)習(xí)
回復(fù)

使用道具 舉報

15#
ID:74143 發(fā)表于 2022-4-9 16:16 | 只看該作者
可以,很詳細的說明
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 天天射影院 | 狠狠狠干 | 欧美精品网站 | 国产精品视频一区二区三区不卡 | 亚洲高清视频在线观看 | 精品一区二区三区视频在线观看 | 羞羞视频网站 | 精品中文字幕在线 | 久久久久国产精品免费免费搜索 | 99热都是精品 | 亚洲国产日韩欧美 | 91久久久久 | 午夜视频在线视频 | 99久久精品免费看国产四区 | 国产亚洲欧美在线视频 | 日韩精品一区二区三区中文字幕 | 全免一级毛片 | 在线国产欧美 | 日本精品久久 | 亚洲高清一区二区三区 | 日本不卡免费新一二三区 | 亚洲高清视频一区二区 | 久草热视频 | 国产一区二区视频免费在线观看 | 中文字幕在线观看一区二区 | 在线一区 | 人人射人人 | 四虎午夜剧场 | 欧美精品网站 | 日韩在线一区二区三区 | 午夜小电影 | av在线播放网站 | 日韩免费视频一区二区 | 午夜欧美 | 91麻豆产精品久久久久久夏晴子 | 国产免费a视频 | 国产国产精品久久久久 | 国产成人精品一区二区三区视频 | 欧美日韩国产三级 | 国产高清在线 | 久久国产高清 |