前言
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
解压压缩文件,我这里选择最新版本
①以管理员身份运行,点击下一步
![在这里插入图片描述](https://img-blog.csdnimg.cn/facec9ba140f46dd94d0167873f139dd.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
②选择I agree… , 点击next
![在这里插入图片描述](https://img-blog.csdnimg.cn/dc889562412e4d8db706efea56328147.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) ③同意隐私设置,点击next
![在这里插入图片描述](https://img-blog.csdnimg.cn/64ef34475de74b68b017009f04134168.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
④选择安装路径(路径中最好不要出现中文与空格),点击next,点击yes
![在这里插入图片描述](https://img-blog.csdnimg.cn/69d86020e78e4c9ca31dfbd7c54508ce.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) ![在这里插入图片描述](https://img-blog.csdnimg.cn/95d8b092c4314f12849c6fcbbf76c2f2.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
⑤在桌面和开始菜单创建快捷方式(默认即可),这一步直接点next
![在这里插入图片描述](https://img-blog.csdnimg.cn/cd369b73d413402f8d398f493188b60a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
⑥等待一段时间,然后点击next
![在这里插入图片描述](https://img-blog.csdnimg.cn/5efbdc36288d4e4fa2862e1054855de2.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) ⑦点击done,安装完成
![在这里插入图片描述](https://img-blog.csdnimg.cn/4015402383a641b98288f3242ab95501.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/06ffe86d56264a2ea96a0b92b84f590a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
运行STM32cubemx,安装固件库
⑧选择help–Manage embedded software packages
![在这里插入图片描述](https://img-blog.csdnimg.cn/887490e221b348dfbe514ac6ee438782.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) ⑨选择F1系列下的任意安装包,点击Install Now(联网环境下)我这里已经安装了1.8.3
![在这里插入图片描述](https://img-blog.csdnimg.cn/6f5d511509a74d8698440b10bd17ad7d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) 正在下载中
![在这里插入图片描述](https://img-blog.csdnimg.cn/1efce50041f649708c1f738b4490d552.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) ⑩出现以下界面,安装成功
![在这里插入图片描述](https://img-blog.csdnimg.cn/469c2c05bbeb4cb6bddd5cfe28251ce7.png#pic_center)
二、使用CubeMX实现流水灯闪烁
(一)新建工程
- 运行STM32cubemx,选择File–New Project
![在这里插入图片描述](https://img-blog.csdnimg.cn/51e3330570f4430eb567c8d24e297e81.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/691d29a64b044f7080c6fd0b068bcb7d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
(二)基本配置
1.时钟配置
在Pinout&Configuration–System Core–RCC选择外部晶振,如下图所示 ![在这里插入图片描述](https://img-blog.csdnimg.cn/1da426c9001e480ea06a8b5504d25945.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) 选择完成后,在Clock Configuration下选择时钟频率为72M,输入完成后回车 ![在这里插入图片描述](https://img-blog.csdnimg.cn/6e87d4f3faa34586bff8663883d7df4c.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
2.GPIO引脚配置
在Pinout&Configuration中,单击PA12引脚,选择GPIO_Output
![在这里插入图片描述](https://img-blog.csdnimg.cn/c158f7f646374482b36e9a399570c8e5.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) 重复上诉操作,将PA12,PB1,PC14都设置为GPIO_Output
![在这里插入图片描述](https://img-blog.csdnimg.cn/43c49e4eedc942f189d84cbe0e50af03.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) 在Pinout&Configuration–System Core–GPIO下找到刚刚配置的三个引脚,如下图所示
![在这里插入图片描述](https://img-blog.csdnimg.cn/446717799bbf4427bc1a79660d4d57a9.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) 依次选择PA12、PB1、PC14,将其配置为下图所示
![在这里插入图片描述](https://img-blog.csdnimg.cn/707bb46437ab440e9d9436efec9d4762.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
3.生成工程配置
在Project Manager–Project下,配置如下图
![在这里插入图片描述](https://img-blog.csdnimg.cn/780d55d656f44f3fb0e89e608c5bcf66.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) 在Project Manager–Code Generator下
![在这里插入图片描述](https://img-blog.csdnimg.cn/793eeb909b1641698a2dbffdec485e02.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
- 配置工作完成,生成代码
![在这里插入图片描述](https://img-blog.csdnimg.cn/4a4a520ab33744ee8443b8efba5ed753.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) - 打开生成的工程文件,编辑
![在这里插入图片描述](https://img-blog.csdnimg.cn/96da1bdc70e24429991b361a62668272.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
(二)编写用户代码
/* 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之间插入代码
![在这里插入图片描述](https://img-blog.csdnimg.cn/fbdd97dd320a4b9ca2471ed076533d43.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
三、实例演示
![在这里插入图片描述](https://img-blog.csdnimg.cn/a526e38ecfe1491c930568164aae6659.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/3713039c894646299b1bbafb38d165a0.gif#pic_center) 注意 :如果确定代码没问题,接线也正确,但是最小系统板并没有正确执行程序,可以试试将BOOT0引脚在不断电的情况下从1换到0,再按一下复位键,程序就可以正常执行(我暂时还没找出问题,不过我在这里卡了很久,如果你遇到这个问题,可以试试。我这里使用的是串口下载,且已经勾选debug–setting–flash download–Reset and Run,但是还是出现上述问题,如果有大佬知道这个问题,欢迎留言,不胜感激.)
四、keil虚拟示波器
- 选择魔术棒-Target,选择外部晶振,设置为8.0
![在这里插入图片描述](https://img-blog.csdnimg.cn/e9cebd02def74f0ebd701da10f3b88a7.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/42e41374173a44398df6d27fa28876a5.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/b8a8e3b16b30424abb3f905a7e00cf82.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) -选择setup,配置为如图所示(我这里使用的是PA12、PB1、PC14)
![在这里插入图片描述](https://img-blog.csdnimg.cn/62fdc3956b7f4b4ca7fc09e7064b255a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/e78a5760bae845eb82e3a6d9c96dc08b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_16,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/c7c82527eb1c4beaa088ad7089d0fb68.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pifJibmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
总结
cubemx为我们初始化外设提供了极其简单、强大的工具,我们熟练掌握该工具可以更快的编写程序、提高效率。
另外关于keil可以虚拟显示波形,也是一个很强大的功能,有些时候想要观测PWM波,或者定时器波形,在没有示波器的情况下,这是一个很不错的替代。
以上是我关于Cubemx的理解,若有不当之处,敬请指教。
参考 搭建STM32开发环境——STM32CubeMX,Keil5
|