STM32學習筆記(一)——點亮一個LED


引言

最近報名了2017全國大學生電子設計競賽,我們學校是第一次參加這個比賽,由於8/9月份就要比賽了,所以現在准備是比較晚的了,指導老師說只能做控制類的題目了,讓我們學習一下STM32單片機,51到時候肯定不夠用了,正好前幾天買了一塊STM32F103ZET6的最小系統,那就趕緊學習吧!從哪里學習呢?同樣是從點亮一個小燈開始,就建個工程模板就讓我沒有耐心了,折騰了一上午終於把工程建立好了!

關於STM32

 

 

簡介

STM32系列基於專為要求高性能、低成本、低功耗的嵌入式應用專門設計的ARM Cortex-M3內核,按內核架構分為不同產品:

其中STM32F系列有:
STM32F103“增強型”系列
STM32F101“基本型”系列
STM32F105、STM32F107“互聯型”系列
增強型系列時鍾頻率達到72MHz,是同類產品中性能最高的產品;基本型時鍾頻率為36MHz,以16位產品的價格得到比16位產品大幅提升的性能,是32位產品用戶的最佳選擇。兩個系列都內置32K到128K的閃存,不同的是SRAM的最大容量和外設接口的組合。時鍾頻率72MHz時,從閃存執行代碼,STM32功耗36mA,是32位市場上功耗最低的產品,相當於0.5mA/MHz。

片上資源

下圖是 AT89S52的資源

 

再來看看STM32F103ZET的資源

 可以明顯看出STM3資源是非常豐富,外設接口很多。正因如此,STM32操作起來不如51那么方便,所以在一些小項目上能用51盡量不用STM32單片機。 

 

 

 

點亮一個小燈

LED原理圖連接方式

 

 可以看出只要給D13輸出一個高電平就可以將led點亮,低電平熄滅。

GPIO初始化配置

學習單片機貌似都是從點亮led燈開始的,像51單片機點亮小燈直接P1=0就ok了,由於STM32的GPIO工作模式有8種(輸入4種+輸出4種),所以在GPIO輸出之前要先對要操作的GPIO進行配置,如下圖:

void GPIO_Config(void)                            //GPIO初始配置
{
    GPIO_InitTypeDef GPIO_InitStructure;      //定義結構體變量

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //使能GPIOD的時鍾

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;                    //指定引腳13
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //設置輸出速率50MHz
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽輸出模式
    GPIO_Init(GPIOD, &GPIO_InitStructure);                            //初始化外設GPIOx寄存器
}

可以看出對GPIO的配置是通過各種函數實現的, 這點和51有所不同,51是直接操作寄存器,其實庫函數的本質還是操作寄存器,只不過官方將它封裝成了各種函數,來方便操作寄存器,畢竟STM32的寄存器要比51多很多,要記住每個寄存器的名稱是不容易的,而通過各個函數就可以簡單的操作各個寄存器了,在MDK開發環境中可以通過右鍵Go to definition of 'xxx'來查看各個函數是如何操作寄存器的。

 

 從初始化配置時,要先使能GPIO的時鍾,指定引腳,設定輸出速率和工作模式,這些是必不可少的。

 

電平輸出

如何讓GPIOD_13輸出高低電平呢?官方有對應的函數:

#define LED_ON GPIO_SetBits(GPIOD, GPIO_Pin_13)        //端口置1
#define LED_OFF GPIO_ResetBits(GPIOD, GPIO_Pin_13)     //端口置0

  這里使用了宏定義,方便書寫,注意高電平點亮,低電平熄滅

 

延時函數

void delay(u32 t)            //延時函數
{
    u16 i;
    while(t--)
        for(i=0;i<1000;i++);
}

 

由於STM32的主頻有72MHz之高,所以這里的形參定義為了unsigned long 類型,同樣下面的變量i,定義為了unsigned int類型,為了占用更多的時間。 

 主函數

int main()
{
    GPIO_Config();            //GPIOD_1初始化配置
    while(1)
    {
        LED_ON;                    //點亮
        delay(1000);         //延時大概幾百毫秒
        LED_OFF;                //熄滅
        delay(1000);
    }

}

 

 可以看出delay()函數的實參比較大,如果換做100的話,人眼幾乎看不出led燈的閃爍,這是因為主頻很高,執行一個循環用的時間更少。只有實參足夠大,才能達到延時的效果。

程序下載

STM32的程序下載方式有很多,其中最經濟,最簡單的下載方式就是串口isp下載了,連接方式如下圖

另外還要設置一下啟動方式;

串口下載時要設置為第二種啟動方式,即BOOT0=1,BOOT1=0,然后在按一下Reset鍵,才可以開始下載(好麻煩^v^)。

下載工具(mcuisp)的設置為如下圖:

加載好生成的hex文件后,就可以點擊"開始編程"了,等待一小會,就會看到下載完成,小燈閃爍了。

 

總結

通過控制led閃爍的學習,可以看出stm32的GPIO位操作不是很方便,或許做這種簡單的事情大材小用了吧!本文是使用庫函數操作GPIO,也可以通過直接操作相關的寄存器來實現,以后會學習一下如何通過寄存器的設置來控制led,以上內容是我初學STM32單片機的個人理解,有描述不恰當或者錯誤的地方,歡迎各位朋友指正.

參考資料:

 

AT89S52_百度百科

stm32_百度百科

STM32固件函數庫用戶手冊_百度文庫

 

歡迎大家關注我的個人博客 http://www.wangchaochao.top/
微信掃碼關注我的公眾號

 

不定期更新個人學習筆記和技術總結,歡迎大家互相學習交流!

 


免責聲明!

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



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