目录
7.复制正点原子的SYSTEM文件夹到工程,替换启动文件,然后编写代码
学习目的:属性STM32的工程结构及其各目录的意义。
-
寄存器版本新建工程
1.新建工程目录,复制需要的文件到工程目录下
1.1打开mdk软件,然后Project ->New uVision Project
1.2.在本地新建一个目录,作为工程目录,接着再目录中新建一个子文件夹USER
1.3.新建工程保存到USER目录下:
1.4.选择芯片类型,这里以STM32F429IGTx为例:
下一步点击取消:
这样一个简单的工程就新建完成,可以在本地看到USER目录下面多了一些文件:
OK,现在这个工程是一个空的,如果需要开发stm32f429必须添加一些必要的文件。
1.5.添加工程所需的文件,如下所示
文件/文件夹名称 | 文件描述 | 在stm32CubeF4包中路径 |
startup_stm32f429xx.s | 启动文件 | \Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm |
cmsis_armcc.h | 内核头文件 | \Drivers\CMSIS\Include |
core_cm4.h | ||
core_cmFunc.h | ||
core_cmInstr.h | ||
core_cmSimd.h | ||
stm32f4xx.h | 顶层头文件 | \Drivers\CMSIS\Device\ST\STM32F4xx\Include |
stm32f429xx.h | ||
system_stm32f4xx.h |
1.6.把启动文件放置于USER目录下
新建一个CORE(内核含义)文件夹,然后把\Drivers\CMSIS\Include的五个有关于内核头文件和顶层头文件放置于USER下:
复制\Drivers\CMSIS\Device\ST\STM32F4xx\Include的三个顶层头文件,到test/CORE工程目录下:
复制完,工程目录下的CORE就有了8个头文件了,如下:
2.把工程需要的文件添加到工程
2.1.管理工程
2.2.新建三个组,用于引入我们在第一步添加的一些头文件和启动文件:
把启动文件添加到USER下:
3.在MDK中设置头文件存放路径,以便工程能引用这些文件
添加头文件路径:
注意:MKD查找头文件的规则,如果我们选择是CORE,那么MDK只会在CORE目录下查找头文件,不会到下以及目录下查找,如果在CORE的子目录还有文件的话,同样需要把子目录的路径也添加进去。
4.配置MDK:全局宏定义
重要的预编译全局宏定义标识符: STM32F429xx,入戏所示
5.编写用户函数
5.1.新建一个.c文件,然后编辑一个main入口函数,保存:
5.2.添加这个.c文件添加到分组USER中:
6.编译工程,排错
6.1.编译
报错:.\Objects\test.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f429xx.o).
到startup_stm32f429xx.o这个档案去看一看:
报错的原因是因为我们没有SystemInit这个函数可以调用,如果是使用HAL库的话,直接可以调用一个系统的初始化函数,寄存器只能自己搞了。那我们先把系统初始化的代码先注释掉,不让它报错先:
6.2.再次编译,程序直接从mian函数开始执行,这时编译就没有错误了
6.3.此时一个模板就完成了,如果使用STM32F4的寄存器进行代码的编辑的话,必须引入的就是我们刚刚添加的头文件啦。
如下图:
注意:虽然此时工程编译时没有任何问题的,但是我们没有任何系统的一些初始化的文件,比如系统时钟配置等,所以还是暂时不能使用该工程模板编写程序的。
7.复制正点原子的SYSTEM文件夹到工程,替换启动文件,然后编写代码:
7.1.复制寄存器版本的SYSTEM文件夹到工程目录下,如下所示
7.2.在工程中新建一个组,添加.c文件和.h文件:
添加头文件:
编译,通过:
替换启动文件:复制正点原子模板的文件
修改完,编译通过。
7.3.在mian入口函数编写代码:
代码如下:
#include "sys.h"
#include "usart.h"
#include "delay.h"
int main(void)
{
u8 t=0;
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
delay_init(180); //初始化延时函数
uart_init(90,115200); //串口初始化为115200
while(1)
{
printf("t:%d\r\n",t);
delay_ms(500);
t++;
}
}
系统时钟初始化函数:
编译代码,下载到开发板,串口500ms的周期增加t的值。
-
新建基于 HAL 库工程模板
1. 复制所需要文件到工程包中。
文件/文件夹名称 | 文件描述 | 在stm32CubeF4包中路径 | 工程模板中的文件夹 | |
Inc、Src文件夹 | 外设库文件 | \Drivers\STM32F4xx_HAL_Driver | HALLIB | |
startup_stm32f429xx.s | 启动文件 | \Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm | CORE | |
cmsis_armcc.h | 内核头文件 | \Drivers\CMSIS\Include | CORE | |
core_cm4.h | ||||
core_cmFunc.h | ||||
core_cmInstr.h | ||||
core_cmSimd.h | ||||
stm32f4xx.h | 顶层头文件 | \Drivers\CMSIS\Device\ST\STM32F4xx\Include | USER | |
stm32f429xx.h | ||||
system_stm32f4xx.h | ||||
main.h | 头文件 | \Projects\STM32F429I-Discovery\Templates\Inc | ||
stm32f4xx_hal_conf.h | ||||
stm32f4xx_it.h | ||||
main.c | 源文件 | \Projects\STM32F429I-Discovery\Templates\Src | ||
stm32f4xx_hal_msp.c | ||||
stm32f4xx_it.c | ||||
system_stm32f4xx.c |
在本地新建工程模板的文件夹,并复制到本地工程目录, 如下图所示:
复制上面所示的所有文件到指定的文件夹下:包括16个文件和2个文件夹
2.把工程文件引入到工程:
1.1打开mdk软件,然后Project ->New uVision Project
保存,选择芯片类型:
把我们在本地工程文件引入到工程,和上面一样:
删除在HALLIB下的三个.c文件
同时在工程中要删掉下面三个文件 | |
stm32f4xx_hal_dsi.c | mipi接口相关函数 |
stm32f4xx_hal_iptim.c | 低功耗定时器相关函数 |
stm32f4xx_hal_msp_template.c | 空函数 |
3.设置头文件的包含路径
设置一些工程的晶振和输入路径以及输入中间文件保存路径和生成hex文件等
在本地test目录下新建一个obj文件夹,然后产生的中间文件都输出到这个文件夹,以便后期工程管理:
4.MDK设置(全局宏定义标识符)
重要的预编译全局宏定义标识符: USE_HAL_DRIVER,STM32F429xx 中间要用逗号“,”隔开。
意义:这个标识符是可以被整个工程所见的。
5.编写用户程序
5.1.删除main.c文件里面的所有文件,然后写一个main入口函数,编译通过
此时可以在main.c中添加stm32f4xx.h的头文件,就可以调用hal库的代码了。此时还没有系统初始化的一些时钟,所以引入正点原子的system文件夹,去调用系统初始化函数
6.添加正点原子的SYSTEM文件夹
6.1添加这个文件夹,然后在工程新建一个组,添加.c文件,在头文件路径添加.h文件。
添加.c文件:
添加.h文件:
然后编译,通过编译。
7.编写函数
复制下面的代码到mian.函数里面:
#include "sys.h"
#include "delay.h"
#include "usart.h"
void Delay(__IO uint32_t nCount);
void Delay(__IO uint32_t nCount)
{
while(nCount--){}
}
int main(void)
{
GPIO_InitTypeDef GPIO_Initure;
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
__HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟
GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1; //PB1,0
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOB,&GPIO_Initure);
while(1)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); //PB1置1
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); //PB0置1
Delay(0x7FFFFF);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); //PB1置0
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET); //PB0置0
Delay(0x7FFFFF);
}
}
编译通过。
8.其他配置
8.1修改外部晶振为25M
8.2.修改中断优先级分组为2
再次编译后,下载到开发板中。程序运行,PB0和PB1交替输出高低电平!
工程模板下载:
寄存器模板:https://download.csdn.net/download/qq_36243942/10734027
hal库模板:https://download.csdn.net/download/qq_36243942/10734132