完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
1个回答
|
|
一、STM32CubeMX 简介
STM32CubeMX 是 ST 意法半导体近年来大力推荐的 STM32 芯片图形化配置工具,允许用户使用图形化向导生成 C 初始化代码,大大减轻开发工作,时间和费用。STM32CubeMX几乎覆盖了 STM32 全系列芯片。具有如下特性: 1)直观的选择 MCU 型号,可指定系列、封装、外设数量等条件; 2)微控制器图形化配置; 3)自动处理引脚冲突; 4)动态设置时钟树,生成系统时钟配置代码; 5)可以动态设置外围和中间件模式和初始化; 6)功耗预测; 7)C 代码工程生成器覆盖了 STM32 微控制器初始化编译软件,如 IAR,KEIL,GCC; 8)可以独立使用或者作为 Eclipse 插件使用。 STM32Cube 包含 STM32CubeMX 图形工具和 STM32Cube 库两个部分,使用 STM32CubeMX 配置生成的代码,是基于 STM32Cube 库的。使用 STM32CubeMX 配置出来的初始化代码,和STM32Cube 库兼容,例如硬件抽象层代码就是使用的STM32的HAL库。不同系列芯片,会有不同的 STM32Cube 库支持,而 STM32CubeMX 图形工具只有一种。所以配置不同的 STM32 系列芯片,选择不同STM32Cube 库即可。 二、STM32CubeMX 运行环境搭建 STM32CubeMX 运行环境搭建包含两个部分。首先是 Java 运行环境安装,安装完 Java 运行环境之后,可以打开 Windows 的命令输入框,输入:java –version 命令,如果显示 Java 版本信息,则安装成功。 其次是STM32CubeMX 软件安装。可以从 ST官方下载,下载地址为:ST网站。 安装完成后 在软件中指定 STM32Cube 软件包(本次用的开发板是L4系列的),依次点击 Help->Updater Settings,如下图所示: 三、使用 STM32CubeMX 工具配置工程模板 1)工程初步建立和保存 新工程的建立有两种方法,一是打开 STM32CubeMX 之后在主界面点击 New Project 按钮,二是在菜单栏依次点击 File->New Project。操作方法如下图所示: 在弹出的窗口中,依次在选项卡 Series选择STM32L4,在选项卡Lines选择STM32L4x5,在选项卡Package选择 LQFP100。最后在右下方的MCUs List里双击STM32L475VET芯片型号。 双击后进入Pinout 选项卡,界面展示芯片完整引脚图,如下图所示。点击菜单栏 File->Save Project,保存工程到某个文件夹下面即可。 2)RCC 设置 在 STM32CubeMX 中,RCC 相关设置非常简单,在Pinout选项卡里,选择Peripherals->RCC进入RCC配置栏,操作步骤如下图所示: 上图中,RCC 配置栏只有 6 个配置项: 1)选项 High Speed Clock(HSE)用来配置 HSE; 2)选项 Low Speed Clock(LSE)用来配置 LSE; 3)选项 Master Clock Output 用来选择是否使能 MCO 引脚时钟输出; 4)选项 LSCO Clock Output 用来选择是否使能将低速时钟输出到外部 LSCO; 5)选项 SAI1 Extern Clock 用来配置是否使能外部 SAI1 时钟; 6)选项SAI2 Extern Clock 用来配置是否使能外部 SAI2 时钟。 本次只使用到 HSE,所以设置选项 High Speed Clock(HSE)的值为Crystal/Ceramic Resonator(使用晶振/陶瓷振荡器)。这里Bypass Clock Source 的意思是旁路时钟源,也就是不使用使用晶振/陶瓷振荡器,直接通过外部提供一个可靠的 4-26MHz 时钟作为 HSE。 配置好的 RCC 配置选项如下图所示: 上图中,打开 HSE 之后,右边的引脚图中,相应的引脚会由灰色变为绿色,表示该引脚已经被使用。 3)时钟系统(时钟树)配置 在使用 STM32CubeMX 配置时钟树之前,需要充分理解 STM32 时钟系统,可参考STM32L4 时钟系统简介文章学习。 点击 Clock Configuration 选项卡进入时钟系统配置栏,如下图所示: 可以看到,界面展现一个完整的 STM32L4 时钟系统框图。这个时钟树配置图主要配置外部晶振大小,分频系数,倍频系数以及选择器。在配置过程中,时钟值会动态更新,如果某个时钟值在配置过程中超过允许值,那么相应的选项框会红色提示。 这里,配置的目标是: 1)PLL时钟为 PLLCLK=HSEN/(MR)=8MHz20/(12)=80MHz; 2)选择系统时钟源为 PLL,所以系统时钟SYSCLK=80MHz; 3)AHB 分频系数为 1,故其频率为 HCLK=SYSCLK/1=80MHz; 4)APB1 分频系数为 1,故其频率为PCLK1=HCLK/1=80MHz; 5)APB2 分频系数为 1,故其频率为 PCLK2=HCLK/1=80MHz。 下图是配置系统时钟的截图: 系统时钟配置分为七个步骤: ① 时钟源参数设置:HSE 或者 HSI 配置。这里选择 HSE 为时钟源,所以之前必须在 RCC 配置中开启 HSE; ② 时钟源选择:HSE、HSI 还是 MSI,选择 HSE ; ③ PLL 分频系数 M 配置,设置为 1; ④ 主 PLL 倍频系数 N 配置,设置为 20; ⑤ 主 PLL 分频系数 R 配置,配置为 2; ⑥ 系统时钟时钟源选择:PLL,HSI,HSE 还是 MSI。选择 PLLCLK ; ⑦ 经过上述配置,此时 SYSCLK=80Mhz。 下图是配置 SYSTICK、AHB、APB1 和 APB2 的分频系数的截图: AHB,APB1 和 APB2 总线时钟以及 Systick 时钟的最终来源都是系统时钟 SYSCLK。 AHB 总线时钟 HCLK 是由 SYSCLK 经过 AHB 预分频器之后的来,这里设置 AHB 预分频器为1,则 HCLK 为80MHz。 得到 HCLK 之后,在图标号 9~11 处依次配置 Systick,APB1 和 APB2 的分频系数分别为1,1 和 1 。 配置完成之后,HCLK=80MHZ,Systick=80MHz,PCLK1=80MHz,PCLK2=80MHz。 4)GPIO 功能引脚配置 开发板上的 PE7、PE8 和 PE9 引脚连接了一个 RGB 灯,TM32CubeMX 可直接在芯片引脚图上配置 IO 口参数。 单击STM32CubeMX的Pinout选项卡,在搜索栏输入 PE7、PE8 和 PE9 即可找到 PE7、PE8和PE9在引脚图中的位置,如下图所示: 点击PE7,在弹出的下拉菜单中,选择IO口的功能为GPIO_Output。用同样的方法配置PE8和PE9,选择功能为GPIO_Oput 。注意,如果要配置IO口为外部中断引脚或其他复用功能,选择相应的选项即可。 配置完IO口功能之后,还要配置IO口的速度,上下拉等参数。单击 Configuration 选项卡,单击GPIO,如下图所示: 进入IO口配置界面之后,界面会列出所有使用到的IO口的参数配置。选中PE7栏,就会在显示框下方显示对应的IO口详细配置信息,对参数进行相应配置即可。配置方法如下图所示: 配置完成之后,点击 OK 后界面回到 Configuration选项卡界面。 对于选项卡 Power Consumption Calculator,作用是对功耗进行计算。 5)生成工程源码 经过上述步骤,一个完整的系统已经配置完成。接下来,使用 STM32CubeMX生成工程源码。在 STM32CubeMX 操作界面,依次点击菜单 Project->Generate Code生成源码,操作方法如下图所示: 配置完成后,点击OK开始生产源码。源码生产完成之后,就保存在我们 Project Location选项配置的目录中,同时弹出生成成功提示界面,我们可以点击界面的“Open Folder”按钮打开工程保存目录,也可以点击界面的“Open Project”按钮直接使用 IDE 打开工程。 生产的工程目录结构如下图所示: 上图中: Drivers 文件夹存放的是 HAL 库文件和 CMSIS 相关文件; Inc 文件夹存放的是工程必须的部分头文件; MDK-ARM文件夹存放的是 MDK 工程文件; Src文件夹存放的是工程必须的部分源文件; 20201205.ioc是 STM32CubeMX 工程文件,双击该文件工程就会在 STM32CubeMX 中被打开。 6)编写用户代码 首先打开生成的工程模板进行编译,发现没有任何错误和警告。 该工程模板将时钟系统配置源码放在main.c 源文件中。打开 main.c 源文件可以看到该文件定义了两个关键函数 SystemClock_Config 和 MX_GPIO_Init,并且在 main 函数中调用了这两个函数。SystemClock_Config 函数用来配置时钟系统,MX_GPIO_Init 函数用来初始化 PE7、PE8和PE9的相关配置。 对main函数进行编辑,删掉源码注释,关键源码如下: / /* USER CODE BEGIN 0 */ void Delay(__IO uint32_t nCount); void Delay(__IO uint32_t nCount) { while(nCount--){}; } /* USER CODE END 0 */ int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_SET); //PE7 置 1 HAL_GPIO_WritePin(GPIOE, GPIO_PIN_8, GPIO_PIN_SET); //PE8 置 1 HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, GPIO_PIN_SET); //PE9 置 1 Delay(0x7FFFFF); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_RESET); //PE7 置 0 HAL_GPIO_WritePin(GPIOE, GPIO_PIN_8, GPIO_PIN_RESET); //PE8 置 0 HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, GPIO_PIN_RESET); //PE9 置 0 Delay(0x7FFFFF); /* USER CODE END 3 */ } } 完成后,对工程进行编译,发现没有任何警告和错误。运行系统,实现 RGB 灯闪烁的效果。 |
|
|
|
只有小组成员才能发言,加入小组>>
3308 浏览 9 评论
2988 浏览 16 评论
3490 浏览 1 评论
9049 浏览 16 评论
4083 浏览 18 评论
1167浏览 3评论
601浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
592浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2329浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1892浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 12:14 , Processed in 1.145371 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号