stm32性能強大,但其開發難度又顯著高於Arduino等單片機。本文將通過流水燈程序,介紹stm32開發的一些基本操作。
基本介紹
常見stm的編程方式有三種:寄存器式、標準庫式、HAL庫式。其中HAL庫上手較爲簡單。本文將以HAL庫式爲基礎介紹。
軟件
- Keil 5(單片機集成開發環境)
- STM32CubeMX(自動配置stm32編程的相關文件)
- FLYMCU(stm32串口下載軟件,也可用ST-LINK代替)
- XCOM(串口監視器)
準備
打開圖中的“File”,新建一個stm32項目(“New Project")。
在輸入框中搜索自己的stm32芯片,雙擊創建新項目。
選擇左邊菜單欄中“System Core”的SYS、GPIO和RCC。
在SYS中選擇Debug方式爲“Serial Wire”。
在RCC中選擇“Crystal/Ceramic Resonator”
點擊右邊芯片的引腳,可以看到每一個引腳的用法。此處我們選擇引腳的“GPIO_Output”(通用型輸出)模式。
依次選擇每個引腳的模式,在該實驗中,我們共需要10個模式爲“GPIO_Output”的引腳。設置好後引腳會有綠色標記。
打開“GPIO”,設置引腳的輸出模式爲“Output Push Pull”(推輓輸出模式)。
打開“Project Manager”,編輯文件名稱,保存路徑。注意設置IDE爲MDK-ARM,版本爲V5。點擊“GENERATE CODE"。
打開keil,找到“main.c"文件。我們可以找到核心代碼區:
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
//int tmp=0;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
在while循環之前,我們通常填入需要初始化的變量、條件;在while循環中,我們填入需要循環執行的代碼。特別需要注意的是,代碼需要寫在/* *** BEGIN*/
和/* *** END*/
之間。否則在代碼刷新或重置後,不在此範圍內的新編代碼會丟失。
代碼
在覈心代碼取輸入以下代碼:
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET);/*置PB12管腳爲高電平,以下同*/
HAL_Delay(100);/*延時函數,單位爲ms*/
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET);/*置PB12管腳爲低電平,以下同*/
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_8,GPIO_PIN_SET);/*注意此處的管腳爲D區的,應爲GPIOD*/
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_8,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_9,GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_9,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_10,GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_10,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_11,GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_11,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,GPIO_PIN_RESET);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
按照程序中的定義方式進行接線。同時點擊左上角的“Build”,編譯程序。
若程序編譯正確,使用FLYMCU打開程序的hex文件(在MDK-ARM中),點擊“開始編程”,將程序上傳於開發板。
上傳成功後,點擊開發板上的“RESET”按鈕,即可觀察到流水燈工作。
實驗效果
STM32-流水燈