微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32库文件分析补充

STM32库文件分析补充

时间:11-17 来源:互联网 点击:
1.没有加入stm32f10x_it.c 初始化文件找不到中断向量。

2.没有加入CM3文件夹的的头文件,编译器自动将类型定义链接到MDK的库中,

C:\Program Files\MDK380a\ARM\INC\ST\STM32F10x\stm32f10x_type.h(23): error: #256: invalid redeclaration of type name "s32" (declared at line 312 of "C:\Program Files\MDK380a\ARM\INC\ST\STM32F10x\stm32f10x.h")

这个error是因为在程序中用到了s32这个类型,但是程序中没有包含这个stm32f10x_type.h

这个时候编译器提示你,这个类型是在上面这个路径的文件中定义的,要你包含这个

头文件。

在编译器路径中加入了CM3文件夹路径,这个问题可以得到解决。

原因是 stm32f10x.h文件中定义了这些类型。

#include "stm32f10x.h" 包含下面的两个头文件。它们都位于CM3文件夹中。

#include "core_cm3.h"

#include "system_stm32f10x.h"

在stm32f10x.h文件的8184行,有这样一句

#ifdef USE_STDPERIPH_DRIVER

#include "stm32f10x_conf.h"

#endif

其中这个stm32f10x.conf.h 文件中包含的以下的头文件

#include "stm32f10x_adc.h"

#include "stm32f10x_bkp.h"

#include "stm32f10x_can.h"

#include "stm32f10x_crc.h"

#include "stm32f10x_dac.h"

#include "stm32f10x_dbgmcu.h"

#include "stm32f10x_dma.h"

#include "stm32f10x_exti.h"

#include "stm32f10x_flash.h"

#include "stm32f10x_fsmc.h"

#include "stm32f10x_gpio.h"

#include "stm32f10x_i2c.h"

#include "stm32f10x_iwdg.h"

#include "stm32f10x_pwr.h"

#include "stm32f10x_rcc.h"

#include "stm32f10x_rtc.h"

#include "stm32f10x_sdio.h"

#include "stm32f10x_spi.h"

#include "stm32f10x_tim.h"

#include "stm32f10x_usart.h"

#include "stm32f10x_wwdg.h"

#include "misc.h"

在文件包含路径中加入了CM3文件夹,在C文件中加入stm32f10x.h文件,同时在MDK中

设置USE_STDPERIPH_DRIVER ,这个C文件中的函数就可以调用所有标准库外设。

1.stm32启动文件

STM32启动文件简单分析(STM32F10x.s适用范围)定时器, 型号, 名字在>,

我们所有的例程都采用了一个叫STM32F10x.s的启动文件,

里面定义了STM32的堆栈大小以及各种中断的名字及入口函数名称,还有启动相关的汇编代码。

STM32F10x.s是MDK提供的启动代码,从其里面的内容看来,它只定义了3个串口,4个定时器。

实际上STM32的系列产品有5个串口的型号,也只有有2个串口的型号,定时器也是,做多的有8个定时器。

比如,如果你用的STM32F103ZET6,而启动文件用的是STM32F10x.s的话,

你可以正常使用串口1~3的中断,而串口4和5的中断,则无法使用。

又比如,你TIM1~4的中断可以正常使用,而5~8的,则无法使用。

所以STM32F10x.s并不能适用所有的STM32型号,这样,我们就得对不同型号的STM32,选择不同的启动文件

其中,ld.s适用于小容量 产品;md.s适用于中等容量产品;hd适用于大容量产品;

这里的容量是指FLASH的大小.判断方法如下:

小容量:FLASH≤32K

中容量:64K≤FLASH≤128K

大容量:256K≤FLASH

cl:互联型产品,stm32f105/107系列

vl:超值型产品,stm32f100系列

xl:超高密度产品,stm32f101/103系列 超大容量 512-1024K

ld:低密度产品,FLASH小于64K

md:中等密度产品,FLASH=64 or 128

hd:高密度产品,FLASH大于128-512

2、 typedef与结构结合使用

typedef struct tagMyStruct

{

int iNum;

long lLength;

} MyStruct;

这语句实际上完成两个操作:

1) 定义一个新的结构类型

 struct tagMyStruct

 {

 int iNum;

 long lLength;

 };

 分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,

struct 关键字和tagMyStruct一起,构成了这个结构类型,不论是否有typedef,

这个结构都存在。

 我们可以用struct tagMyStruct varName来定义变量,但要注意,

使用tagMyStruct varName来定义变量是不对的,因为struct 和tagMyStruct

合在一起才能表示一个结构类型。

 2) typedef为这个新的结构起了一个名字,叫MyStruct。

 typedef struct tagMyStruct MyStruct;

 因此,MyStruct实际上相当于struct tagMyStruct,

我们可以使用MyStruct varName来定义变量。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top