STM32學習筆記(二) 基於STM32-GPIO的流水燈實現


  學會了如何新建一個工程模板,下面就要開始動手實踐了。像c/c++中經典的入門代碼"hello world"一樣,流水燈作為最簡單的硬件設備在單片機領域也是入門首推。如果你已經有了一定的C語言基礎以及曾經使用過類似的芯片,那么學習起來絕對事半功備。當然沒有也不需要擔心,本項目實現起來很簡單。不過學習嵌入式,第一點就是要轉變思路,從現在開始你不在是僅僅和編程語言打交道了,交叉編譯的方式注定嵌入式項目軟硬件不分家,從硬件實現,軟件設計,軟硬件調試,硬件運行觀察結果,熟悉和適應這個流程對於嵌入式學習和研發具有重要意義。

  因為所有例程都是在現有開發板完成的,所以主要涉及上面后三個方面,其中最核心的部分就是軟件設計。流水燈的實現並不復雜,系統的來說包含硬件接口信息獲得,驅動配置,邏輯實現,編譯測試等組成。了解了上述流程,項目設計就比較簡單了:

  1)原理圖分析

    

  根據上面原理圖。就能得出信息LED對應端口PD2,PD3,PD4,PD7,外部上拉電阻,低電平點亮。

  STM32的GPIO端口工作模式有8種:

  模擬輸入  用於模擬量的輸入,或者低功耗下省電。

  下拉輸入  端口內下拉電阻電路導通。默認為低電平,外部高電平動作。

  上拉輸入  端口內上拉電阻電路導通,默認為高電平,外部低電平動作。

  浮空輸入  端口內上下MOSFET均不導通,高阻態,輸入狀態僅由端口決定。

  開漏輸出  端口輸出為0時內部下拉電阻電路接地,輸出1時端口相當於懸空,即默認只能輸出0,如果外部需要輸出1,需要外接上拉電阻電路

  推挽輸出  端口輸出為0時內部下拉電阻電路接地,輸出1時內部接上拉電阻電路,默認輸出為0。

  復用開漏輸出 內部設置同開漏,但被其他外設復用。

  復用推挽輸出 內部設置同推挽,但被其他外設復用。

  結合原理圖和GPIO端口的配置信息,可知端口配置為推挽輸出,由內部上拉電阻來保證LED熄滅。

  熟悉下stm32f10x固件函數庫中的stm32f10x_gpio.c文件,接下來就可以開始項目編程了。

  LED相關引腳初始化:

void LED_UserConfig(void) { GPIO_InitTypeDef GPIO_InitStructure;//定義必須在所有運行代碼之前,c語言機制問題
    
    /*使能外設區域時鍾*/ RCC_APB2PeriphClockCmd(RCC_LED_GPIO, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_LED_ALL;             //選擇LED輸出的端口,可根據實際需要配置 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //設定GPIO最大輸出頻率
    GPIO_Init(GPIO_LED, &GPIO_InitStructure); }

  使能外設區域時鍾對於所有外設都是必須的,且要先於外設初始化函數,這是因為stm32的寄存器配置也是依靠時鍾脈沖才能夠處理的。

  GPIO_Mode_Out_PP即固件函數庫中對應推挽輸出。

  如上,就完成外設初始化,接下來就可以直接利用固件庫提供的API接口操作LED了,具體實現代碼:

void LED_Control(u8 LED_Number) { GPIO_SetBits(GPIO_LED,GPIO_LED_ALL);//關閉所有LED
    switch(LED_Number) { case 0: GPIO_ResetBits(GPIO_LED,GPIO_LED_1);//LED1點亮 
            break; case 1: GPIO_ResetBits(GPIO_LED,GPIO_LED_2); break; case 2: GPIO_ResetBits(GPIO_LED,GPIO_LED_3); break; case 3: GPIO_ResetBits(GPIO_LED,GPIO_LED_4); break; default: GPIO_SetBits(GPIO_LED,GPIO_LED_ALL); break; } } 

  如此,就實現了LED1點亮->LED1滅->LED2亮->......的循環過程,完整代碼可參考文件1-1,希望對入門stm32學習有幫助!

  具體代碼參考:http://files.cnblogs.com/files/zc110747/1.LightWater.7z


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM