实验工具
单片机:正点原子STM32F4探索者 软件:CubeMX、Keil5 参考文档: 《STM32F4xx中文参考手册》 《正点原子 STM32F4 开发指南V1.2–HAL 库版本 》 ST32 HAL库使用手册
一、STM32CubeMX 简介
STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具,目的就是为了方便开发者, 允许用户使用图形化向导生成C 初始化代码,可以大大减轻开发工作,时间和费用,提高开发效率。STM32CubeMX几乎覆盖了STM32 全系列芯片。 在CubeMX上,通过傻瓜化的操作便能实现相关配置,最终能够生成C语言代码,支持多种工具链,比如MDK、IAR For ARM、TrueStudio等 省去了我们配置各种外设的时间。
二、LED的引脚信息
在进行设计之前,我们需要了解使用期间的具体引脚信息,这块板子上有3个LED,可控制的LED为LED0与LED1,电路原理图为下图,查阅单片机使用手册可知,两个LED分别与PF9,PF10相连,控制电平为高时灯灭,低时为亮。
三、CubeMX生成配置代码(HAL库)
1、CubeMX创建工程
新建工程可以有三种选项: (1)选择MUC设计,只针对芯片不包含外围电路 (2)选择ST开发板设计,针对ST公司推出的一些开发板 (3)选择ST开发板例程进行设计 大部分时候我们使用的开发板都不是ST公司的,基本都是使用其他公司设计的开发板所以我们选择第一种方式,也是我们最常用的一种方式。
2、芯片选择
在这里我们可以选择我们将要使用的MCU的芯片型号,这里提供了很多筛选方式可以快速找到我们需要的芯片型号,本实验使用的是STM32F407ZGT6
3、硬件配置界面
界面展示出了STM407ZGTx系列的所有资源,接下来需要配置我们需要使用的引脚,这里对某一个功能进行整体配置,例如直接配置ADC,I2C什么的不需要逐个引脚去配置,可以在界面左边的资源列表进行选择。 我们只是简单的使用两个引脚做高低电平的输出,所以找到PF9与PF10进行设置 接下来是时钟配置,我们可以在这个界面设置接入到各个模块的时钟频率,STM32F4有5个时钟源 LSI、LSE、HSE、HSI、PLL。 STM32的时钟树系统比较复杂,具体可以参考STM32 F4的官方文档进行学习了解 图的左边部分就是芯片的时钟源,右边部分即为输出的时钟频率 实验使用最大频率168MHz 生成工程的名称与设置输出工程的软件类型 (1)在code设置中对项目的设置为只输出必要的文件,第一个选项生成的文件为完整的库很多文件用不到,我们使用这个软件只是需要截取配置部分的代码就可以了。 (2)生成文件勾选每个配置的代码文件和头文件单独生成,不然全部代码都会在main中很难看
四、代码分析与功能实现
生成代码的main函数分为几个部分 1、HAL_Init()为 HAL库的初始化 2、SystemClock_Config()为系统时钟的配置 3、MX_GPIO_Init() 为对配置的GPIO口的初始化 4、单片机的 while GPIO配置代码,生成的这部分代码使能了GPIO口对应的时钟,设置了GPIO的初始状态为低,最后对GPIO的参数进行设置并进行初始化。 最后我们来编写LED流水灯的代码并烧写到板子上进行验证即可完成本次实验
HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED0_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(LED0_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
HAL_Delay(500);
五、实验改进
1、时钟配置并开启中断
为了观察CubeMX修改配置后的变化和学习CubeMX的中断配置,增加一部分实验,使用基本定时器TIM6通过中断去控制LED灯的亮灭。 在CubeMX中打开TIM6设置, 参数含义为: Prescaler 分频系数 Counter Mode 计数模式(分为向上和向下) Count Period 计数周期 auto-reload preload 自动重装载 TRGO Event Selection 触发事件 NVIC Settings中勾选中断使能 定时器溢出时间的计算公式如下 TIM6不知道挂在APB1还是APB2,这里我们把两个时钟都设置为84MHz,我们想实现500ms的延时则分频系数可以设置为psc=839,counter=49999。这里的两个参数为16bit Max=65535
2、代码分析与实现
初始化部分仅多了一个TIM6的初始化函数 因为生成代码时勾选了重新生成项目时不删除用户编写的代码,所以即使重新生成了文件上一部分的控制代码依然还在注意代码要写在注释的begin与end之间,写在其他地方代码还是会被删除 使用这个函数开启时钟才能正常调用中断
HAL_TIM_Base_Start_IT(&htim6);
这个c文件,找到TIM6的中断,在其中添加翻转PA0的代码即可:
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
|