15.关于stm32f407xx.h stm32f4xx.h文件的介绍

首先说下我寄存器里面用的是stm32f4xx.h文件,而HAL库里面的是stm32f407xx.h文件,这两个文件
从本质上来说是一样的,都是必须的头文件之一,因此讲一个另一个也应该会了的!!!
最近一直痴迷于HAL库的代码实现,然后情不自禁去翻了一遍stm32f407xx.h 文件,突然发现还蛮有意思
之前用寄存器写时钟配置翻过system_stm32f4xx.c 和 启动文件 ,算是大概有点了解唯独差了这个文件
这次算是补上了
下面正式开始

/**********************************************************************************************/

1.关于开头使用标准c的说明
  extern "C"
 {
  //Insert the coding you want here
 }

  这个操作是关于标准C的强制使用,你可以理解为下面的代码全部按标准C的要求来,就算是使用G++编译器
  那么这段代码执行后也是按标准C来,这个对于可移植性应该特别好,也是为了适应不同的编译器和IDE

/**********************************************************************************************/

2.接下来就是关于中断优先级了
  一个enum 包含了82个可编程的中断优先级,这段是为了NVIC而设计的,所以如果是想实现中断的话
  肯定避免不开NVIC和中断优先级,那么这部分你是逃避不掉的,82个中断优先级,需要记住

/**********************************************************************************************/

3.接下来一堆就是关于每个外设的寄存器了,几乎每个外设一个结构体,里面全是需要操作的寄存器
  但通常我们不直接操作寄存器,而是通过操作另一个结构体然后复制给寄存器实现存储转发,
  感觉这部分没有设么好说的,需要用哪一部分直接去看就OK了,而且这些寄存器,基本上都大同小异
  比如什么SR,CR之类的,我大概认为主要有这两部分组成,首先要控制,需要使用到CR寄存器,
  然后是需要根据当前状态来判断下一步到底怎么做然后需要使用到SR寄存器,反正蛮有意思的

/**********************************************************************************************/

4.关于内存从0到0xffffffff的分配
  直到今天才对STM32内存分配和外设名字的认识有了重新的了解,好吧,其实之前就没有什么了解
  首先是关于内存分配,首先是很大一块内存,4GB(0-0xffffffff),然后肯定要分配一块给
  外设,然后再细分分为APB1 APB2 AHB1等时钟上的外设,然后就是这些基地址加上便宜实现各个外设
  的地址分配,到这一步为止每个外设都还只是地址分配,只有地址,然后通过宏和结构体类型的强制转换
  实现各个外设名字,如下:


  #define PERIPH_BASE           0x40000000U
  #define APB1PERIPH_BASE       PERIPH_BASE
  #define I2C1_BASE             (APB1PERIPH_BASE + 0x5400U)
  #define I2C1                ((I2C_TypeDef *) I2C1_BASE)

  这些地址都是从最开始的地址分配过来的,一步步的从基地址到最后加上偏移量细分到了各个端口和外设
  然后通过结构体类型的强制转换和宏定义实现I2C成功转换为指向I2C寄存器类型的指针,其实本来就是地址
  加偏移然后还是地址,其实也可以简单称为指针,然后通过类型转换,OK,成功指向I2C,我觉得这搞得也
  太巧妙了,如果你是定义一个结构体指针,还需要再定义一个结构体完成初始化,然后才能实现指向,
  那么之前地址偏移就直接完成了初始化的操作,而且还是分配到了该外设原本的地方,通过外面寄存器的变化
  然后传给里面内存的变化,我觉得应该是这样的。
  既然一个搞懂了那么其他就都是这样一个套路,然后这部分差不多就OK了, 牢记地址加偏移

/**********************************************************************************************/

5.最下面就都是一些关于寄存器的操作的宏定义,就是说具体深入到每一个位的操作,比如说想要使能
  某个位,然后可以在里面找到操作,个人觉得没什么意思,因为那些东西只有写它的人才能看懂,
  所以把,有兴趣自己去看!!!!

  感觉这个文件很简单,但是又同样非常重要,行吧,以后再说吧!!

你可能感兴趣的:(stm32随笔)