實驗一、STM32的開發環境與簡單工程
一、實驗目的
1、熟悉STM32開發板的開發環境;
2、熟悉MDK創建和配置STM32工程項目的基本流程;
3、熟悉STM32官方庫的應用;
4、規范編程格式。
二、實驗內容
本次實驗配置MDK集成開發環境,新建一個簡單的工程文件,添加STM32官方庫并配置工程,編譯運行這個工程文件。下載已經編譯好的文件到開發板中運行。學會在程序中設置斷點,觀察系統內存和變量,為調試應用程序打下基礎。
三、預備知識
基本單片機硬件知識、單片機軟件編程語言、程序創建和調試的基本方法。
四、實驗設備及工具
硬件:STM32開發平臺
軟件:STM32官方庫;PC機操作系統Windows 98、Windows 2000或Windows XP;KEIL MDK集成開發環境;串口轉usb驅動。
五、實驗步驟
1、在準備存放工程文件的目錄下創建一新文件夾,命名為Proj_GPIO;在Proj_GPIO文件夾里面分別再創建四個文件夾:CMSIS、USER、LIB、OBJ。如圖1。
其中CMSIS(Cortex Microcontroller SoftwareInterface Standard)用于存放Cortex-M 處理器系列的與供應商無關的軟件抽象層和啟動相關的代碼文件;
USER用于存放我們自己編寫的代碼文件(含自己移植的底層驅動),還有MDK工程;
LIB存放所有的官方底層驅動庫文件;
OBJ用于工程輸出的過程文件和最終的二進制文件。
圖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下的所有文件都到第一步所創建的CMSIS文件夾中;
2)把STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver目錄下的文件(目錄inc和scr)復制到第一步創建的LIB文件夾中;
3)把STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template目錄下的stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h三個文件復制到USER文件夾中。
3、打開MDK軟件,新建一個工程Proj_GPIO保存到Proj_GPIO/USER中。CPU選擇STM32F103ZE,如圖2;
圖2
4、新建一個空文檔main.c保存到USER中,然后根據絕對路徑將文件對應添加到工程中,如右圖。
5、配置工程屬性,右鍵點擊工程文件中的Target 1選擇Options for Target ‘Target 1’打開工程選項對話框。做如下修改:
1)Output選項勾選Create HEX File,然后點擊Select Folder for Objects按鈕定位輸出文件保存目錄到工程的OBJ文件;
2)Listing選項,同樣點擊Select Folder for Listings定位輸出文件保存目錄到工程的OBJ文件;
3)C/C++選項,Define中填入STM32F10X_HD, USE_STDPERIPH_DRIVER系統的兩個基本宏定義;配置Include Paths屬性,加入工程中包含頭文件的目錄;如右圖
4)后面Debug和Utilities兩個選項如果使用J-link或者其他調試器則需要做對應的修改,否則不用。
6、根據實驗任務硬件原理圖編寫代碼實現四個按鍵控制led燈亮滅。
1)其中用戶按鍵和LED原理圖如下:
圖5
2)根據原理圖初始化各IO引腳,編寫控制函數,然后主函數中調用。
/*********************************************************************
* 函數名稱:io_init
* 函數功能:初始化PA0 PE2 PE3 PE4為輸入口PE5 PB5為輸出口
* 參數: 無
*********************************************************************/
void io_init()
{
GPIO_InitTypeDef gpin_init_struct;
//使能每個IO口的時鐘
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口按鍵
}
、
/*****************************************************
* 函數名稱: key_led
* 函數功能: 根據按鍵情況控制led燈的亮滅 s1 s2控制led1;s3 s4控制led2
* 參數: 無
* 其他:其中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文件下載到實驗板中運行驗證。
|