實(shí)驗(yàn)一、STM32的開發(fā)環(huán)境與簡(jiǎn)單工程
一、實(shí)驗(yàn)?zāi)康?br />
1、熟悉STM32開發(fā)板的開發(fā)環(huán)境;
2、熟悉MDK創(chuàng)建和配置STM32工程項(xiàng)目的基本流程;
3、熟悉STM32官方庫的應(yīng)用;
4、規(guī)范編程格式。
二、實(shí)驗(yàn)內(nèi)容
本次實(shí)驗(yàn)配置MDK集成開發(fā)環(huán)境,新建一個(gè)簡(jiǎn)單的工程文件,添加STM32官方庫并配置工程,編譯運(yùn)行這個(gè)工程文件。下載已經(jīng)編譯好的文件到開發(fā)板中運(yùn)行。學(xué)會(huì)在程序中設(shè)置斷點(diǎn),觀察系統(tǒng)內(nèi)存和變量,為調(diào)試應(yīng)用程序打下基礎(chǔ)。
三、預(yù)備知識(shí)
基本單片機(jī)硬件知識(shí)、單片機(jī)軟件編程語言、程序創(chuàng)建和調(diào)試的基本方法。
四、實(shí)驗(yàn)設(shè)備及工具
硬件:STM32開發(fā)平臺(tái)
軟件:STM32官方庫;PC機(jī)操作系統(tǒng)Windows 98、Windows 2000或Windows XP;KEIL MDK集成開發(fā)環(huán)境;串口轉(zhuǎn)usb驅(qū)動(dòng)。
五、實(shí)驗(yàn)步驟
1、在準(zhǔn)備存放工程文件的目錄下創(chuàng)建一新文件夾,命名為Proj_GPIO;在Proj_GPIO文件夾里面分別再創(chuàng)建四個(gè)文件夾:CMSIS、USER、LIB、OBJ。如圖1。
其中CMSIS(Cortex Microcontroller SoftwareInterface Standard)用于存放Cortex-M 處理器系列的與供應(yīng)商無關(guān)的軟件抽象層和啟動(dòng)相關(guān)的代碼文件;
USER用于存放我們自己編寫的代碼文件(含自己移植的底層驅(qū)動(dòng)),還有MDK工程;
LIB存放所有的官方底層驅(qū)動(dòng)庫文件;
OBJ用于工程輸出的過程文件和最終的二進(jìn)制文件。
圖1
2、將官方庫STM32F10x_StdPeriph_Lib_V3.5.0.rar解壓。
1)把STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport下的所有文件和STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x下的所有文件都到第一步所創(chuàng)建的CMSIS文件夾中;
2)把STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver目錄下的文件(目錄inc和scr)復(fù)制到第一步創(chuàng)建的LIB文件夾中;
3)把STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template目錄下的stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h三個(gè)文件復(fù)制到USER文件夾中。
3、打開MDK軟件,新建一個(gè)工程Proj_GPIO保存到Proj_GPIO/USER中。CPU選擇STM32F103ZE,如圖2;
圖2
4、新建一個(gè)空文檔main.c保存到USER中,然后根據(jù)絕對(duì)路徑將文件對(duì)應(yīng)添加到工程中,如右圖。
5、配置工程屬性,右鍵點(diǎn)擊工程文件中的Target 1選擇Options for Target ‘Target 1’打開工程選項(xiàng)對(duì)話框。做如下修改:
1)Output選項(xiàng)勾選Create HEX File,然后點(diǎn)擊Select Folder for Objects按鈕定位輸出文件保存目錄到工程的OBJ文件;
2)Listing選項(xiàng),同樣點(diǎn)擊Select Folder for Listings定位輸出文件保存目錄到工程的OBJ文件;
3)C/C++選項(xiàng),Define中填入STM32F10X_HD, USE_STDPERIPH_DRIVER系統(tǒng)的兩個(gè)基本宏定義;配置Include Paths屬性,加入工程中包含頭文件的目錄;如右圖
4)后面Debug和Utilities兩個(gè)選項(xiàng)如果使用J-link或者其他調(diào)試器則需要做對(duì)應(yīng)的修改,否則不用。
6、根據(jù)實(shí)驗(yàn)任務(wù)硬件原理圖編寫代碼實(shí)現(xiàn)四個(gè)按鍵控制led燈亮滅。
1)其中用戶按鍵和LED原理圖如下:
圖5
2)根據(jù)原理圖初始化各IO引腳,編寫控制函數(shù),然后主函數(shù)中調(diào)用。
/*********************************************************************
* 函數(shù)名稱:io_init
* 函數(shù)功能:初始化PA0 PE2 PE3 PE4為輸入口PE5 PB5為輸出口
* 參數(shù): 無
*********************************************************************/
void io_init()
{
GPIO_InitTypeDef gpin_init_struct;
//使能每個(gè)IO口的時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
gpin_init_struct.GPIO_Pin = GPIO_Pin_0; //PA0引腳
gpin_init_struct.GPIO_Speed = GPIO_Speed_2MHz; //IO速度為2MHz
gpin_init_struct.GPIO_Mode = GPIO_Mode_IPD; //下拉模式
GPIO_Init(GPIOA, &gpin_init_struct); //A口按鍵
gpin_init_struct.GPIO_Pin = GPIO_Pin_5;
gpin_init_struct.GPIO_Speed = GPIO_Speed_2MHz;
gpin_init_struct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &gpin_init_struct); //B口led1
GPIO_Init(GPIOE, &gpin_init_struct); //E口led2
gpin_init_struct.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
gpin_init_struct.GPIO_Speed = GPIO_Speed_2MHz;
gpin_init_struct.GPIO_Mode = GPIO_Mode_IPU; //上拉模式
GPIO_Init(GPIOE, &gpin_init_struct); //E口按鍵
}
、
/*****************************************************
* 函數(shù)名稱: key_led
* 函數(shù)功能: 根據(jù)按鍵情況控制led燈的亮滅 s1 s2控制led1;s3 s4控制led2
* 參數(shù): 無
* 其他:其中LED1_ON LED1_OFF LED2_ON LED2_OFF為全局宏定義
********************************************************/
void key_led()
{
if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4)==0) LED1_ON;
if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3)==0) LED1_OFF;
if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2)==0) LED2_ON;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==1) LED2_OFF;
}
#include "stm32f10x.h"
#define LED2_ON GPIO_ResetBits(GPIOB, GPIO_Pin_5)
#define LED2_OFF GPIO_SetBits(GPIOB, GPIO_Pin_5)
#define LED1_ON GPIO_ResetBits(GPIOE, GPIO_Pin_5)
#define LED1_OFF GPIO_SetBits(GPIOE, GPIO_Pin_5)
void io_init();
void key_led();
int main()
{
io_init();
while(1)
{
key_led();
}
}
3)代碼編寫完成后編譯鏈接,通過下載軟件將hex文件下載到實(shí)驗(yàn)板中運(yùn)行驗(yàn)證。
|