STM32开发入门(一)——流水灯

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-流水灯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章