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来定义变量。