【STM32+CubeMX】 新建一个工程(STM32F407)

本篇,完整地示范一次流程:CubeMX新建工程、Keil 配置仿真器、编写代码、编译、烧录!

目录

一、CubeMX 新建、配置工程

二、工程文件解释

三、Keil 设置仿真器

四、Keil编写代码

五、编译、烧录代码


一、CubeMX 新建、配置工程

   

双击打开 CubeMX,新建一个STM32工程。

   

步骤 9-1:以芯片型号 新建工程

   

步骤 9-2:搜索芯片型号

  • 输入芯片型号; (输入框变成粉色时,可能是输入的型号前面有一个空格,删除它即可)
  • 在搜索结果列表里,双击具体的芯片型号,进入配置。

    

步骤 9-3:配置 Debug 模式

  • 最容易错漏的 4 项中,这步是其1;  (刚上手CubeMX最容易忘记此配置)
  • 配置工程时,务必优先设置Debug模式! 即调试模式。
  • 默认是关闭!设置为:Serial Wire!通用STLink、JLink、DAP等仿真器。
  • 假如忘了设置此项,将导致:烧录程序后,第二次无法再烧录,俗称锁芯片;
  • 解锁芯片的操作:选择Serial Wire, 重新生成,编译;  断电,BOOT0用杜邦线接3.3V,上电,烧录,拔杜邦线。

   

步骤 9-4:设置晶振源

  • 最容易错漏的 4 项中,这步是其2;  
  • HSE:外部高速晶振,必须使能!(倘若没使能,配置时钟树时就无法选择HSE作为时钟源)
  • LSE :外部低速晶振,用于RTC。不用管它,默认即可,用到时再添加。

   

步骤 9-5:配置时钟树

  • 最容易错漏的 4 项中,这步是其3;  (容易填错晶振值)
  • 图中 1、3 两项,必须填写真实晶振值。建议细查板子晶振上的丝印字, 也可以查看原理图。
  • CubeMX在配置F407芯片时,晶振值默认是25!市面上的F407开发板,多用25M晶振,但也使用 8M晶振的,一定要注意区分。如果搞错了,程序可能无法运行、通信错乱等等。 
  • USB分频这项,如果是灰色不可选状态,不管它。当使用USB、SDIO功能时,它才生效。
晶振值输入分频输出倍频输出分频USB分频APB1分频APB2分频系统时钟
25 或 825 或 83362742168MHz

   

步骤 9-6:工程管理

进入工程管理页面,这一页要设置3个地方:工程名称、存放目录、开发环境。

  • 最容易错漏的 4 项中,这步是其4!
  • 易错点:工程存放位置、工程名称,全英文,不能中文!  否则,生成时会缺少文件。
  • 易错点:开发环境,默认是EWARM!如果用Keil开发,必须改为: MDK-ARM
  • Stack Size,  栈空间大小,建议改 0x1000。Heap Size,  默认,除非你需要使用malloc函数 。

堆大小 Heap Size

        默认即可,极少用到。当程序中需要用到malloc分配内存,如链表等,就要增大此值。

栈大小 - Stack Size

        重要!重要!重要!

        为方便以后在函数中定义:大体积结构体变量、大数组变量等,或者把它们作为函数变量、函数传参,又或者,要移植FreeRTOS、LVGL等功能,在配置工程时,建议先把Stack设置大一点,有备无患。建议 >=0x1000, 或者0x2000。

        在单片机开发中,栈空间大小是一个非常重要的概念,且又经常被忽视。与Java、Python等高级语言不同,单片机的内存资源非常有限,通常只有几十K到几百K。因此,开发者需要特别留意局部数组、变量等占用栈空间的大小,避免栈溢出,导致程序跑飞、卡死。

        编译器是无法预判局部变量占用大小的,如果程序运行中栈溢出,将较难排查。

   

步骤 9-7:代码文件配置

  • 标记2处:打勾!只复制需要的库文件!
  • 标记3处:打勾!为外设功能生成独立的 c、h 文件:倘若不打勾,外设的代码会堆在main.c中。

至此,工程所需,配置完毕。

   

步骤 9-8:配置 LED 引脚

不管是哪个板商的开发板,板子上都会有用户可控的LED,区别只是所用引脚编号不同,高低电平驱动不同。

在日常调试中,LED的一个大杀器般的调试手段!!

  • 点亮LED,能判断:程序是否已运行; 
  • 规律地闪烁LED,能判断:系统时钟配置是否正常、程序是否卡死;

通过查询原理图,开发板上蓝色 LED 使用的是PB2引脚:给PB2置低电平,即可通路点亮LED.

  • 点击芯片图框中的 PB2 引脚,选择: GPIO_Output,即输出模式;

引脚工作模式在设置为 GPIO_Output 后,参数将默认:推挽输出、初始化后输出低电平。

它的默认参数,已能令原理图中所示的LED电路导通(点亮),因此,这里不作修改。

如需进行修改,双击引脚列表中的 PB2 ,可打开其详细参数列表(如下图)。

   

