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-流水灯
来源:oschina
链接:https://my.oschina.net/u/4271231/blog/4943092