STM32第一期知识点总结(寻址范围,存储器映射 ,寄存器映射 ,断言,volatile )

文章目录

  • 前言
  • 一、基础知识预备
  • 1、STM32的寻址范围
  • 补充:
  • 2,存储器映射
  • 补充:
  • 3,寄存器映射
  • 二、断言
  • 三、volatile

  • 前言

    学习STM32的一些笔记,方便日后查看,同时希望给同样初学32的朋友带来便利,此笔记主要面向小白,笔者只是拾人牙慧的小屁孩,内容大量来自网络,如有错误,还望指正。 本期是纯理论讲解,想看具体操作的朋友,推荐电子宁采臣的文章,笔者也是在看他的文章学习。


    一、基础知识预备

    1、STM32的寻址范围

    1,32位单片机可以有32根地址线(每根地址线有两种状态:导通或不导通)

    2,单片机内存地址访问的存储单元是按字节编址的(而不是bit)

    so STM32寻址大小:2^32=4G,寻址范围:0X0000 0000~0XFFFF FFFF

    补充:

    1byte(字节)=8bit(位),1kb=1024byte,1Mb=1024kb,1Gb=1024Mb

    有没有小伙伴好奇1kb=1024byte中,1024是怎么来的呢(笔者当时是十分好奇的),这是因为计算机内部存储和传输数据的基本单位是二进制,而 1K 字节的十进制表示是1000B,但是由于计算机内部采用的是2的整数次幂来计算内存大小,所以 1K = 2^10 = 1024B

    2,存储器映射

    存储器指可以存储数据的设备,本身没有地址信息,对存储器分配地址的过程称为存储器映射,关于32存储器功能划分,可查看数据手册。

    补充:

    内存计算:如有一个芯片19根地址线,16根数据线(每根地址线可访问16位,即2bite),其内存为2^19*2 (32单片机一个地址可访问一个字节)

    3,寄存器映射

    1,寄存器基础知识:寄存器是单片机内部一种特殊的内存,可以实现对单片机各个功能的控制,即单片机内部的控制机构。

    2,寄存器是特殊的存储器,给寄存器地址命名的过程,就叫做寄存器映射

    偏移地址:0X04,即其地址位GPIOA的地址加0X04

    二、断言

    在函数中加入断言,使其满足某种情况时,进入断言,当进入断言后,函数停止运行,并输出错误信息。HAL库的大部分函数都有断言机制,同时如果学会断言,就可以加在自己的函数中用于调试。

    下面来看HAL库中的断言

       void HAL_GPIO_WritePin
       (GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, 	GPIO_PinStatePinState)
       {
      /* Check the parameters */
    	 assert_param(IS_GPIO_PIN(GPIO_Pin));
      	 assert_param(IS_GPIO_PIN_ACTION(PinState));
    	
    	  if(PinState != GPIO_PIN_RESET)
    	  {
    	    GPIOx->BSRR = GPIO_Pin;
    	  }
    	  else
    	  {
    	    GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U;
    	  }
    	}
    

    点击其进入assert_param

    	#ifdef  USE_FULL_ASSERT
    	  #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
    	  void assert_failed(uint8_t* file, uint32_t line);
    	#else
    	  #define assert_param(expr) ((void)0U)
    	#endif /* USE_FULL_ASSERT */
    

    exprFalse时进入assert_failed函数,用户可找到此函数,在其中加入自己的代码

    三、volatile

    volatile关键字指出变量是随时可能发生变化的,防止编译器优化

    比如:

    int a=0;
    if(a!=0)
    	......
    

    如果直接这样写,编译器便不会每次重新从a中读取数值,而是根据上次读取到的数值判断,在a是某个寄存器变量或端口数据时,极易出错,而volatile就避免了这种情况。

    这是HAL库里volatile的一些别名

    	#ifdef __cplusplus
    	  #define   __I     volatile             /*!< Defines 'read only' permissions */
    	#else
    	  #define   __I     volatile const       /*!< Defines 'read only' permissions */
    	#endif
    	#define     __O     volatile             /*!< Defines 'write only' permissions */
    	#define     __IO    volatile             /*!< Defines 'read / write' permissions */
    	
    	/* following defines should be used for structure members */
    	#define     __IM     volatile const      /*! Defines 'read only' structure member permissions */
    	#define     __OM     volatile            /*! Defines 'write only' structure member permissions */
    	#define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */
    

    作者:ELEC ENT

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32第一期知识点总结(寻址范围,存储器映射 ,寄存器映射 ,断言,volatile )

    发表回复