一、搭建开发环境
(一)安装MDK5
具体安装请参照下面链接:
如何开始一个stm32的简单程序的编译_stm32程序编译-CSDN博客
(二)安装Jdk
由于STM32CubeMX需要用到JAVA,因此需要安装jdk环境。
jdk官网下载链接:
Java Downloads | Oracle
(三)安装STM32CubeMX
1、下载地址
https://www.st.com/en/development-tools/stm32cubemx.html
2、安装过程
- 找到压缩包解压后右键exe文件并以管理员身份运行exe文件。
- 打开安装界面后点击下一步。
- 许可协议界面,首先勾选接受许可协议条款,随后点击下一步。
- 自主选择STM32CubeMX所要安装到的位置,然后点击Next。
- 此界面不用做操作点击下一步,进行安装。
- 等待进度条走完,点击Nex完成安装,随后点击Done。
- 在桌面上找到STM32CubeMX并打开,找到myST点击并登录账号(账号是在下载网址进行注册)
- 随后点击Help选择Manage embedded software packages选项。
- 找到我们使用的STM32F1XX系列,选择下载固件库(此处我下载的最新版本)。
二、HAL库开发方法及实践
(一)HAL库开发方法(点亮LED为例)
1、操作流程
- 创建新项目
- 选择自己所使用的芯片(STM32F103C8T6),双击该选项项目创建完成。
- 基础配置:选择SYS配置Debug。
- 配置时钟RCC,将将High和Low均选为最后一项即可,按照如下配置即可。
- 配置引脚PC13。
- 保存并且生成代码。
2、主函数修改
将如下函数添加至主函数中即可,代码如下:
//主函数代码中在while函数中添加
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//自定义部分
HAL_Delay(500);
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);//电平翻转函数
HAL_Delay(500);
}
/* USER CODE END 3 */
3、效果
(二)实验实践
1、题目1
(1)题目要求:重做上一个LED流水灯作业,用GPIO端口完成2只LED灯的周期闪烁。
(2)STM32CubeMX操作流程:
- 创建新项目
- 选择自己所使用的芯片(STM32F103C8T6),双击该选项项目创建完成。
- 基础配置:选择SYS配置Debug。
- RCC配置:与上方例子不同的是此处只配置HSE,如下图所示:
- 配置需要的端口:点击设置GPIO_OUTPUT,我选择的是PC13,PA15,PB0
将上述三个端口配置为高电平输出,如下图所示:
- Clock Configuration设置:此处只做此修该
- 保存并且生成代码。
(3)主函数修改:
将如下函数添加至主函数的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灭
2、题目2
(1)题目要求 :用GPIO端某一管脚接2个开关(用杜邦线模拟代替)。采用中断模式编程,当2分开关接高电平时,对应的两个LED灯停止工作(即停止周期性闪烁),接低电平时,恢复工作。
(2)STM32CubeMX操作流程:
同上述方法一样创建项目配置SYS和RCC一致,不同点在于引脚配置以及中断配置,端口配置和中断配置如下所示:
引脚配置:
中断触发类型分为:上升沿;下降沿;上升沿和下降沿都触发三种方式,这里我们选用下降沿,即按下按键,灯灭,松开灯亮。
中断配置:
保存并且生成代码,与上述方法一致。
(3)主函数修改:
进入到keil5后,只需要进行main.c的改写即可,在main主函数外加入下述代码。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
switch(GPIO_Pin){
case GPIO_PIN_0:
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET)
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
break;
case GPIO_PIN_1:
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1) == GPIO_PIN_RESET)
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
break;
}
}
三、总结
总体来说配置hal库操作起来相较于配置标准库和汇编语言要相对简单,但是个人比较喜欢配置标准库,但代码过长的程序使用Hal库更为方便。