前言
STM32CubeMX 是意法半导体推出的图形化配置工具,通过傻瓜化的操作便能实现相关配置,最终能够生成C语言代码,支持多种工具链,比如MDK、IAR For ARM、TrueStudio等。. 尤其值得一提的是,TrueStudio已经被ST收购,提供完全免费的版本,并且,通过插件式 安装 ,可以将 STM32CubeMX 集成在一个IDE,使用十分方便。
一、CubeMX安装环境
STMCubeMX是一个图形化的配置STM32代码的工具,它将硬件抽象层、中间层、示例代码等封装起来,用户可以通过图形化的操作方式,完成初始化代码工程。
由于STM32CubeMX是Java实现的,需要安装jdk环境。 jdk官网下载链接: https://www.oracle.com/java/technologies/javase-downloads.html
根据电脑型号,选择相应的下载版本,这里安装很简单,就直接跳过了
下载地址: https://www.st.com/en/development-tools/stm32cubemx.html
解压压缩文件,我这里选择最新版本
①以管理员身份运行,点击下一步
②选择I agree… , 点击next
③同意隐私设置,点击next
④选择安装路径(路径中最好不要出现中文与空格),点击next,点击yes
⑤在桌面和开始菜单创建快捷方式(默认即可),这一步直接点next
⑥等待一段时间,然后点击next
⑦点击done,安装完成
运行STM32cubemx,安装固件库
⑧选择help–Manage embedded software packages
⑨选择F1系列下的任意安装包,点击Install Now(联网环境下)我这里已经安装了1.8.3
正在下载中
⑩出现以下界面,安装成功
二、使用CubeMX实现流水灯闪烁
(一)新建工程
- 运行STM32cubemx,选择File–New Project
(二)基本配置
1.时钟配置
在Pinout&Configuration–System Core–RCC选择外部晶振,如下图所示 选择完成后,在Clock Configuration下选择时钟频率为72M,输入完成后回车
2.GPIO引脚配置
在Pinout&Configuration中,单击PA12引脚,选择GPIO_Output
重复上诉操作,将PA12,PB1,PC14都设置为GPIO_Output
在Pinout&Configuration–System Core–GPIO下找到刚刚配置的三个引脚,如下图所示
依次选择PA12、PB1、PC14,将其配置为下图所示
3.生成工程配置
在Project Manager–Project下,配置如下图
在Project Manager–Code Generator下
- 配置工作完成,生成代码
- 打开生成的工程文件,编辑
(二)编写用户代码
/* USER CODE BEGIN */ 用户代码
/* USER CODE END*/
STM32CubeMX生成的工程中添加代码要在提示 /* USER CODE BEGIN /和/ USER CODE END*/之间添加代码,这样STM32CubeMX重新生成代码时不会将自己添加的代码删除掉。 此外,注意使用Cubemx配置生成的工程中的注释最好不要随便删除掉。
#include "main.h"
#include "gpio.h"
void SystemClock_Config(void);
void LED_R_Toggle(void)
{
HAL_GPIO_TogglePin(LED_R_GPIO_Port,LED_R_Pin);
HAL_Delay(500);
HAL_GPIO_TogglePin(LED_R_GPIO_Port,LED_R_Pin);
HAL_Delay(5);
}
void LED_Y_Toggle(void)
{
HAL_GPIO_TogglePin(LED_Y_GPIO_Port,LED_Y_Pin);
HAL_Delay(500);
HAL_GPIO_TogglePin(LED_Y_GPIO_Port,LED_Y_Pin);
HAL_Delay(500);
}
void LED_G_Toggle(void)
{
HAL_GPIO_TogglePin(LED_G_GPIO_Port,LED_G_Pin);
HAL_Delay(500);
HAL_GPIO_TogglePin(LED_G_GPIO_Port,LED_G_Pin);
HAL_Delay(500);
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
LED_R_Toggle();
LED_G_Toggle();
LED_Y_Toggle();
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif
在BEGIN和END之间插入代码
三、实例演示
注意 :如果确定代码没问题,接线也正确,但是最小系统板并没有正确执行程序,可以试试将BOOT0引脚在不断电的情况下从1换到0,再按一下复位键,程序就可以正常执行(我暂时还没找出问题,不过我在这里卡了很久,如果你遇到这个问题,可以试试。我这里使用的是串口下载,且已经勾选debug–setting–flash download–Reset and Run,但是还是出现上述问题,如果有大佬知道这个问题,欢迎留言,不胜感激.)
四、keil虚拟示波器
- 选择魔术棒-Target,选择外部晶振,设置为8.0
-选择setup,配置为如图所示(我这里使用的是PA12、PB1、PC14)
总结
cubemx为我们初始化外设提供了极其简单、强大的工具,我们熟练掌握该工具可以更快的编写程序、提高效率。
另外关于keil可以虚拟显示波形,也是一个很强大的功能,有些时候想要观测PWM波,或者定时器波形,在没有示波器的情况下,这是一个很不错的替代。
以上是我关于Cubemx的理解,若有不当之处,敬请指教。
参考 搭建STM32开发环境——STM32CubeMX,Keil5
|