步骤 9-9:生成工程

点击软件右上角的“CENERATE CODE”按钮,即可开始按配置生成工程。

稍等片刻,待生成完成后,将弹窗:

  • 可以选择 Open Folder 打开工程目录 ; 也可以选择 Close,  然后手动打开工程目录。

操作技巧:

  • 工程在第一次生成时,配置里必须是英文路径、名称 。否则,这个弹窗会有乱码,或,工程中会缺失启动文件。
  • 当工程生成后,可以把工程文件夹,修改成中文名称。也可以,把工程文件夹复制到中文的目录中存放,方便管理。
  • 但是,生成后不能修改:工程内的子文件夹名称、文件名称!否则工程无法正常打开。


二、工程文件解释

   

 1、工程根目录

打开工程目录后,不管哪种STM32芯片,  CubeMX生成后的工程文件、结构基本相同(如下图)。

当需要对工程进行修改配置、增减功能时,双击图中蓝色 ioc 文件,可再次进入CubeMX配置。

建议:在这个根目录中,手动新建一个“BSP”文件夹(自由命名),存放自己以后编写的代码文件。

Core用户平时要编写的文件,都在这文件夹里,如main.c
Drives芯片内核支持文件、 HAL库文件。都不用修改的
MDK-ARM重要:工程入口文件、仿真调试记录文件
工程名称.iocCubeMX的配置文件,双击它,就可以再次对工程进行配置

   

2、重要的子文件夹 MDK-ARM 

双击打开 “MDK-ARM"文件夹(如下图),里面有一个绿色图标的 uvprojx 文件。

它是 keil 的工程文件!

平时就是双击打开它,在 keil 里进行代码的编辑。

CubeMX 与 Keil 的区别

CubeMX:能直观、快速地配置一个新工程,并且为芯片功能生成初始化代码。但不包括业务代码。如:CAN通信,CubeMX能生成引脚初始化、CAN初始化代码,但不能生成筛选器代码。

Keil:当CubeMX生成工程后,用Keil打开工程,编写具体的业务代码。

其实,用keil也能手动新建、配置工程,编写初始化、底层代码,但比较麻烦,易出错漏。

而通过CubeMX实现,更直观、更省事。

CubeMX更大的意义在于,当我们熟悉了一个型号芯片的操作后,就能方便在其它型号的STM32芯片间游走,因为不同型号的芯片,配置操作是大致相同的、生成的代码文件结构是相同的、函数名称也是相同的;不同芯片间配置时的主要差异 :时钟树。


三、Keil 设置仿真器

   

各家板商的STM32开发板,都会引出SWD接口,可连接STLink、JLink、CMSIS-DAP等仿真器。

魔女科技的开发板,除了引出SWD接口用于外接仿真器,开发板上还直接集成了仿真器 CMSIS DAP !

下文,以板载仿真器CMSIS-DAP的配置为例,进行配置操作示范。

如果需要外接STLink、JLink, 可参考:仿真器 ST-Link、J-Link 的连接、参数设置

  • 当使用 Keil 进行工程开发,建议使用板载的CMSIS-DAP仿真器,更方便,无需再外接其它仿真器。
  • 当使用 CubeIDE 进行开发,得经SWD外接STLink、JLink,因为CubeIDE尚未支持CMSIS DAP。

1、板载仿真器 CMSIS DAP的 接线方式

如上图,USB线直接插入CMSIS DAP接口中,即可。

USB线材要求:尽量使用开发板配送的 Type-C 线,它的内部是四芯线:两根供电、两根通信。也可以使用手机的Type-C数据线。一些小电器用的充电线,多为两芯线,只能充电,不能用作数据通信。

指示灯状态:插入USB线连接到电脑后,白色LED灯自动慢闪,表示与电脑连接成功。

白灯慢闪连接电脑成功; 
白灯常亮连接电脑失败; 尝试更换USB线; 尝试插到电脑另外的USB口;
白灯不亮供电有问题:短路、烧了芯片; 尝试把板上所有杜邦线拔光重新插上;

如果电脑提示不能识别设备:

        CMSIS DAP是免驱动的,即插即用。Win7、10、11, 都不用安装驱动。

        当提示无法识别设备时,那是win7系统无法识别这个接口的另一个功能:板载的USB转TTL 。安装网盘中的USB转TTL驱动即可。

        板载的 CMSIS DAP 与 USB转TTL(UART1),这两个功能是相互独立的,使用上不会发生冲突。 

   

 2、CMSIS DAP 参数设置   

每个工程只需配置一次仿真器。CubeMX重新生成后,不用再次设置,除非改用其它的仿真器。

双击 工程目录 / MDK-ARM 下的那个 uvprojx 文件(绿色图标),即可打开 keil 工程。 

仿真器 CMSIS -DAP 的具体配置如下图。主要是以下 3项,其它参数默认:

  1. 选择 CMSIS DAP ;(必须的。)
  2. 选择 under Reset ;(非必须的。当误锁芯片无法烧录时,选择此项再烧录,可解锁芯片。)
  3. 打勾 自动复位 ;(烧录后,自动复位、运行新程序。)


