硬件平台:启明欣欣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中可以在下图位置进行添加。