前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(一)STM32基础——新建基于固件库的工程模板

(一)STM32基础——新建基于固件库的工程模板

作者头像
小点点
发布2022-12-12 14:10:58
4820
发布2022-12-12 14:10:58
举报
文章被收录于专栏:小点点小点点

        现在开始慢慢从51单片机过渡到STM32的学习,因为之前学习过51单片机,所以环境的搭建特别快,一会就搞好了,而且发现STM32的烧录方式比51单片机要方便一点,不需要反复的冷启动,但是发现STM32建立工程模板太麻烦了。首先,分成基于固件库和基于寄存器(后面都会介绍),而且需要建立多个文件夹,在每个文件夹里面,还需要拷贝启动程序和许多的.C 和.H 文件等等,接下来,我就来好好介绍一下如何建立一个工程模板吧!(基于正点原子探索者F4)

新建基于固件库的工程模板

        在建立工程之前,首先要建立一个文件夹,后面所建立的工程都可以放在这个文件夹下面,这里我们建立一个文件夹为 Template。这是工程的根目录文件夹。然后为了方便我们存放工程需要的一些其他文件,这里我们还新建下面 5 个子文件夹(使用快捷键更好,Ctrl+Shift+N):CORE ,FWLIB,OBJ,SYSTEM,USER。至于这些文件夹名字,实际上是可以任意取的, 我们这样取名只是为了方便识别。对于这些文件夹用来存放什么文件,我们后面的步骤会 一一提到。新建好的目录结构如下所示。


        接下来,打开 Keil,点击 Keil 的菜单:Project –>New Uvision Project ,然后将目录定位到刚才建立的文件夹 Template 之下的 USER 子目录,同时,工程取名为 Template 之后点击保存, 我们的工程文件就都保存到 USER 文件夹下面。


     接下来会出现一个选择 Device 的界面,就是选择我们的芯片型号,这里我们定位到 STMicroelectronics 下面的 STM32F407ZG(针对ExplorerSTM32 板子是这个型号)。 这里我们选择 STMicroelectronics --> STM32F4 Series --> STM32F407 --> STM32F407ZG(如果使 用的是其他系列的芯片,选择相应的型号就可以了,特别注意:一定要安装对应的器件 pack 才会显示这些内容哦!!) ,选好型号之后弹出来的那个框框,关掉就好了。


        下面我们要将官方的固件库包里的源码文件复制到我们的工程目录文件夹下面。 打开官方固件库包,定位到我们之前准备好的固件库包的目录: \STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\STM32F4xx_StdPeriph_Driver 下面, 将目录下面的 src,inc 文件夹 copy 到我们刚才建立的 FWLib 文件夹下面。 


        下面我们要将固件库包里面相关的启动文件复制到我们的工程目录 CORE 之下。 打开官方固件库包,定位到目录 \STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templat es\arm 下面,将文件 startup_stm32f40_41xxx.s 复制到 CORE 目录下面。然后定位到目录 \STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Includ,将里面的头文件 core_cm4.h 和 core_cm4_simd.h 同样复制到 CORE 目录下面。现在看看我们的 CORE 文件夹下面的文件, 如下图所示:


        接下来我们要复制工程模板需要的一些其他头文件和源文件到我们工程。首先定位到目录: STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Device\ST\STM32F4xx\Include 将里面 的 2 个头文件 stm32f4xx.h 和 system_stm32f4xx.h 复制到 USER 目录之下。这两个头文件是 STM32F4 工程非常关键的两个头文件。后面我们讲解相关知识的时候会给大家详细讲解。然后 进入目录\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Project\STM32F4xx_StdPeriph_Templates , 将目录下面的 5 个 文 件 main.c , stm32f4xx_conf.h , stm32f4xx_it.c , stm32f4xx_it.h ,system_stm32f4xx.c 复制到 USER 目录下面。如下图所示:


        前面 6 个步骤,我们将需要的固件库相关文件复制到了我们的工程目录下面,下面我们将这些文件加入我们的工程中去。右键点击 Target1,选择 Manage Components。 Project Targets 一栏,我们将 Target 名字修改为 Template,然后在 Groups 一栏删掉一个 Source Group1,建立三个 Groups:USER,CORE,FWLIB。然后点击 OK,可以看到我们的 Target 名字以及 Groups 情况如下图:


        下面我们往 Group 里面添加我们需要的文件。我们按照步骤 7 的方法, 右键点击点击 Tempate,选择选择 Manage Components.然后选择需要添加文件的 Group,这里第一步我们 选择 FWLIB,然后点击右边的 Add Files,定位到我们刚才建立的目录\FWLIB\src 下面,将 里面所有的文件选中(Ctrl+A),然后点击 Add,然后 Close.可以看到 Files 列表下面包含我们添加的文件。这里需要说明一下,对于我们写代码,如果我们只用到了其中的某个外设,我们就可以不用添加没有用到的外设的库文件。例如我只用 GPIO,我可以只用添加 stm32f4xx_gpio.c 而其他的可以不用添加。这里我们全部添加进来是为了后面方便,不用每次添加,当然这样的坏处是工程太大,编译起来速度慢,用户可以自行选择。 

