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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32學(xué)習(xí)筆記(1):GPIO口的使用

          STM32學(xué)習(xí)筆記(1):GPIO口的使用

          作者: 時間:2016-11-28 來源:網(wǎng)絡(luò) 收藏

          RCC_APB2PeriphClockCmd()函數(shù)是設(shè)置外設(shè)時鐘。ARM與C51單片機不同的是,不用外設(shè)的時候,如IO口、ADC、定時器等等,都是禁止時鐘的,以達到節(jié)能的目的,只有要用到的外設(shè),才開啟它的時鐘。因此在需要用到GPIOB和GPIOD的時候,我們需要先開啟它的時鐘,具體用到的是函數(shù)庫里面的函數(shù):

          void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

          其中,第一個參數(shù)需要指示要開啟什么端口的時鐘,RCC_APB2Periph_GPIOx就是開啟GPIOx的時鐘,第二個參數(shù)需要指示是開啟還是關(guān)閉,ENABLE/DISABLE。

          開啟外設(shè)時鐘之后,然后就開始對GPIO的配置寄存器進行設(shè)置了,具體設(shè)置方式參考《基于MDK的STM32處理器開發(fā)應(yīng)用》一書中,“7.1通用IO端口”。While循環(huán)里面就是給GPIO的端口輸出寄存器賦值,由于我手上這款奮斗開發(fā)板的三個LED燈分別接的是D3、D6和B5,所以只要將D端口和B端口相應(yīng)的位上置1就可以了。

          編譯之后我們發(fā)現(xiàn)編譯器報錯,Undefined symbol RCC_APB2PeriphClockCmd,是因為我們使用了的RCC_APB2PeriphClockCmd()函數(shù)在頭文件中聲明了,卻沒有在C文件中定義,這個函數(shù)在.. KeilARMRV31LIBSTSTM32F10xstm32f10x_rcc.c中,將這個文件復(fù)制到工程的根目錄下,然后在屏幕左邊的Workspace中添加進來,就可以了。

          至于如何下載到ARM開發(fā)板中,不同的開發(fā)板有不同的方法,而開發(fā)板生產(chǎn)廠商一般都會將有關(guān)的文檔連同開發(fā)板一起附送,在此就不詳細(xì)贅述了。

          其實,在MDK的庫中,還定義了很多宏,可以避免讓我們自己去查找相關(guān)資料來設(shè)置寄存器的各個位。比如,在本次實驗中,對于LED等的亮滅也可以通過以下代碼來實現(xiàn)。

          #include "stm32f10x_lib.h"

          int main()

          {

          int i;

          GPIO_InitTypeDef GPIO_InitStructure;//定義GPIO宏操作結(jié)構(gòu)體

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOB,ENABLE);//外設(shè)時鐘配置,開啟GPIOB和GPIOD的時鐘

          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//將B5口配置為通用推挽輸出

          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//口線翻轉(zhuǎn)速度為50MHz

          GPIO_Init(GPIOB, &GPIO_InitStructure);//配置GPIOB口

          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_3;//將D3和D6口配置為推挽輸出

          GPIO_Init(GPIOD, &GPIO_InitStructure);//配置GPIOD口

          while(1)

          {

          GPIO_SetBits(GPIOB, GPIO_Pin_5);//B5口輸出高電平

          GPIO_ResetBits(GPIOD, GPIO_Pin_6);//D6口輸出低電平

          GPIO_ResetBits(GPIOD, GPIO_Pin_3);//D3口輸出低電平

          for(i=0;i<1000000;i++);

          GPIO_ResetBits(GPIOB, GPIO_Pin_5);

          GPIO_ResetBits(GPIOD, GPIO_Pin_6);

          GPIO_SetBits(GPIOD, GPIO_Pin_3);

          for(i=0;i<1000000;i++);

          GPIO_ResetBits(GPIOB, GPIO_Pin_5);

          GPIO_ResetBits(GPIOD, GPIO_Pin_3);

          GPIO_SetBits(GPIOD, GPIO_Pin_6);

          for(i=0;i<1000000;i++);

          }

          }

          由于我們使用了GPIO_InitTypeDef類型,所以我們需要找到它的定義,這個定義包含在“…KeilARMRV31LIBSTSTM32F10xstm32f10x_gpio.c”中,將文件復(fù)制到工程根目錄下,然后再添加進入工程中,編譯才不會報錯。

          在絕大多數(shù)C編譯器中,要求所有的變量聲明都在執(zhí)行語句塊之前,也就是說如果需要定義的變量需要先在進入main函數(shù)一開始就全部定義好,如果執(zhí)行了某一條語句之后再定義變量的話,就會報錯。


          上一頁 1 2 下一頁

          評論


          技術(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); })();