一.搭建STM32的开发环境
1.安装jdk
因为STM32CubeMX是Java实现的,所以说是需要安装jdk环境的。
官网下载地址:
2.安装STM32CubeMX
官网下载地址:
STM32CubeMX - STM32Cube initialization code generator - STMicroelectronics
3.STM32CubeMX安装过程:
首先进入安装初始界面:点击Next
勾选接受,然后点击Next
勾选I have read ...... ,然后点击Next
然后选择安装路径,记住不要在安装路径中出现中文,然后点击Next
点击Next
安装完成过后点击Next
点击Done就完成安装了
安装固件库
运行CubeMX 6.9.2,选择 Help
点击 Manage embedded software packages
选择适合自己芯片的固件库,本次流水灯实验我使用的是stm32f103c8t6,所以我选择STM32F1
然后再点击STM32F1勾选第一个开始下载
此时可能会显示下载不成功,注册账号后登录就可以下载了
进入了下载界面,等待下载即可
可以看出下载成功了已经
二. 新建工程,配置环境,生成KEIL代码
1.创建新工程
点击File,然后再点击里面的New Project
然后选择芯片STM32F103C8T6
然后点击Start Project
进入配置界面
2.端口配置
2.1 GPIO配置
首先点击PA0-WKUP,然后将它设置为GPIO_Output,端口变为绿色就可以说明成功了。
然后用同样的方法将其他的PA1,PA2,PA3,PA4,PA5,PA6,PA7端口设置为GPIO-Output。
结果如下:
配置输出的速度和初始状态:
然后点击System Core,然后再勾选GPIO,然后开始配置
同样配置其他PA1-7就可以了
PB4配置为外部中断源
然后同样的方法配置PB4
2.2 RCC配置
2.3 SYS配置
2.4 NVIC中断优先级配置
勾选中断使能
3.时钟配置
4.工程管理
设置工程名字 LED
然后设置工程路径,注意路径里面不能有中文和空格
选择MDK-ARM,然后选择V5
然后再设置代码生成工具
然后在点击代码生成
5.查看代码
三.添加流水灯和中断设置代码
1.任务要求
PA0-7八个端口连接8个LED灯的阳极,LED灯阴极接地,那么端口输出高电平LED灯就亮,低电平灯就灭。加上HAL_Delay()函数进行延时,实现流水灯效果。此外,将PB4引脚用作外部中断源,低电平时候流水灯不工作。
2.添加流水灯代码
void LED_Turn()
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7,GPIO_PIN_SET);
HAL_Delay(1000);
}
3.添加中断代码
这里我们首先讲解 STM32F1 IO 口中断的一些基础概念。 STM32F1 的每个 IO 都可以作为
外部中断的中断输入口,这点也是 STM32F1 的强大之处。 STM32F103 的中断控制器支持 19
个外部中断 / 事件请求。每个中断设有状态位,每个中断 / 事件都有独立的触发和屏蔽设置。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==GPIO_PIN_4)
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_4)==GPIO_PIN_RESET)//ϽµÑØ
flag=0;
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_4)==GPIO_PIN_SET) //ÉÏÉýÑØ
flag=1;//Á÷Ë®µÆ¹¤×÷
}
}
4.while(1)
while (1)
{
if(flag==1)
{
LED_Turn();
}
if(flag==0)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_RESET);
}
}
四. 实验效果
4.1实物效果
4.2仿真查看波形
配置魔法棒
查看波形:
五. 总结
1、对比之前的固件库,使用HAL库相对来说,HAL库开发效率大幅度提高,只需要在stm32cubeMX的UI界面进行操作,很快的就能配置好所需内容,不需了解STM32的每个接口的具体信息,然后就可以更简单得到函数。
2、仿真结果,起始电平在1秒开始,结束时间约为2秒结束,时间差大约为1秒,完成任务。