zoukankan      html  css  js  c++  java
  • 无线路灯项目——STM32L151概述

    STM32L151RCT 256KB 属于Cat.3
    在stm32l1xx.h文件中,有下面一幅图,说明了不同容量的MCU应该用哪个startup.s文件
    这里写图片描述
    有关density和Cat名称的问题,ST官方给出下面的说法:
    Replaced “Low density”, “Medium density”, “Medium+ density” and “High density” categories by Cat.1, Cat.2, Cat.3, Cat.4 and Cat.5 in all document.

    下面是STM32L1系列中Cat.3的系统结构图
    这里写图片描述
    FLITF指的是The Flash memory interface。
    在系统reset后,除了Flash和SRAM的时钟Enable,其他外设时钟都Disable,所以我们在初始化时,要Enable相应外设的时钟,这时要注意这个外设是挂在AHB还是APB总线上。
    STM32F103的GPIO挂在APB2上,而在STM32L151中,GPIO挂在AHB上,当时调试L151时没注意到这点,导致在这上面花了点时间。

    ST在Datasheet中用Non-volatile memory(NVM)代替了原来的Flash,NVM指的是非易失性的存储器,即断电不丢失,在L151中,NVM包括以下3个方面:
    1.Flash,放置程序
    2.EEPROM,放置用户数据
    3.Information,包括bootloader等
    STM32L151有0x0000 0000~0xFFFF FFFF共4GByte线性空间,外设、SRAM、FLASH等各种资源都集中在这4GByte中。

    这里的AHB和APB都是全速,CPU最高32M,总线最高也能达到32M
    APB(Advanced Peripheral Bus)一般是低速总线
    AHB(Advanced High performance Bus)一般是高速总线

    Bit-band
    CM3的存储器系统支持所谓的“位带”(bit-band)操作。通过它,实现了对单一比特的原子操作。位带操作仅适用于一些特殊的存储器区域中。例如下面的图,是将1MByte的SRAM的膨胀成了32MByte,由于要进行bit级操作,所以需要将1bit扩展成32bit(即1word),在位带区中,每个比特都映射到别名地址区的一个字——这是个只有 LSB才有效的字。
    位带区与位带别名区的膨胀关系图
    这里写图片描述

    这里写图片描述

    这里写图片描述

    位带操作的优越性
    1.位带操作对于硬件 I/O密集型的底层程序最有用处了
    2.位带操作还能用来化简跳转的判断。当跳转依据是某个位时,以前必须这样做:
    ● 读取整个寄存器
    ● 掩蔽不需要的位
    ● 比较并跳转
    现在只需:
    从位带别名区读取状态位
    ● 比较并跳转
    3.以前修改一个值需要经过“读-改-写”3条指令,导致这中间留有两个能被中断的空档,这在多任务系统中会引起系统紊乱。通过使用 CM3的位带操作,就可以消灭上述的紊乱。CM3把这个“读-改-写”做成一个硬件级别支持的原子操作,不能被中断。

    请注意:当使用位带功能时,要访问的变量必须用volatile来定义。因为C编译器并不知道同一个比特可以有两个地址。所以就要通过 volatile,使得编译器每次都如实地把新数值写入存储器,而不再会出于优化的考虑,在中途使用寄存器来操作数据的复本,直到最后才把复本写回——这会导致按不同的方式访问同一个位会得到不一致的结果。

    对于STM32L151,ST提供的库函数中,大部分还是没有使用bit-band,在stm32l1xx.h中,有下面的宏定义,能进行bit-band操作的有外设和SRAM两个部分,他们非位带操作的地址是(uint32_t)0x40000000 和 (uint32_t)0x20000000

    #define SRAM_BB_BASE          ((uint32_t)0x22000000) /*!< SRAM base address in the bit-band region */
    #define PERIPH_BB_BASE        ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */

    GPIO
    当GPIO配置为input时,无需考虑是推挽(PP)还是开漏(OD);无需考虑速度,这个速度是描述输出速度;无需考虑输出寄存器的值,因为它输出不了0或1。
    这里写图片描述
    这里写图片描述

    【Reference】
    《Cortex-M3权威指南》
    http://blog.chinaunix.net/uid-26285146-id-3071387.html

  • 相关阅读:
    js的call方法
    js的call方法
    log4j 详细解释
    log4j 详细解释
    log4j 详细解释
    log4j 详细解释
    google proto buf学习
    google proto buf学习
    网页div转换成图片导出——html2canvas
    走向云端:Oracle SQL Developer Web 即将上线!
  • 原文地址:https://www.cnblogs.com/season-peng/p/6713505.html
Copyright © 2011-2022 走看看