STM32库中重要文件说明详解

1.stm32f10x.h:定义系统寄存器的地址以及使用结构体封装。定义声明以及包装内存操作。新版的固件库V3.0以上main等源文件中不再直接包含stm32f10x_conf.h,而是stm32f10x.h。

stm32f10x.h中定义了启动设置,以及所有寄存器宏定义,此文件中需要注意的有:

1、device选择;2、外部时钟频率选择;3、外设宏定义USE_STDPERIPH_DRIVER;

  stm32f10x_conf.h中包含了所有外设的头文件,因此任意源文件只要包含了stm32f10x.h,就可以在源文件调用任意外设的函数,而不需要的外设部分,可以在stm32f10x_conf.h中注释掉,项目编译时就不会再编译以及去掉的外设。

2.stm32f10x_it.c和stm32f10x_it.h:所有中断服务函数

   中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中断服务程序 (ISR),类似于__interrupt、#program interrupt等。当一个函数被定义为ISR的时候,编译器会自动为该函数增加中断服务程序所需要的中断现场入栈和出栈代码。
  中断服务程序需要满足如下要求:
  (1)不能返回值;
  (2)不能向ISR传递参数;
  (3) ISR应该尽可能的短小精悍;
  (4) printf(char * lpFormatString,…)函数会带来重入和性能问题,不能在ISR中采用。

  参阅网上资料和个人的一些理解

  a.为什么不能有返回值?

    中断服务函数的调用是硬件级别的,当中断产生,pc指针强制跳转到对应的中断服务函数入口,进入中断具有随机性,并不是某段代码对其进行调用,那么如果有返回值它的返回值返回给谁?显然这个返回值毫无意义,如果有返回值,它必定需要进行压栈操作,这样一来何时出栈怎么出栈将变得无法解决。

  b.不能向ISR传递参数?

    同理,也是由于这样会破坏栈的原因,因为函数传递参数必定会要求压栈出栈操作,由于进入中断服务函数的随机行,谁给它传递参数都成问题

  c.ISR应尽可能的短小精悍?

    如果某个中断频繁产生,而它对应的ISR相当的耗时,那么对中断的响应就会无限的延迟,会丢掉很多的中断请求

  d.printf(char * lpFormatString,…)函数会带来重入和性能问题,不能在ISR中采用。

    这就涉及到一个中断嵌套问题,由于printf之类的glibc函数采用的是缓冲机制,这个缓冲区是共享的,相当于一个全局变量,第一层中断来时,它向缓冲里面写入一些部分内容,恰好这时来了个优先级更高的中断,它同样调用了printf,也向缓冲里面写入一些内容,这样缓冲区的内容就错乱了。

3.stm32f10x_conf.h:所有外设头文件

4.system_stm32f10x.c:设备外设访问层,主要配置时钟频率(设置系统以及总线时钟)

   system_stm32f10x.h:配置时钟频率相应的头文件

5.下面是一些启动文件

6.stm32f10x_flash.icf:编译器链接库文件

猜你喜欢

转载自blog.csdn.net/qq_36226810/article/details/83007405
今日推荐