使用HAL库,实现流水灯周期闪烁和中断模式编程。
开发环境的搭建
1.安装jdk(有java环境的可以不用这一步)
jdk官网下载链接:
https://www.oracle.com/java/technologies/javase-downloads.html
2.安装STM32CubeMX
下载地址:
https://www.st.com/en/development-tools/stm32cubemx.html
安装过程
-
管理员身份运行 SetupSTM32CubeMX-4.27.0.exe ,点击Next
-
选择"I accept the terms of this license agreement",点Next
-
选择安装位置,默认位置是安装在C盘中
-
点击确定
-
选择Next
-
安装完成后,选择Next
-
点击Done,完成安装!
安装固件库
运行CubeMX 4.27,选择 Help->Magne 安装固件库
流水灯的实现
使用STM32CubeMX创建工程:
-
打开STM32CubeMX,选择你的目标STM32微控制器型号,然后进入项目。
-
在"Pinout & Configuration"选项卡中,开始如下配置:
点击A->Z,选择SYS,在Debug一栏选择Serial Wire
选择RCC,如下:
选择OPIO,设置PA0、PB0,PC13为OutPut:
-
在"Clock Configuration"选项卡中,设置如下:
-
在"Project Manager"选项卡中,按如下配置:
Project填好项目名称,然后在Toolchain/IDE选择MDK-ARM
Code Generator界面:
-
最后,点击GENERATE CODE,生成后直接点击打开项目
在Keil中编写代码:
- 在
main.c
文件中,找到while循坏,并将下面代码写入其中:
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // 灯1亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // 灯1灭
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 灯2亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 灯2灭
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // 灯3亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // 灯3灭
这段代码将交替控制三个LED灯的亮灭,每个LED都持续1秒。
编译:
编译项目并将生成的hex文件。
烧录:
将生成的文件烧录,便可以看到led周期闪烁的效果。
中断模式控制灯亮灭
使用STM32CubeMX创建工程:
-
打开STM32CubeMX,选择你的目标STM32微控制器型号,然后进入项目。
-
在"Pinout & Configuration"选项卡中,开始如下配置:
点击A->Z,选择SYS,在Debug一栏选择Serial Wire
选择RCC,如下:
选择OPIO,设置PA3、PB5,PA7为OutPut,PA5设置为GPIO_EXT13:
-
在"Clock Configuration"选项卡中,设置如下:
-
在"Project Manager"选项卡中,按如下配置:
Project填好项目名称,然后在Toolchain/IDE选择MDK-ARM
Code Generator界面:
-
最后,点击GENERATE CODE,生成后直接点击打开项目
在Keil中编写代码:
-
在
main.c
文件中,找到while循坏,并将下面代码写入其中():需要定义一个全局变量,char n=0;
switch(n)
{
case 0:
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
HAL_Delay(500);
if(n==1)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
break;
}
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
HAL_Delay(500);
if(n==1)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
break;
}
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET);
HAL_Delay(500);
}
case 1:
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
break;
}
}
-
重载void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin):
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin==GPIO_PIN_5) { for(int i=0;i<999;i++) {} n=!n; } }
当外部中断触发时,
HAL_GPIO_EXTI_Callback
函数会执行,从而实现中断控制。 -
编译:
编译项目并将生成的hex文件。
图片10
烧录:
将生成的文件烧录,便可以看到led周期闪烁的效果。