• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

STM32 CubeMX EWARM开发流程备忘录

武飞扬头像
ktd007
帮助2

硬件平台:启明欣欣STM32F407开发板V4.1 ST-LINK

学新通

软件平台:ST CubeMX V6.5.0 EWARM V7.20 STM32 ST-LINK Utility V4.20

软件安装过程省略

一、使用CubeMX生成工程代码框架

【1】打开CubeMX选择正确的器件型号,开发板用的是STM32F407ZGT6。

学新通

学新通

【2】配置STM32F407ZGT6芯片的设置

选择需要的组件并配置,因为只是演示开发流程,只用到UART5和3个LED灯,所以只需要配置下图红框的部分内容。

学新通

在System Core中先配置时钟源RCC

 根据原理图,PH0和PH1连接了一个8MHz的无源晶振。学新通

在RCC一栏按照下图配置,使能PH0和PH1的时钟输入。

学新通

在GPIO里设置用于控制LED的3个GPIO,在右侧芯片对应的pin上右键,在下拉菜单中选择GPIO output,然后在User Label中填入注释内容,这里使用LED0/LED1/LED2。注释的内容可以随便填,主要是为了方便分辨功能定义。

学新通

然后在SYS里的DEBUG一栏如下图选择,其实就算Disable也不影响仿真的功能,只是为了标注下Debug口,防止被错误占用。

学新通

接下来配置UART,主要是选好波特率等参数,并且绑定好UART占用的两个IO。 

学新通

接下来在Clock Configuration页进行时钟树配置

STM32的时钟树非常复杂,很容易因为配错而导致芯片运行不正常。现在借助CubeMX可以很容易就完成时钟树的配置。

配置好8MHz的外部无源晶振频率

如下图做好选择

然后点击Resolve Clock Issues进行参数计算,下图是已经配置并计算好的,所以这个按钮变成了灰色。

学新通

 在Project Manager页设置需要生成的工程代码框架的一些参数

生成代码的存放路径,

开发IDE工具,这里使用EWARM V7

学新通

学新通

至此,演示工程需要的配置就完成了,接下来就是点击Generate Code按钮进行代码生成。

学新通

二、修改IAR的配置以及CubeMX生成的代码

使用IAR(EWARM)打开CubeMX生成的工程

学新通

这时候,main()函数已经添加好芯片初始化函数。但是因为CubeMX的一个不算bug的bug,这时候直接编译是会报错的。

 还需要对IAR以及代码做一些设置

(1)确认下编译器中的器件选择是否正确

学新通

上一步设置了正确的型号后,再编译还是会有一堆错误,大约如下图所示

学新通

 问题出在 __RESTRICT这个宏定义上。在cmsis_iccarm.h中被定义。

学新通

需要将__restrict前面的两个下横杠去掉

学新通

再编译就正常了。

三、编写用户代码

【1】使用printf()函数通过串口输出调试信息

使用printf()函数打印代码调试信息是程序员的常规操作,这里定义了UART5,可以通过重定向print()函数关联到UART5上。再usart.c中的如下位置添加如下这段代码

#include <stdio.h>

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
    HAL_UART_Transmit(&huart5, (uint8_t *)&ch, 1, 0xFFFF);//注意把&huart1改为自己的stm32使用的串口号
 
    return ch;
}

学新通

记得在printf()调用的位置添加#include <stdio.h>

如果编译过程中报错“identifier "FILE" is undefined”,可以如下图设置一下IAR的编译器

学新通

 在Library Configuration中,Library选择full。

至此printf()函数就能正常工作了。

【2】头文件的使用

#include <xxx.h>和#include "xxx.h"的区别

对于#include "xxx.h"编译器会从当前目录找寻xxx.h文件,再去搜寻预定义的缺省路径。

对于#include <xxx.h>编译器会优先从预定义的缺省路径下寻找文件。

关于预定义的缺省路径在IAR中可以在下图位置进行添加。

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgabaia
系列文章
更多 icon
同类精品
更多 icon
继续加载