四、Keil编写代码

   

本节,示范如何在keil里编写代码。

   

1、打开代码文件

    双击左侧文件管理器中的 Core 文件夹,其下,有最常用的main.c、it.c等文件。

    双击main.c,即可在代码编辑区中打开进行编辑。

    2、编写代码

    在main.c中,添加用户代码,规律地反转PB2引脚电平,让LED闪烁!

    • 重点:用户代码,必须写在CubeMX生成的配对注释行之间,否则 ,重新生成时会被删除。
    • main.c文件中,向下滑动,找到main函数
    • 在while循环体内/* USER CODE BEGIN 3 */的下方,编写以下代码
    HAL_Delay(500);                          // 延时500ms
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2);   // 反转PB2的引脚电平

    完成后,代码位置如下图:


    五、编译、烧录代码

         

      1、编译代码

      点击工具栏的 “编译” 按钮,可对工程代码文件进行编译。

      工程的第一次编译,时间会有点长,大约几十秒。

      编译完成后,信息栏会显示:Error的数量、Flash占用(代码体积)、RAM占用(内存)、编译时长等。

      如下图,这里 Error 的数量是 0 。

      重点注意:只有在编译后显示 0 Error 时, 才能自动生成axf格式的可烧录文件。

      如果,在CubeMX配置时使用了中文路径、名称,或者代码有语法错误,信息栏这里就会提示错误的总数量,向上滚动,可以查看到各个错误的位置、原因描述,双击错误描述即可跳转到错误的位置,按提示一点点修改即可。

      排错技巧:当发生错误时,复制错误描述的关键字,粘贴到csdn.net中,可搜索到具体的解决方法。

         

      2、烧录代码

      点击“烧录” 按钮,即可把编译后的axf文件,烧录到芯片中。

       烧录开始后,信息栏可以看到烧录的状态,如擦除进度、烧录进度等等......

         

      烧录完成后,信息栏显示如下:

      烧录完成后,如果刚才在仿真器设置中,打勾了自动复位,程序就会立即运行!

      这时,我们可以看到开发板上的蓝色LED,每秒闪烁1次!这表示程序已正常运行了!


      至此,工程已新建、配置完成。

      以后,可以在这个工程里添加其它功能代码。

      也可以复制这个工程文件夹,把它作为其它工程的模板使用,以减少新建工程的时间开支。

      如有错漏 ,欢迎指正,及时更新~~!

      ### STM32F407时钟配置方法 #### 配置概述 STM32CubeMX 是一款功能强大的图形化工具,能够简化基于STM32微控制器的开发过程。对于STM32F407系列芯片而言,在“Clock Configuration”选项卡中可以完成系统时钟和外设时钟的频率设定[^1]。 当进入该界面后,可以通过调整PLL(Phase-Locked Loop)、AHB/APB总线分频器以及内部/外部晶振参数来实现目标工作频率的设置。这些操作会直接影响到MCU性能表现及其功耗水平[^2]。 #### 外部高速与时钟源选择 针对高性能需求的应用场景下,推荐启用HSE(External High Speed Oscillator),它提供了更加精确稳定的基准信号给整个系统的运行提供保障;而对于一些特定的功能模块比如RTC(real time counter),则需要用到LSE(Low-speed external oscillator)作为其独立供电下的计时依据,一般固定为32.768KHz[^3]. #### 主要步骤说明如下: - **启动项目并选定设备型号** 打开STM32CubeMX软件之后新建工程文件,并从中挑选出对应的目标器件——即这里所讨论的对象STM32F407VE/VET/E/Z/N/G/B/C/D/W/R/P/T/U/Y/M/L/K/J/H/F/E-DISCO板子之一版本号即可满足要求. - **访问时钟树结构编辑页面** 完成上述基本初始化动作以后,“Pinout & Configuration”标签页里找到 “Clock Configuration”,点击进去就能看到详细的时钟架构图解视窗呈现出来供进一步定制修改之用了。 - **定义核心处理器速度及其他关联参数** 根据实际应用场景的不同考量因素综合权衡决定最终数值大小范围内的合理取舍方案。例如常见的 Cortex-M4 内核最高可达 168 MHz 的主频限制条件下进行优化处理得到最佳平衡点位置处停止迭代计算流程直至达到预期效果为止。 下面给出一段简单的C语言代码片段展示如何读取当前系统时钟值: ```c #include "stm32f4xx_hal.h" uint32_t GetSysClockFreq(void){ return HAL_RCC_GetSysClockFreq(); } ``` 此函数利用HAL库封装好的API接口调用来获取实时更新后的全局变量存储地址指向的内容返回给调用者继续后续逻辑运算分析判断分支走向等等用途广泛适用性强兼容性好易于维护扩展升级等功能特性兼具一身值得信赖长期合作共谋发展大业! ---
      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

      当前余额3.43前往充值 >
      需支付:10.00
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包
      实付
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

      1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
      2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

      余额充值