zoukankan      html  css  js  c++  java
  • STM32(二)- 位带操作、启动文件讲解

    一、位带操作

    STM32 中,有两个地方实现了位带,一个是 SRAM 区的最低 1MB 空间,令一个是
    外设区最低 1MB 空间。这两个 1MB 的空间除了可以像正常的 RAM 一样操作外,他们还
    有自己的位带别名区,位带别名区把这 1MB 的空间的每一个位膨胀成一个 32 位的字,当
    访问位带别名区的这些字时,就可以达到访问位带区某个比特位的目的。

    通过一下两张图便于理解:


    要点备注:

    (1)对位带别名区的某一地址(4字节)赋值0或1,位带区的对应位即置0或者1。

    (2)由于stm32要求32位执行时效率高,所以位带区1位对应位带别名区32位。

            8位一个地址,位带区1个位对应位带别名区的4个连续的地址。

    基于要点结合各区的基地址,得到地址换算公式:

     (1)对于片上外设位带区的某个比特,记它所在字节的地址为 A,位序号为 n(0<=n<=7),则个人认为n的取值为0~31
          该比特在别名区的地址为:
                                 AliasAddr    = =     0x42000000    +    ( (A-0x40000000)*8     +    n)     *4 

    (2)对于 SRAM 位带区的某个比特,记它所在字节的地址为 A,位序号为 n(0<=n<=7),则
          该比特在别名区的地址为:
                                AliasAddr       = =    0x22000000    +    ( (A-0x20000000)*8    +     n)     *4
     A:操作位所在的寄存器地址          
    n:位号

    为了统一公式,把“位带地址+位序号”转换成别名区地址统一成一个宏。

    外设外带区的地址为: 0X40000000~0X40100000,大小为 1MB,这 1MB103系列大//小容量型号的单片机中包含了片上外设的全部寄存器,
    这些寄存器的地址为: 0X40000000~0X40029FFF 。即全部寄存器位带区没有全部用完外设区的516MB地址空间,
    而外设别名区0X42000000~0X43FFFFFF就落在使用分保留区域0X40030000~0X5FFFFFFF不会跟片上外设的其他寄存器地址重合 。

    1 // 把“位带地址+位序号”转换成别名地址的宏
    2 #define    BITBAND(addr, bitnum)      ((addr &0xF0000000)+0x02000000+((addr &0x00FFFFFF)<<5)+(bitnum<<2)) 

    对比(1)(2)两个公式,将地址拆分。

    对外设:                                                                       0x4000 0000    +    0x0200 0000   +   屏蔽高2位  *   32    +   位号*  4   

    对SRAM:                                                                    0x2000 0000    +    0x0200 0000   +   屏蔽高2位  *   32    +   位号*   4     

     通过指针的形式操作这些位带别名区地址,最终实现位带区的比特位操作。

    1 1 // 把一个地址转换成一个指针
    2 2 #define      MEM_ADDR(addr)               *((volatile unsigned long *)(addr))
    3 3
    4 4 // 把位带别名区地址转换成指针
    5 5 #define      BIT_ADDR(addr, bitnum)       MEM_ADDR(BITBAND(addr,bitnum))
    1 //n可以去0~15,对应GPIO的16个引脚
    2 
    3 #define   GPIOB_ODR_Addr       (GPIOB_BASE+12) //0x40010C0C
    4 
    5 #define           PBout(n)           BIT_ADDR(GPIOB_ODR_Addr,n)
    6 
    7 PBout(0) = 0;//PB0输出低电平,点亮LED

     二、启动文件讲解

    7

  • 相关阅读:
    高中数学相关的专业术语
    数学-高数2
    python+unittest+xlrd+request搭建API测试框架
    接口自动化,断言方法,深度定位错误
    python+requests+unittest API接口测试
    python+unittest框架整理(一点点学习前辈们的封装思路,一点点成长。。。)
    学习python的第一个小目标:通过requests+xlrd实现简单接口测试,将测试用例维护在表格中,与脚本分开。
    队列 —— 先入先出的数据结构
    卷积神经网络的简单可视化
    HOG 特征提取算法(实践篇)
  • 原文地址:https://www.cnblogs.com/wuguangzong/p/10104482.html
Copyright © 2011-2022 走看看