用STM32F103C8T6点亮一组由3个不同色的LED组成的流水灯,以及用它的中断原理点亮两个LED灯(HAL库方式)【STM32开发板】【STM32CubeMX】
HAL库方式的开发环境搭建——STM32CubeMX
安装JDK
STM32CubeMX是Java实现的,因此需要安装jdk环境。
jdk官网下载链接:https://www.oracle.com/java/technologies/javase-downloads.html
安装STM32CubeMX
下载地址:https://www.st.com/zh/development-tools/stm32cubemx.html
安装过程:
- 下载完成后解压,得到安装程序。
- 以管理员身份运行安装程序。进入程序界面后点击 “Next”。
- 在License agreement界面,勾选"I accept the terms of this license agreement",点击 “Next”。
- 选择安装位置,默认位置是安装在C盘中(注意:安装路径不要出现中文)。选择完成后点击 “Next”。若你的电脑没有这个安装路径,程序会提示“将创建此路径”,点击“确定”即可。
- 在Shortcuts Setup界面,保持默认设置,点击 “Next”。
- 开始安装。安装结束后点击 “Next”,接着点击 “Done” 即完成安装。
安装STM32F1的STM32CubeMX固件库
下载地址:https://www.st.com.cn/zh/embedded-software/stm32cube-mcu-mpu-packages.html
在产品选择器中选择 “STM32CubeF1”,点击 “Open software page”,点击“获取软件”选择某一版本下载即可(尽量选择最新版本)。
安装过程:
- 运行STM32CubeMX,点击 “Help”,点击 “Manage embedded software packages”。
- 弹出窗口后点击左下角的 “From Local…”,找出下载好的固件库选中并打开。
- 等待固件库安装完成。若安装的固件库版本在弹窗中显示前面方框绿色,说明安装成功。
点亮一组由3个不同色的LED组成的流水灯
实验说明
本次实验选择PA15, PB0, PC13作为输出端口,默认输出电平为高。
在STM32CubeMX中建立并配置项目
点击 “File” -> “New Project”,选择芯片STM32F103C8,点击 “Start Project” 即建立项目。
在Pinout & Configuration界面中,点击GPIO设置端口。点击PA15端口,选择GPIO_Output即将PA15端口设置为输出,如下图。用同样的方法设置PB0, PC13端口为输出。
再将三个端口的默认输出电平设置为高,如下图。
点击SYS,选择Debug(调试)类型为Serial Wire(串行线),如下图。
点击RCC,选择High Speed Clock(高速时钟)模式为Crystal/Ceramic Resonator(晶振),如下图。
在Clock Configuration界面中,设置System Clock Mux为PLLCLK,如下图。
在Project Manager界面中,设置好项目名、项目位置,选择IDE为MDK-ARM(版本选择电脑上安装的版本),选择在网上下载并安装好的固件库,如下图。
点击Code Generator,勾选 “Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral”,如下图。
最后,点击 “Generate Code”,即可创建Keil项目并打开。
在Keil中编写程序和配置项目
在主函数 (main.c) 中找到 while(1) (注意:不是Error_Handler函数中的while(1)),在 while(1) 中写入以下程序:
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_15, GPIO_PIN_RESET); // 灯2亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, 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灭
由于STM32CubeMX在创建项目时就勾选了 “Create HEX File”,输入代码后直接点击“编译”即可生成hex文件。
STM32开发板实现
如下图所示,将STM32开发板插入面包板并与ST-link连接(相接的两接口应同名),分别用导线将开发板两侧的3.3V输出接至面包板两侧的正极槽、接地输入接至面包板两侧的负极槽。将一个红色LED接在开发板的B0接口上,具体做法是将正极(长管脚)接至正极槽,负极(短管脚)接至开发板B9接口所接在的一槽。用同样的方法将一个绿色LED接在开发板的A15接口上,将一个蓝色LED接在开发板的C13接口上。
代码在Keil中编译完成后,点击“下载”,即可将代码载入STM32单片机中并开始运行。运行结果如下。
Keil波形图
第一行(红色)是B0端口(红灯),第二行(绿色)是A15端口(绿灯),第三行(黑色)是C13端口(蓝灯)。三个端口的电平都是低电平1s—高电平2s的循环,只是在第1个周期内,第一行在第1s时为低电平,第二行在第2s时为低电平,第三行在第3s时为低电平。
用STM32的中断原理点亮两个LED灯
实验说明
本次实验选择PA4, PA6作为输出端口,默认输出电平为低;PB3, PB5作为外部中断端口,当电平升/降时中断。PB3控制PA4,PB5控制PA6。
在STM32CubeMX中建立并配置项目
点击 “File” -> “New Project”,选择芯片STM32F103C8,点击 “Start Project” 即建立项目。
在Pinout & Configuration界面中,点击GPIO设置端口。点击PA4端口,选择GPIO_Output即将PA4端口设置为输出。用同样的方法设置PA6端口为输出。点击PB3端口,选择GPIO_EXTI3即降PB3端口设置为外部中断,如下图。用同样的方法设置PB5端口为外部中断。
再将PB3, PB5两个端口的GPIO mode设置为 “External Interrupt Mode with Rising/Falling edge trigger detection”,如下图。
点击NVIC,勾选 “EXTI Line3 Interrupt” 和 “EXTI Line[9:5] Interrupts”,如下图。
点击SYS,选择Debug(调试)类型为Serial Wire(串行线)。
点击RCC,选择High Speed Clock(高速时钟)模式为Crystal/Ceramic Resonator(晶振)。
在Clock Configuration界面中,设置System Clock Mux为PLLCLK。
在Project Manager界面中,设置好项目名、项目位置,选择IDE为MDK-ARM(版本选择电脑上安装的版本),选择在网上下载并安装好的固件库。
点击Code Generator,勾选 “Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral”。
最后,点击 “Generate Code”,即可创建Keil项目并打开。
在Keil中编写程序和配置项目
在stm32fixx_it.c中找到HAL_GPIO_EXTI_IRQHandler,右击选择 “Go to Definition of ‘HAL_GPIO_EXTI_IRQHandler’”,跳转至HAL_GPIO_EXTI_IRQHandler的定义部分。往下找到HAL_GPIO_EXTI_Callback这个函数,在此函数中写入以下程序:
if(GPIO_Pin == GPIO_PIN_3){
//获取B3的电位
GPIO_PinState pinState1 = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3);
//低电位
if(pinState1 == GPIO_PIN_RESET)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//把A4变为低电位
//高电位
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//把A4变为高电位
}
if(GPIO_Pin == GPIO_PIN_5){
//获取B5的电位
GPIO_PinState pinState2 = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5);
//低电位
if(pinState2 == GPIO_PIN_RESET)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);//把A6变为低电位
//高电位
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET);//把A6变为高电位
}
由于STM32CubeMX在创建项目时就勾选了 “Create HEX File”,输入代码后直接点击“编译”即可生成hex文件。
STM32开发板实现
如下图所示,将STM32开发板插入面包板并与ST-link连接(相接的两接口应同名),分别用导线将开发板两侧的3.3V输出接至面包板两侧的正极槽、接地输入接至面包板两侧的负极槽。将一个红色LED接在开发板的A4接口上,具体做法是将正极(长管脚)接至正极槽,负极(短管脚)接至开发板B5接口所接在的一槽。用同样的方法将一个绿色LED接在开发板的A6接口上。再将一根红色导线的一端接至开发板B3接口所在的一槽。用同样的方法将一根绿色导线的一端接在开发板的B5接口上。实验时将某一根导线的另一端接高电平或低电平,观察对应灯的亮灭变化;再将该导线从高电平或低电平端拔出,观察对应灯的亮灭变化。
代码在Keil中编译完成后,点击“下载”,即可将代码载入STM32单片机中并开始运行。运行结果如下。
红灯/红导线:
绿灯/绿导线:
Keil波形图
(波形图内改变中断端口电平的操作未知,故暂缺)
总结
本次实验学习了使用HAL库方式,在STM32CubeMX建立项目和生成Keil项目并编写程序的方法。使用该方式明显比使用GPIO标准库的方式简便得多。