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

          新聞中心

          STM32 入門(mén)之 GPIO

          作者: 時(shí)間:2016-11-26 來(lái)源:網(wǎng)絡(luò) 收藏
          入手STM32有一段時(shí)間了,感覺(jué)剛?cè)腴T(mén)時(shí)很難,無(wú)處下手,現(xiàn)在學(xué)到了點(diǎn)皮毛,寫(xiě)出來(lái)和大家分享一下。

          首先,什么叫GPIO?這個(gè)問(wèn)題,答案是我也不知道!至少目前我沒(méi)有必要知道,我只要知道他其實(shí)就是51單片機(jī)的那種IO口而已,不同的是,51單片機(jī)的IO口是不需要配置模式的,而STM32的IO口(哦,不,應(yīng)該說(shuō)是GPIO口,╮(╯▽╰)╭,真繞舌頭)是需要配置模式和時(shí)鐘的(好吧,又冒出一個(gè)時(shí)鐘來(lái),夠麻煩的),在這里要說(shuō)明一下,STM32的GPIO,如果你要用它,就要做兩步工作,第一是配置模式、速度,第二是配置其時(shí)鐘并使能(貌似說(shuō)兩步有點(diǎn)牽強(qiáng))。估計(jì)現(xiàn)在大家已經(jīng)糊涂了,好吧,別急,我一點(diǎn)一點(diǎn)給大家解釋解釋?zhuān)?/p>本文引用地址:http://www.ex-cimer.com/article/201611/321731.htm

          我們第一步要知道GPIO的那八種模式是什么,怎么用。GPIO的八種模式如下:

          (1)浮空輸入:In_Floating

          (2)帶上拉輸入:IPU(In Push_Up)

          (3)帶下拉輸入:IPD(In Push_Down)

          (4)模擬輸入:AIN(Anolog In)

          (5)開(kāi)漏輸出:OUT_PD(OD 代表開(kāi)漏,既Open Drain,OC代表開(kāi)集,Open Collect)

          (6)推挽輸出:OUT_PP(PP代表推挽式,Push_Pull)

          (7)復(fù)用功能推挽輸出:AF_PP(AF代表復(fù)用功能,Alternate-Fuction)

          (8)復(fù)用功能開(kāi)漏輸出:AF_OD

          好吧,就這八種模式,打字打得我手都酸了、、、、、、

          這八種模式什么時(shí)候用哪種,這個(gè)問(wèn)題值得研究,不過(guò)也不用現(xiàn)在就玩命地研究,以后在使用過(guò)程中慢慢就體會(huì)到了,所以在這里我就不多說(shuō)了。

          再就是配置GPIO的翻轉(zhuǎn)速度了,有10M、2M和50M,具體配置方式等最后我們貼個(gè)完整的代碼就明白了。

          GPIO配置說(shuō)完了,再說(shuō)說(shuō)時(shí)鐘配置,時(shí)鐘配置其實(shí)就是一堆讓初學(xué)者看不懂的代碼,不過(guò)看多了慢慢體會(huì),你就明白他到底是在說(shuō)什么了,在寫(xiě)程序的時(shí)候可以直接從他給的工程中移植過(guò)來(lái),然后修改一下相關(guān)的配制就行了,先貼個(gè)代碼,然后再解釋。


          上圖是配置時(shí)鐘的代碼,我挨著行解釋一下:

          SystemInit();看名字就知道這個(gè)是系統(tǒng)初始化,到底初始化了些什么,我的意思是不知道,目前也不用知道,你就寫(xiě)這么一句就行了;

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA

          |RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC

          |RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE

          |RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO

          |RCC_APB2Periph_SPI1, ENABLE );

          這幾句有點(diǎn)長(zhǎng),看著就頭暈,但是我們不怕,一句一句看,RCC_APB2PeriphClockCmd()這個(gè)函數(shù)名字有點(diǎn)怪,它叫做使能或失能APB2外設(shè)時(shí)鐘(這名字夠繞嘴的),不用管它,直接復(fù)制過(guò)來(lái)就行,再看括號(hào)里面的,RCC_APB2Periph_USART1,這個(gè)代表的是USART1的時(shí)鐘是和APB2的一樣,下面的幾個(gè)都是這么個(gè)意思,用或符號(hào)連接在一起,然后再加上個(gè)ENABLE,這就算使能了你想要用的管腳,大家要注意啊,上面的代碼是我隨便找的,在實(shí)際使用過(guò)程中,具體是能什么,要看你用到什么,就使能什么,不用最好別使能,免得造成不必要的干擾和麻煩。

          好了,我們一開(kāi)始說(shuō)的兩個(gè)問(wèn)題說(shuō)完了,下面說(shuō)一下如何讓GPIO輸出高低電平吧。其實(shí)吧這個(gè)問(wèn)題很簡(jiǎn)單,很多的資料一提到這個(gè)問(wèn)題,就開(kāi)始講寄存器,一講寄存器,就涉及到內(nèi)部原理,好吧,終于,初學(xué)者不淡定了,腦子成了一堆漿糊,然后信心受挫,然后就降低了學(xué)習(xí)效率,其實(shí)我個(gè)人認(rèn)為大不必,既然有庫(kù)函數(shù),那我們就先用庫(kù)函數(shù),等庫(kù)函數(shù)用熟了,再自己慢慢領(lǐng)悟庫(kù)函數(shù)里面的寄存器操作??聪旅鎯蓷l語(yǔ)句:

          GPIO_SetBits(GPIOD, GPIO_Pin_9);

          GPIO_ResetBits(GPIOD, GPIO_Pin_9);

          第一句的意思是將GPIOD9口置位(我們假定這個(gè)口的模式是輸出模式),第二句的意思是將GPIOD9口清零(同樣的假定)。哈哈,怎么樣,簡(jiǎn)單吧,這就是基本的IO口操作,這樣,你就能成功點(diǎn)亮或者熄滅指定的LED了,下面附上一段例程,大家自己慢慢研究。

          #include "stm32f10x.h"

          //-------------------------------------------GPIO初始化-----------------------------------------//

          void GPIO_Configuration(void)

          {

          GPIO_InitTypeDef GPIO_InitStructure;

          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;

          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

          GPIO_Init(GPIOD, &GPIO_InitStructure);

          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

          GPIO_Init(GPIOB, &GPIO_InitStructure);

          }

          //--------------------------------------配置系統(tǒng)時(shí)鐘,使能各外設(shè)時(shí)鐘---------------------------------//

          void RCC_Configuration(void)

          {

          SystemInit();

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB

          | RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD

          | RCC_APB2Periph_GPIOE, ENABLE );

          }

          //-----------------------------------配置所有外設(shè)------------------------------//

          void Init_All_Periph(void)

          {

          RCC_Configuration();

          GPIO_Configuration();

          }

          //----------------------------------------延時(shí)函數(shù)--------------------------------------------//

          void Delay(vu32 nCount)

          {

          for(; nCount != 0; nCount--);

          }

          //------------------------------------------主函數(shù)--------------------------------------------//

          int main(void)

          {

          Init_All_Periph();

          while(1)

          {

          GPIO_SetBits(GPIOD, GPIO_Pin_8);

          GPIO_ResetBits(GPIOD, GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11);

          Delay(0xEFFFF);

          GPIO_SetBits(GPIOD, GPIO_Pin_9);

          GPIO_ResetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_11);

          Delay(0xEFFFF);

          GPIO_SetBits(GPIOD, GPIO_Pin_10);

          GPIO_ResetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_11);

          Delay(0xEFFFF);

          GPIO_SetBits(GPIOD, GPIO_Pin_11);

          GPIO_ResetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);

          Delay(0xEFFFF);

          GPIO_ResetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);

          }

          }



          關(guān)鍵詞: STM32入門(mén)GPI

          評(píng)論


          技術(shù)專(zhuān)區(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); })();