學會了如何新建一個工程模板,下面就要開始動手實踐了。像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