引言
最近報名了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_百度百科
歡迎大家關注我的個人博客 http://www.wangchaochao.top/
微信掃碼關注我的公眾號
不定期更新個人學習筆記和技術總結,歡迎大家互相學習交流!