注:这里有个文件 stm32f4xx_fmc.c 比较特殊。这个文件是 STM32F42 和 STM32F43 系列才用到, 所以我们这里要把它删掉(注意是 stm32f4xx_fmc.c 要删掉,不要删掉 stm32f4xx_fsmc.c)。


        用同样的方法,将 Groups 定位到 CORE 和 USER 下面,添加需要的文件。这里我们的 CORE 下面需要添加的文件为 startup_stm32f40_41xxx.s(注意,默认添加的时候文件类 型为.c,也就是添加 startup_stm32f40_41xxx.s 启动文件的时候,你需要选择文件类型为 All files 才能看得到这个文件),USER 目录下面需要添加的文件为 main.c,stm32f4xx_it.c, system_stm32f4xx.c。 这样我们需要添加的文件已经添加到我们的工程中去了,最后点击 OK, 回到工程主界面。操作过程如下图所示: 


        接下来我们要在 MDK 里面设置头文件存放路径。也就是告诉 MDK 到那些目录下面去寻找包含了的头文件。这一步骤非常重要。如果没有设置头文件路径,那么工程会出现报错头文件路径找不到。具体操作如下图所示。

        这里我们需要添加的头文件路径包括:\CORE, \USER\以及\FWLIB\inc。这里大家务必要仔细, 固件库存放的头文件子目录是\FWLIB\inc,不是 FWLIB\src。很多朋友都是这里弄错导致报很多奇怪的错误。添加完成之后如下图所示。


        接下来对于 STM32F40 系列的工程,还需要添加一个全局宏定义标识符。添加方法是点击 魔术棒之后,进入 C/C++选项卡,然后在 Define 输入框连输入: STM32F40_41xxx,USE_STDPERIPH_DRIVER。注意这里是两个标识符 STM32F40_41xxx 和 USE_STDPERIPH_DRIVER,他们之间是用逗号隔开的,请大家注意。 


        接下来我们要编译工程,在编译之前我们首先要选择编译中间文件编译后存放目录。 方法是点击魔术棒,然后选择“Output”选项下面的“Select folder for objects…”, 然后选择目录为我们上面新建的 OBJ 目录。同时将下方的三个选项框都勾上,操作过程如下图所示。


        在编译之前,我们先把 main.c 文件里面的内容替换为如下内容: 

代码语言:javascript
复制
#include "stm32f4xx.h" 
void Delay(__IO uint32_t nCount);
void Delay(__IO uint32_t nCount)
{
 while(nCount--){}
}
int main(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOF, &GPIO_InitStructure);
    while(1){
        GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
        Delay(0x7FFFFF);
        GPIO_ResetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
        Delay(0x7FFFFF);
    }
}

        与此同时,我们要将 USER 分组下面的 stm32f4xx_it.c 文件内容清空。或者删掉其中的 32 行对 main.h 头文件的引入以及 144 行 SysTick_Handler 函数内容,如下图所示。


        这里还有个非常重要的关键点,就是系统时钟的配置,这在我们的系统时钟章节 4.3 会详细讲解,这里我们要修改 System_stm32f4xx.c 文件,把 PLL 第一级分频系数 M 修改为 8, 这样达到主时钟频率为 168MHz。修改方法如下:

        PLL_M 这里我们要修改为 8,这样我们的系统时钟就是 168MHz。详细原因我们后面 4.3 小 节会讲解。 同时,我们要在 stm32f4xx.h 里面修改外部时钟 HSE_VALUE 值为 8MHz,因为我们的外部高速时钟用的晶振为 8M,具体修改方法如下: 


        实际上经过前面的这些步骤,我们的工程模板已经建立完成。但是在我们 ALIENTEK 提供的实验中,每个实验都有一个 SYSTEM 文件夹,下面有 3 个子目录分别为 sys,usart,delay, 存放的是我们每个实验都要使用到的共用代码,该代码是由我们 ALIENTEK 编写,该代码 的原理在我们第五章 SYSTEM 文件夹介绍会有详细的讲解,我们这里只是引入到工程中, 方便后面的实验建立工程。

        首先,找到我们实验A盘,打开任何一个固件库的实验,可以看到下面有一个 SYSTEM 文 件夹(大家一定要注意,打开库函数版本的实验找到 SYSTEM 文件夹,不要用寄存器版本的SYSTEM 文件夹),比如我们打开我们的实验 0 Template 工程模板的工程目录如下:可以看到有一个SYSTEM 文件夹,进入 SYSTEM 文件夹,里面有三个子文件夹分别为 delay,sys,usart,每个子文件夹下面都有相应的.c 文件和.h 文件。我们将 SYSTEM 文件夹和里面的三个子文件夹复制到我们工程根目录中。如下图。我们接下来要将这三个目录下面的源文件加入到我们工程,同时将头文件路径加入到 PATH 中,如下图所示:


        接下来我们将对应的三个目录(sys,usart,delay)加入到 PATH 中去,因为每个目录下面都有相应的.h 头文件,这请参考步骤 12 即可,加入后的截图如下图所示: 


        接下来我们修改主函数所在的文件 main.c 的内容,引入 ALIENTEK 提供的系统文件包里面的一些头文件和调用一些函数来测试,修改后的 main.c 文件内容如下所示:

代码语言:javascript
复制
#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
int main(void)
{
u32 t=0;
uart_init(115200);
delay_init(84);
 while(1){
 printf("t:%d\r\n",t);
delay_ms(500);
t++;
}
}

到此处,基于库函数的工程模板算是建立完成了,相比于51单片机,STM32建立工程模板的难度与复杂度明显上升,所以我觉得,下次写代码时,就可以直接使用这次的工程模板,避免重复操作,建立的过程了解就好尽量把时间花在编写代码与调试过程中。

ST_LINK

首先进入魔术棒,选择debug。

然后点击Settings, 点击Flash Download,添加相应的库。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 新建基于固件库的工程模板
  • ST_LINK
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档