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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32 開(kāi)發(fā)板入門(mén)教程 (一) GPIO

          STM32 開(kāi)發(fā)板入門(mén)教程 (一) GPIO

          作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò) 收藏
          這個(gè)章節(jié)我們將學(xué)習(xí)最基本的 STM32GPIO 的應(yīng)用. 我們將分為兩個(gè)章節(jié)來(lái)學(xué)習(xí).

          第一部份: GPIO 的基本應(yīng)用和 IO 口的配置
          第二部份: 外部中斷的使用

          --------------------------------------------------------------------------

          1: 設(shè)計(jì)要求:
          開(kāi)發(fā)板上有 2 個(gè) LED,我們的目的為有規(guī)律的點(diǎn)亮 LED1 和 LED2. 當(dāng)按鍵按下去的時(shí)候所有的燈滅, 等待 2 秒鐘后恢復(fù)有規(guī)律的點(diǎn)亮.

          2: 硬件電路:



          3: 軟件程序設(shè)計(jì):
          (1) 根據(jù)要求配置 GPIOA 中的 PA0,PA1 為輸出, PA3, PA8 為輸入
          對(duì)于下面程序中的GPIO_InitStructure.GPIO_Speed 和 GPIO_InitStructure.GPIO_Mode 推薦大家看下面兩篇文章.

          STM32 GPIO的十大優(yōu)越功能綜述
          備注: 當(dāng)STM32的GPIO端口設(shè)置為輸出模式時(shí),有三種速度可以選擇:2MHz、10MHz和50MHz,這個(gè)速度是指I/O口驅(qū)動(dòng)電路的速度,是用來(lái)選擇不同的輸出驅(qū)動(dòng)模塊,達(dá)到最佳的噪聲控制和降低功耗的目的。

          STM32 GPIO端口的輸出速度設(shè)置
          備注: 共有8種模式,可以通過(guò)編程選擇:
          1. 浮空輸入
          2. 帶上拉輸入
          3. 帶下拉輸入
          4. 模擬輸入
          5. 開(kāi)漏輸出——(此模式可實(shí)現(xiàn)hotpower說(shuō)的真雙向IO)
          6. 推挽輸出
          7. 復(fù)用功能的推挽輸出
          8. 復(fù)用功能的開(kāi)漏輸出
          模式7和模式8需根據(jù)具體的復(fù)用功能決定。


          void GPIO_Configuration(void)
          {
          GPIO_InitTypeDef GPIO_InitStructure;


          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
          GPIO_Init(GPIOA, GPIO_InitStructure);


          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_8;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
          GPIO_Init(GPIOA, GPIO_InitStructure);
          }

          (2) 打開(kāi) GPIOA 的時(shí)鐘, 因?yàn)?STM32 是一個(gè)低功耗的 MCU , 每一個(gè)你使用的外圍設(shè)備都需要單獨(dú)開(kāi)啟時(shí)鐘, 如果不開(kāi)啟將不能使用, 這個(gè)也是對(duì)于 STM32 初學(xué)者容易疏忽的地方


          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
          RCC_APB2Periph_AFIO, ENABLE);

          STM32共有5種時(shí)鐘源,其中三種不同的時(shí)鐘源可用作為驅(qū)動(dòng)系統(tǒng)時(shí)鐘(SYSCLK);
          1、HSI 由內(nèi)部8MHz RC振蕩器產(chǎn)生,它是可以直接用來(lái)作為系統(tǒng)時(shí)鐘或經(jīng)2分頻后作為PLLSRC輸入。
          HIS時(shí)鐘頻率在出廠時(shí)被校準(zhǔn)在1%(25°C),在系統(tǒng)復(fù)位時(shí),工廠校準(zhǔn)值會(huì)被裝載到時(shí)鐘控制寄存器的HISCAL[7..0] 位。
          用戶(hù)可以通過(guò)更改HISCAL[4..0]來(lái)調(diào)整HSI頻率。
          另外時(shí)鐘寄存器中有一個(gè)HSIRDY位用來(lái)指示HSI RC是不穩(wěn)定工作,在時(shí)鐘啟過(guò)后,直到這個(gè)標(biāo)志位置被硬件置1后,HSI RC時(shí)鐘才被輸出。
          HSI RC時(shí)鐘還可以用時(shí)鐘寄存器中的HSION位來(lái)啟動(dòng)和關(guān)閉。

          HSI時(shí)鐘同時(shí)也是HSE晶體蕩振器的備用時(shí)鐘源。

          使用HSE時(shí)鐘,程序設(shè)置時(shí)鐘參數(shù)流程:
          1、將RCC寄存器重新設(shè)置為默認(rèn)值RCC_DeInit;
          2、打開(kāi)外部高速時(shí)鐘晶振HSERCC_HSEConfig(RCC_HSE_ON);
          3、等待外部高速時(shí)鐘晶振工作HSEStartUpStatus = RCC_WaitForHSEStartUp();
          4、設(shè)置AHB時(shí)鐘RCC_HCLKConfig;
          5、設(shè)置高速AHB時(shí)鐘RCC_PCLK2Config;
          6、設(shè)置低速速AHB時(shí)鐘RCC_PCLK1Config;
          7、設(shè)置PLLRCC_PLLConfig;
          8、打開(kāi)PLLRCC_PLLCmd(ENABLE);
          9、等待PLL工作while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
          10、設(shè)置系統(tǒng)時(shí)鐘RCC_SYSCLKConfig;
          11、判斷是否PLL是系統(tǒng)時(shí)鐘while(RCC_GetSYSCLKSource() != 0x08)
          12、打開(kāi)要使用的外設(shè)時(shí)鐘RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()


          具體設(shè)置請(qǐng)參考下面的文章

          STM32時(shí)鐘系統(tǒng)與軟件配置

          STM32的時(shí)鐘系統(tǒng)分析

          STM32 的時(shí)鐘與RTC


          (3) 設(shè)置外部中斷, 所有的 GPIO 口都可以作為外部中斷源. 具體可以參考下面這篇文章.

          STM32中外部中斷與外部事件


          GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);

          EXTI_InitStructure.EXTI_Line = EXTI_Line3;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(EXTI_InitStructure);

          同樣不要忘記打開(kāi)時(shí)鐘, 我們?cè)诖蜷_(kāi) PA 口的時(shí)候已經(jīng)加上了 RCC_APB2Periph_AFIO, 這里再提醒大家一下.

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
          RCC_APB2Periph_AFIO, ENABLE);

          最后就是編寫(xiě)外部中斷入口函數(shù).
          void EXTI3_IRQHandler(void)
          {
          int i;

          if(EXTI_GetITStatus(EXTI_Line9) != RESET)
          {
          GPIO_SetBits(GPIOA,GPIO_Pin_0);
          GPIO_SetBits(GPIOA,GPIO_Pin_1);

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

          GPIO_ResetBits(GPIOA,GPIO_Pin_0);
          GPIO_ResetBits(GPIOA,GPIO_Pin_1);

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



          EXTI_ClearITPendingBit(EXTI_Line3);
          }
          }

          不要忘記在中斷函數(shù)處理完成后清掉標(biāo)志位,不然會(huì)不停的進(jìn)入中斷.

          (4) 編譯與調(diào)試
          我們已經(jīng)完成所有程序編寫(xiě)部份, 接下來(lái)就是將工程編譯成功后下載到我們的 Mini-STM32 開(kāi)發(fā)板中進(jìn)行調(diào)試和仿真.
          如果看到 LED 有規(guī)律的點(diǎn)亮和熄滅, 按下按鈕后 LED 先是一起熄滅, 在一起點(diǎn)亮, 然后恢復(fù)有規(guī)律的點(diǎn)亮這個(gè)過(guò)程, 說(shuō)明我們已經(jīng)達(dá)到我們的設(shè)計(jì)目標(biāo).


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