STM32

STM32是STMicroelectronics(意法半导体)推出的一系列基于ARM Cortex-M内核的32位微控制器(MCU)产品。这些微控制器提供了广泛的产品系列,覆盖了多种不同的性能和功能需求,适用于各种应用领域,包括工业控制、汽车电子、消费类电子、医疗设备等。

STM32系列微控制器以其高性能、低功耗、丰富的外设接口和灵活的开发工具而闻名。它们通常具有丰富的存储器、多种通信接口(如UART、SPI、I2C、CAN等)、模拟数字转换器(ADC)、定时器、PWM输出等功能,以满足不同应用场景下的需求。

STM32微控制器通常使用标准的ARM Cortex-M内核,包括Cortex-M0、M0+、M3、M4和M7等,这些内核具有不同的性能和功耗特性,可根据具体应用的需求进行选择。此外,STM32系列还提供了多种封装和引脚配置,以满足不同尺寸和集成度的要求。

STMicroelectronics为STM32系列提供了丰富的开发工具和支持资源,包括基于ARM开发环境的集成开发环境(IDE)、调试器、评估板和参考设计等。这些工具和资源有助于开发人员快速开发和部署他们的应用,并提供了全面的技术支持和文档资料,帮助用户充分发挥STM32微控制器的性能和功能优势。

一、SD卡概述

1、定义

SD卡(安全数码卡),是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(外语缩写PDA)和多媒体播放器等。

2、容量等级

1.png

3、SD卡框图

2.png

引脚说明:

3.jpg

4、SD卡与TF卡的区别

TF卡又名micro SD卡,个头是比SD卡的1/4还小,可以通过“TF转SD卡套”转换成SD卡。

二、 SD卡内部结构

(摘自SanDisk Secure Digital Card Product Manual Version 1.9)

1、 SD卡内部结构简图

4.png

由SD卡控制器和存储阵列组成,SD卡与外界的通讯接口是SD Bus或者SPI Bus。

2、 存储阵列结构图

5.png

Block:      

读写时的单元(数据传输单元),它的单位是“字节”。

Sector:     

如果CSD寄存器ERASE_BLK_EN = 0时,Sector是最小的擦除单元,它的单位是“块”。Sector的值等于CSD寄存器中的SECTOR_SIZE的值+1。

WP Group:   

最小的写保护单元,它的单位是“扇区”。

3、Buffer

6.png

SD Card的Buffer最大容量定义在CSD寄存器的READ_BL_LEN和WRITE_BL_LEN。它们的值是一样的,而且有可能超过512字节,尽管这样Block还是要设置成512字节,因为512字节是数据边界(这句话不是太理解)。也就是SD卡上有数据传输缓冲器Buffer,不同的产品可能不一样,但是在使用时要将Buffer设置成512字节。

参考资料:  

The card buffer size is described as maximum block length in the Card Specif ic Data (CSD) register for memory cards (for cards compliant with the Physical Layer Specification, READ_BL_LEN and WRITE_BL_LEN shall be the same) and in the Card Information Structure (CIS) for SDIO cards. Physical Layer Specification re-defines that maximum block length is only used to calculate capacity of memory card. Even though it indi cates larger than 512 bytes, block length shall be set to 512 byte for data transfer. This is because 512 bytes block l ength is required to keep compatibility with 512 bytes data boundary.

(摘自《Simplified_SD_Host_Controller_Spec.pdf》)

4、“存储阵列Block”--最小的存储单元

资料上的Block通通指的是数据传输时的最小单元,定义这个数值是为了数据传输、CRC校验等。

存储阵列通常采用NandFlash的结构,显然不能按字节存取,而这里讨论的“存储阵列Block”就是指这个概念。可惜的是目前,我还没有找到资料讨论这个问题,所以这一章节是笔者自己的推测。

据我推测存储阵列Block应该是512Byes,因为众多的数据都围绕着512Bytes在转。比如说最小的擦除单元是512Byes,最小的读写单位应该被设置成512Bytes,那么有理由推测是这个数值。

5、SD卡特殊功能寄存器

  • CID:  宽度128位,卡标识号

  • RCA:  宽度16位,卡相对地址,在初始化的时候确定

  • CSD:  宽度128位,卡描述数据:卡操作条件的信息

  • SCR:  宽度64位,SD卡配置寄存器:SD卡特定信息数据

  • OCR:  宽度32位,操作条件寄存

三、SDIO接口

7.png

四、SD卡协议之数据读、写、擦除

1、SD卡写数据块 

执行写数据块命令(CMD24-27) 时,主机把一个或多个数据块从主机传送到卡中,同时在每个数据块的末尾传送一个CRC码。主机传送数据,SD卡接收数据并将数据保存在Buffer中,累计接收数据达到Block长度的时候,SD卡把接下来的数据当做CRC校验码,并且开始数据校验。如果CRC校验错误,卡通过SDIO_D 线指示错误,传送的数据被丢弃而不被写入,所有后续(在多块写模式下)传送的数据块将被忽略。

如果主机传送部分数据而累计的数据长度未与数据块对齐,当不允许块错位( 未设置CSD的参数WRITE_BLK_MISALIGN),卡将在第一个错位的块之前检测到块错位错误( 设置状态寄存器中的ADDRESS_ERROR 错误位) 。当主机试图写一个写保护区域时,写操作也会被中止,此时卡会设置WP_VIOLATION位。 

数据块Block的最大长度定义在CSD中的WRITE_BL_LEN,但是在数据传输时应该用CMD16指令将其设置为512Byets,不去在意WRITE_BL_LEN是1024或者2048Bytes。

另外需要注意的是,Block的长度设置还要参考CSD寄存器的WRITE_BL_PARTIAL。当WRITE_BL_PARTIAL为0时,那么么办法Block只能设置为512Bytes;如果WRITE_BL_PARTIAL=1,那么允许将Block设置成更小的块,比如说一个字节。协议是这样规定的,但是据我分析如果这样的话SD卡的制作会非常复杂(写入的单位可以是字节),价格也会很高。笔者测试了自己的SD卡,WRITE_BL_PARTIAL 等于0,也就是不支持“块部分写”功能。 

2、SD卡读数据块

在读数据块模式下,数据传输的基本单元是数据块Block。为保证数据传输的正确,传输一个数据块Blcok后都有一个CRC校验码。笔者认为主机在累计接收到Block长度数据后,软件可以把接下来的数据当做CRC校验码,并且进行校验。

Block的最大值在CSD中(READ_BL_LEN) 给出了定义,但是在数据传输时应该用CMD16指令将其设置为512Byets,不去在意READ_BL_LEN是1024或者2048Bytes。

如果CSD寄存器中的READ_BL_PARTIAL等于1,可以传送的较小数据块,较小数据块是指开始和结束地址完全包含在一个物理块中。事实上,协议规定READ_BL_PARTIAL永远等于1,也就说在任何SD卡上都允许“读部分块”,读的块的最小字节是1Bytes。使用这种功能,可以通过CMD16命令设置更小的Block(比如说等于128)。读取的这128字节必须在512Bytes边界内,不能跨越边界(其实因为存储阵列是以512Bytes为单位的,读取“部分块”只能在一个块内,不允许跨块读)。

3、擦除SD卡

CSD寄存器ERASE_BLK_EN决定了SD卡的最小擦除单位。

当ERASE_BLK_EN等于0的时候,主机擦除的最小单位是扇区。比如一个Sector包含32个Block,擦除时的起始地址是5,而结束地址是40,那么实际擦除的块是从0到63。

8.png

当ERASE_BLK_EN等于1的时候,主机擦除的最小单位是512 Byetes。比如擦除时的起始地址是5,而结束地址是40,那么实际擦除的块就是从5到40。

9.png

五、SD卡物理层协议

SD卡的协议相对于SPI、I2C等协议的存储器来说相对复杂,包含SD卡物理层(机械封装、管脚、芯片结构、命令集等)、SD卡接口(SDIO)、SD主机控制器,甚至是软件设计的流程,都进行了详细的规定。

1、接口

① SDIO接口

参考《Simplified_SDIO_Card_Spec.pdf》

10.png

<1> CLK 时钟同步线

<2> CMD 命令信号线,主机发出的命令以及从机对命令的响应都是通过这条线进行传输

<3> DAT[3:0] 表示4条数据线,主机和从机的数据都是从这四条数据线上传输

② SPI接口

11.png

2、命令格式

12.png

3、响应格式

以R1为例

13.png

4、SD卡的工作状态

14.jpg

 

5、SD卡的两种状态信息

① Card Status

执行命令过程中的状态信息,比如地址不对齐错误、块长度错误、卡锁、ECC校验错误等等

blog.csdn.net/g_salamander

② SD Status

SD卡的专有特征,编程中不经常涉及。这个状态值有512位,不是通过命令线传送给主机,而是通过数据线。

六、STM32与SD卡相配的外设--SDIO适配器

 1、SDIO adapter 结构图

15.png

2、命令状态机(CPSM)

当发送命令和接收响应时,启动CPSM状态机。

16.png

3、数据通道状态机

当传输数据时,启动数据通道状态机。

17.png

4、FIFO

数据FIFO(先进先出)子单元是一个具有发送和接收单元的数据缓冲区。

FIFO包含一个每字32位宽、共32个字的数据缓冲区,和发送与接收电路。因为数据FIFO工作在AHB 时钟区域(HCLK/2),所有与SDIO时钟区域(SDIOCLK)连接的信号都进行了重新同步。依据TXACT和RXACT标志,可以关闭FIFO、使能发送或使能接收。TXACT和RXACT 由数据通道子单元设置而且是互斥的:

─ 当 TXACT 有效时,发送 FIFO 代表发送电路和数据缓冲区

─ 当 RXACT 有效时,接收 FIFO 代表接收电路和数据缓冲区

5、SDIO的特殊功能寄存器

  • SDIO电源控制寄存器(SDIO_POWER)

  • SDIO时钟控制寄存器(SDIO_CLKCR) : 时钟选择、分频

  • SDIO参数寄存器(SDIO_ARG)

  • SDIO命令寄存器(SDIO_CMD):控制发送命令

  • SDIO命令响应寄存器(SDIO_RESPCMD):包含响应命令中的命令索引

  • SDIO响应1..4寄存器(SDIO_RESPx):包含响应命令中的卡状态信息

  • SDIO数据定时器寄存器(SDIO_DTIMER)

  • SDIO数据长度寄存器(SDIO_DLEN):读或者写的长度,通常是是512的倍数

  • SDIO数据控制寄存器(SDIO_DCTRL):控制数据的读写方向、使能传输等信息

  • SDIO数据计数器寄存器(SDIO_DCOUNT):当DPSM状态机从Idle state切换到Wait_R或者Wait_S状态时,SDIO_LEN的数值加载到该寄存器中

  • SDIO状态寄存器(SDIO_STA)

  • SDIO清除中断寄存器(SDIO_ICR)

  • SDIO中断屏蔽寄存器(SDIO_MASK)

  • SDIO FIFO计数器寄存器(SDIO_FIFOCNT):当SDIO_DCTRL中的DTEN使能,并且DPSM处于Idle state时,SDIO_LEN/4的数值加载到该寄存器中

  • SDIO数据FIFO寄存器(SDIO_FIFO):读写数据缓冲FIFO

七、SD卡编程

SD卡的编程在STM32官方固件库中就有例程,而且野火开发板对该例程进行了中文注释,不必再把源码贴入。这里着重讲一下SD卡编程流程,主要包含SD卡初始化、SD卡读、SD卡写、SD卡擦除。

1、SD卡编程的内容

SD卡主要就是用来存储数据的,所以核心就是读写。为了实现这个目标,必须实现响应的驱动。

配置过程中,不仅要设置好SD控制器,还需要将SD卡设置到合适的状态。在读取状态的时候,不仅涉及到SD控制器的状态,还涉及到SD卡的状态。

2、SD卡初始化

① STM32外设SDIO初始化

端口配置、端口时钟、SDIO时钟、DMA2时钟使能

SDIO寄存器复位

设置时钟SDIO_CK为400KHz以下,设置数据线宽度,开启时钟、开启SDIO电源

② SD卡上电初始化

18.png

上电初始化流程如上图所示,笔者认为官方库提供的例程没有完全按照这个流程图的指示去做。事实上,官方库的程序只做了如上图红色方框内的流程,之外的没涉及。

CMD0命令复位所有的卡。

SD协议规定:在初始化的时候,使用ACMD41之前,必须先使用CMD8命令。而且ACMD41命令属于应用命令,在使用之前需要先发送命令CMD55。

CMD8命令是为了核查电源是否匹配。ACMD41命令不断询问SD卡是否支持主机提供的电压,并且询问SD卡是否上电完成进入准备状态。ACMD41命令还能询问SD卡的类型(SDSC、SDHC)。

③卡进一步核查、获取卡信息

发送命令CMD2,以获取CID信息。

发送命令CMD3,以获取RCA相对地址,可以通过多次发送CMD3获取不同的RCA值,但是只有最后一次的才是有效的RCA地址。

发送命令CMD9,以获取CSD寄存器。

④ 设置SDIO工作在数据传输模式

设置SDIO的时钟为24MHz、数据线宽度为4位。

通过SD_GetCardInfo函数将之前得到CID、CSD处理成卡的信息。

通过CMD7命令选择匹配地址的卡,而取消选择其他的卡。

至此,初始化完成。

3、读SD卡的一个块

  • 数据控制寄存器(SDIO_DCTRL)清零

  • 发送命令CMD16,设置SD卡的Block大小

  • 调用函数SDIO_DataConfig设置SDIO数据传输方式

  • 发送命令CMD17,读单个块

  • SDIO数据传输结束中断使能

  • SDIO的DMA传输功能使能

  • DMA设置,并使能

4、写SD卡的一个块 

  • 数据控制寄存器(SDIO_DCTRL)清零

  • 发送命令CMD16,设置SD卡的Block大小

  • 发送命令CMD24,写单个块

  • 调用函数SDIO_DataConfig设置SDIO数据传输方式

  • SDIO数据传输结束中断使能

  • DMA设置,并使能

  • 使能SDIO的DMA传输功能 

八、SD卡疑惑

1、SD卡擦除后,其中的内容是0,还是1 ? 

The data at the card after an erase operation is either '0' or '1', depends on the card vendor.The SCR register bit DATA_STAT_AFTER_ERASE (bit 55) defines whether it is '0' or '1'.(摘自《SD Specifications_Part_1_Physical_Layer_Specification_Ver3.00_Final_090416.pdf》)

也就是说这是芯片厂商生产工艺决定的,可以通过SCR寄存器的 DATA_STAT_AFTER_ERASE位得知。

2、在SDIO_DCTRL中设置传输Block的要求

Block大小决定了主机在发送数据时,发送到什么程度时开始发送CRC校验码;而在接收数据时,在接收到什么程度时开始把SD卡的数据作为CRC校验码并进行校验。Block还可能影响着其他的时序。在STM32的SDIO寄存器组中,SDIO_DCTRL中的位段DBLOCKSIZE决定主机Block大小。

在摘自《Simplified_SD_Host_Controller_Spec.pdf》的引文中,提到这样的配置要求:主机的Block一定要与SD卡设置的Block一样大小,这显然是必要的。我们经常设置SD卡的Block大小是512Bytes,所以设置DBLOCKSIZE为9(2^9 = 512)。

3、STM32固件库“stm32_eval_sdio_sd.c version v4.5.0”偶遇BUG

参考网页:http://www.cprogramdevelop.com/3742318/

4、SD卡写Block是怎样进行的?

写SD卡的单位是Block(512Bytes),再写之前要先整块擦除,然后才能写。

在多块写操作中,可以在发送多块写命令CMD25之前,有选择性的先发送命令ACMD23设置预擦除。怎样理解呢?

既然是有选择性的,也可以不发送ACMD23命令。在多块写的过程中,由于SD卡事先不知道你要写入几个块(CMD25命令只告诉SD卡要写入的起始地址),所以写入的过程是:根据需要判断要写一个块时,先擦除然后再写,再判断是否要写入下一个块,如果是就再擦除再写。

倘若发送ACMD23命令就不一样了,ADM23命令会在写命令CMD25生效之前,告诉SD卡准备写入的块数N。这样当CMD25命令生效的时候,SD卡会一次性先将这N个块都擦除,然后再一个块一个块写。由于擦除操作比较集中,所以整个多块写操作更节省时间。

九、SD卡参数测试

使用野火开发板配套例程做测试,笔者测试用的SD卡是金士顿的2G内存块,打印SD卡的参数信息如下:

Card Type is :1
ManufacturerID is :2

Card device size is :3795
Card Block Size is :1024
Card device size multiplier is :7
Card Capacity is :1990197248

the maximum read date block length is :1024
partial blocks for write allowed is :0
the maximum write date block length is :1024
erase single block enable is :1
erase sector size is :127
write protect group size is :0
RCA is :4660

Card Type:1         SDSC卡版本2.0

Card device size:  C_SIZE(CSD),为3795

Card Block Size:  max read data block length(READ_BL_LEN(CSD)) ,为1024 Bytes

Card device size multiplier is:  C_SIZE_MULT(CSD),为7

Card Capacity:  1990197248 Bytes

计算方法(摘自《Simplified_Physical_Layer_Spec.pdf》):

memory capacity = BLOCKNR * BLOCK_LEN 
  BLOCKNR = (C_SIZE+1) * MULT  (C_SIZE <= 4096)
  MULT = 2^(C_SIZE_MULT+2)        (C_SIZE_MULT < 8)
  BLOCK_LEN = 2^READ_BL_LEN,    (READ_BL_LEN < 12)

注意:SDSC最大为2GB。

the maximum read date block length:READ_BL_LEN(CSD) ,为1024 Bytes

partial blocks for write allowed:WRITE_BL_PARTIAL(CSD),为不支持

the maximum write date block length:WRITE_BL_LEN(CSD) ,为1024 Bytes

erase single block enable:ERASE_BLK_EN(CSD),为1,支持单块擦除

erase sector size:SECTOR_SIZE(CSD),实际扇区擦除的block数为(SECTOR_SIZE+1),为128 Blocks

write protect group size:WP_GRP_SIZE(CSD),实际保护的扇区数为(WP_GRP_SIZE+1),为1 Sector

RCA: SD卡相对地址为4660 

参考资料:《Simplified_SDIO_Card_Spec.pdf》

     《Simplified_Physical_Layer_Spec.pdf》

       《Simplified_SD_Host_Controller_Spec.pdf》

     《STM32芯片手册》

来源:STM32嵌入式开发

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 239

意法半导体TouchGFX软件包最新版本进一步简化在STM32 微控制器上开发美观的用户界面 (UI)。4.21 版增加了TouchGFX Stock功能,在网址https://fonts.google.com/icons提供大量的免费的图案、图像、图标。这个功能可帮助用户轻松管理图形资产,确保产品原型和最终产品用户界面的统一性和美观性。

1.jpg

4.21 版还增加了对 SVG 图像(可缩放矢量图形图像格式)的支持,这为开发酷炫的 UI 提供了更多自由空间。用户获取SVG图像需要用 TouchGFX Designer工具中新增的一个小部件,为确保高性能,SVG图像需用到意法半导体 STM32 MCU中的专用图形处理硬件,例如,NeoChrom GPU 处理器

此外,4.21版的TouchGFX Designer工具在导航、一般用途等方面进行50 多项改进,帮助开发人员更快、更高效地实现想法。

结合 STM32 开发生态系统的强大实力,包括软件工具、MCU 专用中间件和评估板,TouchGFX 帮助设计人员快速轻松地启动和推进项目。该软件包提供了为家用电器、楼宇自动化控制、工业机械、健身追踪器和其他可穿戴设备、医疗设备等产品创建引人注目的用户界面所需的一切。

现在,从www.st.com下载X-CUBE-TOUCHGFX 软件包,即可免费使用TouchGFX 4.21 版。

若想了解有关 TouchGFX 和 4.21 版的更多信息,请阅读 ST博客 :https://blog.st.com/touchgfx

关于意法半导体

意法半导体拥有48,000名半导体技术的创造者和创新者,掌握半导体供应链和先进的制造设备。作为一家半导体垂直整合制造商(IDM),意法半导体与二十多万家客户、成千上万名合作伙伴一起研发产品和解决方案,共同构建生态系统,帮助他们更好地应对各种挑战和新机遇,满足世界对可持续发展的更高需求。意法半导体的技术让人们的出行更智能,电力和能源管理更高效,物联网和互联技术应用更广泛。意法半导体承诺将于2027年实现碳中和。详情请浏览意法半导体公司网站:www.st.com

围观 13

意法半导体最新的 X-CUBE-TCPP软件包增强了公司的 USB Type-C® 端口保护芯片产品组合和STM32 接口IP(知识产权),简化USB Power Delivery产品研发。

111111111111111-min.jpg

USB Power Delivery技术规范支持从传统的 5V/0.5A一直到最新版本 3.1 规范中的 48V/5A(240 瓦)的工作模式。功率增容可以激发产品设计创新,有助于新的可持续发展法律出台,例如,最近欧盟批准USB Type-C 成为所有手机、平板电脑和相机的通用充电端口,以减少电子垃圾。利用 USB Power Delivery 的新产品设计包括移动电源、智能扬声器、PC 外围设备、通信设备、医疗设备、POS 终端、工业显示器和电池供电的嵌入式应用。

意法半导体的X-CUBE-TCPP软件包可以简化在STM32Cube 生态系统中的开发工作,并为意法半导体产品组合中的三个 USB Type-C 端口保护 IC提供软件库。这三款芯片是受电端TCPP01-M12、供电端TCPP02-M18 和双重角色电源 (DRP)TCPP03-M20。

TCPP01-M12TCPP02-M18TCPP03-M20可与意法半导体的STM32G0、STM32G4、STM32L5 和 STM32U5 微控制器 (MCU)的UCPD(USB Type-C和Power Delivery)接口IP配合使用,在标准功率范围内解决 USB 供电问题,最高功率可达 20V-5A(100 W)。把USB Type-C分成微控制器和端口保护芯片两部分可以用双片解决方案,以节省成本,降低开发复杂性,最大限度地减少 PCB 空间。STM32芯片还可用作主MCU。

Additionally, X-CUBE-TCPP assists development on STM32 MCUs that do not contain the Power Delivery PHY, to streamline compliance with the USB Type-C specification.

此外,X-CUBE-TCPP 还有助于在没有 Power Delivery PHY的 STM32 MCU 上开发应用,简化产品的USB Type-C规范合规设计。

用户使用X-CUBE-TCPP 软件库,配合X-NUCLEO-SNK1M1扩展板,选用NUCLEO-G071RBNUCLEO-G474RENUCLEO-L412RB-P任何一款搭载STM32 MCU的STM32 Nucleo-64开发板执行代码,可以加快受电应用开发。

开发供电端应用,X-CUBE-TCPP软件库可与X-NUCLEO-SRC1M1扩展板和任何一款无 Power Delivery的STM32 Nucleo-64 USB Type-C供电端开发板配合使用,或者与有Power Delivery 的NUCLEO-G071RB 或 NUCLEO-G474RE USB Type-C供电开发板配合。

开发有 Power Delivery 的 DRP应用,软件库需要与X-NUCLEO-DRP1M1扩展板和NUCLEO-G071RB 或 NUCLEO-G474RE主板配合使用。

这三块板子已通过 USB Implementers Forum 认证,并具有一个代表符合 USB-C Power Delivery规范的测试ID编号(TID),这确保开发人员开发的产品与现场的其他认证产品互操作。这些板子的 TID测试编号分别是 X-NUCLEO-SNK1M1 (TID 5205), X-NUCLEO-SRC1M1 (TID 7884)和 X-NUCLEO-DRP1M1(TID 6408)。

X-CUBE-TCPP软件包可从 www.st.com 或 GitHub 免费下载。

围观 17

1、前言

本应用笔记介绍如何管理 STM32 产品中的内存保护单元(MPU)。MPU 是用于存储器保护的可选组件。STM32 微控制器(MCU)中嵌入 MPU 之后变得更稳健可靠。在使用 MPU 之前,必须对其进行编程并加以启用。如果 MPU 没有启用,则存储系统的行为不会变化。

2、概述

MPU 可以使嵌入式系统更加稳健和安全:• 禁止用户应用程序破坏关键任务(例如操作系统核心)使用的数据• 将 SRAM 存储区域定义为非可执行(禁止执行 XN),以防止代码注入攻击• 修改存储访问属性MPU可最多保护16个内存区域。在 Armv6、Armv7 架构(Cortex-M0+、M3、M4、M7)下,这些区域可以依次拥有 8 个子区域(前提是区域至少有 256 字节))。

在 STM32 中,受保护区域的确切数量可能因内核和器件而有所不同,请参阅 Cortex-M33 MPU 寄存器获取详细信息。子区域的大小都是相等的,可以根据子区域号进行启用或禁用。因为最小区域大小是由缓存行长度(32 字节)驱动的,所以 8 个 32 字节的子区域对应一个 256 字节的区域。区域的编号为 0 至 15。

此外,还有一处默认区域,其 id 为-1。所有编号 0-15 的存储区域的优先级高于默认区域。这些区域可以重叠,也可以嵌套。区域 0-15 的优先级由低到高,这也决定了区域重叠的方式。优先级是固定的,不可更改。在 Armv8 架构(Cortex-M33)中,使用起始地址和终止地址来定义区域,使开发人员能够以灵活、简单的方式组织这些区域。

此外,正是区域大小的可灵活配置得到提升,故Cortex-M33就没有子区域的概念了。下图显示的示例包含六个区域。该示例显示区域 4 与区域 0 和 1 重叠。区域 5 完全包含在区域 3 内。因为优先级是递增的,所以重叠区域(橙色)优先。因此,如果区域 0 是可写的,而区域 4 不可写,那么位于区域 0 和区域 4 重叠部分的地址为不可写。

1.png

Conclusion:

在 Armv8 架构(Cortex-M33)中,现在不允许区域重叠。由于 MPU 区域的定义更加灵活,因此没有必要重叠MPU 区域。 

MPU 是统一的,意味着没有单独的区域用于数据和指令。

MPU 还可以用于定义其他存储器属性(如可缓存性),可以导出到系统级缓存单元或存储存控制器。Arm 架构中的存储器属性设置可以支持两种级别的缓存:内部缓存和外部缓存。STM32F7 和 STM32H7 系列仅支持一种级别的缓存(L1-缓存)。 

缓存控制由缓存控制寄存器实现全局控制,但 MPU 可以指定缓存策略以及区域是否可缓存。

2.1存储器模型 

在 STM32 产品中,处理器具有固定的默认存储器映射,可提供最多 4 Gb 的可寻址存储器。

2.png

3.png

3、  Cortex-M0+/M3/M4/M7 

存储器类型、寄存器和属性

存储器映射和 MPU 编程将存储器映射分为多个区域。每个区域都有已定义的存储器类型和存储器属性。存储器类型和属性决定该区域的访问行为。

3.1 存储器类型

有三种常见的存储器类型: 

• 普通存储器:允许 CPU 以有效方式安排字节、半字和字的加载和存储(编译器不了解存储器区域类型)。对于普通存储器区域,CPU 不一定按照程序中列出的顺序执行加载/存储操作。 

• 器件存储器:在器件区域内,负载和存储是严格按照顺序进行的。这是为了确保以正确的顺序设置寄存器。 

• 强排序存储器:所有操作始终按以编程方式列出的顺序执行,CPU 会等待加载/存储指令执行(有效的总线访问)结束,然后执行程序流中的下一条指令。这可能导致性能损失。

3.2 存储器属性

区域的属性与大小寄存器(MPU_RASR)是设置所有存储器属性的地方。该表显示了 MPU_RASR 寄存器中对于区域的属性和大小的简要描述。

4.png

前一个表格中的参数详情如下: 

• XN 标志位控制代码的执行。为了在区域内执行指令,特权级别必须有读访问权限,而 XN 必须为 0。否则,会产生 MemManage 报错。 

• 数据访问权限(AP)字段定义存储区域的 AP。

下表对访问权限进行了说明:

5.png

• S 字段面向可共享的存储区域:存储系统在一个有多个总线主控的系统(例如,一个处理器带一个 DMA 控制器)中提供总线主控之间的数据同步。强排序的存储器始终可共享。如果多个总线主控可以访问一个不可共享的存储区域,软件必须确保总线主控之间的数据一致性。STM32F7 系列和 STM32H7 系列不支持硬件一致性。S 字段相当于不可缓存的存储器。 

• TEX、C 和 B 位用于定义区域的缓存属性,以及(在某种程度上)可共享性。按下表对其进行编码。

在 STM32 微控制器中加入 MPU 使其稳健、可靠,而且在某些情况下更安全 - 防止应用程序任务访问或破坏其他任务使用的堆栈和数据存储器。该应用笔记描述了不同的存储器属性、类型和 MPU 寄存器。其中还提供了 MPU(使用 STM32Cube HAL)设置示例,以说明如何配置 STM32 MCU 中的 MPU。如需详细了解 MPU 寄存器,请参阅 Cortex 内核编程手册。本应用笔记内容较长,篇幅有限仅展示部分,完整内容请点击“阅读原文”下载原文档。

来源:STM32单片机

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 107

1.问题原因

某客户测试 STM32H753xi 板子上的 ECC 功能,用于监控 AXI-SRAM 区域,但不是很明白 RAMECC FAR 寄存器在 RM0433 中的描述, “Bits 31:0 FADD[31:0]: ECC error failing address”。

比如在 AXI-SRAM 中,如果客户示例显示的是 FAR = 0x2004,但是这个地址值 0x2004 并不在 AXI-SRAM 范围之内,客户该如何理解 FAR 寄存器?希望能够有详尽的描述,这个 FAR 寄存器的偏移地址是 Word 地址还是 Byte 地址或其他?我们先来看看相关参考手册中关于 RAMECC 的介绍去寻找答案。

2.RAMECC 控制单元

RAM ECC 控制单元的数量取决于不同的 STM32H7 系列。比如,对于STM32H74x/5x 和 STM32H72x/3x 它们的每一个域都有一个 RAMECC 的控制器单元,为了描述简单,表述如下: 

Domain 1 (D1) RAMECC unit = RAMECC1Domain 2 (D2) RAMECC unit = RAMECC2Domain  3  (D3)   RAMECC  unit   =  RAMECC3

详细的说明请参考 RM0433 参考手册 rev7 中的截图:

1.jpg

3.RAMECC 寄存器地址

对于上图 Table 11 的 RAMECC 控制单元的地址总结成如下表格,具体的参考RM0433 的第二章节 Memory and bus architecture 中的 table 8.

2.jpg

4.RAMECC 寄存器

每一个 RAMECC 控制单元(RAMECC1、RAMECC2、RAMECC3)的监控单元Monitor number 均分别含有如下的一套寄存器组(其中 RAMECC_IER 为共同拥有)。 

接下来我们以 RAMECC1 为例进行分析,其边界地址为:0x52009000 -0x520093FF,那么对于该 RAMECC1 控制单元中的寄存器组,对于每一个寄存器:

3.jpg

以 RAMECC1 的起始地址 0x52009000 为基准:RAMECC_IER:中断使能,偏移地址 0x00,该寄存器地址即为:0x52009000。

RAMECC_MxCR:配置寄存器,偏移地址 0x20 *x,x 为 ECC 监控单元号,该寄存器地址的表达式为:0x52009000 + 0x20 * x ,x 取值范围= [1..5](见上面表格 Table 11 ECC controller mapping),所以: 

Monitor 1 - AXI SRAM ECC 监控单元,该寄存器地址即为 0x52009020,监控大小为整个 AXI SRAM 的 512KB 字节(0x24000000 -0x2407FFFF)。 

Monitor 2 - ITCM-RAM ECC 监控单元,该寄存器地址0x52009040, 监控大小为整个ITCM RAM的64KB字节(0x00000000 -0x0000FFFF)。  

Monitor 3、Monitor 4、Monitor 5 中该 RAMECC_MxCR 寄存器的地址,以此类推。

RAMECC_MxSR -- 状态寄存器,偏移地址: 0x24 + 0x20 * (x - 1),x 为 ECC monitor number 号码(见上面表格 Table 11 ECC controller mapping)。那么该寄存的地址为:0x52009000 + 0x24 + 0x20 * (x-1) ,x 取值范围 = [1..5]:

Monitor 1:0x52009024

Monitor 2:0x52009044

Monitor 3 : 0x52009064 

Monitor 4 : 0x52009084 

Monitor 5 : 0x520090a4 

RAMECC_MxFAR --失败地址寄存器,表达式:0x52009000 + 0x28 + 0x20 * (x-1) , x取值 = [1..5]: 

Monitor 1:0x52009028

Monitor 2:0x52009048

Monitor 3:0x52009068

Monitor 4:0x52009088

Monitor 5:0x520090a8

RAMECC_MxFDRL -- 失败数据低位,表达式 0x52009000 + 0x2c + 0x20 * (x-1) ,x 取值= [1..5] 

Monitor 1:0x5200902c

Monitor 2:0x5200904c

Monitor 3:0x5200906c

Monitor 4:0x5200908c

Monitor 5:0x520090ac

RAMECC_MxFDRH -- 失败数据高位,表达式 0x52009000 + 0x30 + 0x20 * (x-1),x 取值= [1..5] 

Monitor 1:0x52009030 

Monitor 2:0x52009050 

Monitor 3:0x52009070 

Monitor 4:0x52009090 

Monitor 5:0x520090b0 

RAMECC_MxFECR --失败 ECC 错误代码,表达式 0x52009000 + 0x34 + 0x20 * (x1) ,x 取值 = [1..5]

Monitor 1:0x52009034

Monitor 2:0x52009054

Monitor 3:0x52009074

Monitor 4:0x52009094

Monitor 5:0x520090b4

5.解决问题

通过查询资料与试验,FADD[31:0]中表述的地址是 word 而不是 bit。为了计算真实的地址,客户需要用如下公式计算:真实地址= 所处内存的首地址 + FADD x 字节数。 


现在举个例子,如上述提到的 FADD= 0x2004 : 

- 对于 64-bit word 的内存 :如 AXI RAM : 0x2400 0000 + 0x2004 * 8 = 0x2401 0020; 

- 对于 32-bit word 的内存 :如 SRAM1 : 0x3000 0000 + 0x2004 * 4=0x3000 8010 ;

来源: STM32单片机

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 47

前言

在STM32之前,都是老大头51,带着它的“小弟们” MSP430、AVR、PIC在单片机界呼风唤雨。

那个时候,市场上遍布8位机,大学教材用51入门,个人、企业学单片机基本上也都在用51。虽然AVR也有一些8位机市场,但与stc带领下的51单片机是完全不能相比的。当然,这个时候也有16位机的msp430,其他厂家单片机还有pic,高端嵌入式处理器等市场有arm7、arm9等。这个时期的单片机市场是百花齐放、百家争鸣,但总体来说,还是势均力敌、一片祥和的。那么,这个局势是从什么时候开始打破的呢?这还得从物联网的崛起说起。 

原因

当时,物联网(Internet of Things,IoT)逐步进入人们的视野范围。随着它的发展,嵌入式领域对于高性能处理器的需求呈现爆发式增长。

虽然8位CISC(复杂指令)架构内核8051占据了半壁江山,但奈何其性能低下,寻址范围受限,已经难以适应更多的新兴应用领域。而32位架构微处理器内核凭借其极佳的执行效能,不仅能满足物联网对数据处理能力的要求,还能兼顾物联网的低功耗和高性能要求,斩获物联网市场的独家宠爱。在32位架构微处理器中,属ARM公司推出了面向各类嵌入式应用的微控制器核Cortex-M内核受到市场青睐,Cortex-M之于32位MCU就如同8051之于8位MCU。而正是Cortex-M的出现,让ST公司看到了这个内核的强大之处——利用该内核设计了大放光芒的STM32,打破了曾经的单片机局面。

崛起过程

如今,我们往回看那段历史,会发现一切改变都由那时发生——

从2007年6月11日推出第一代STM32产品——Cortex-M MCU STM32F1开始,单片机市场迎来了STM32新星,32位MCU浪潮,如期而至。

1.jpg

2.jpg

此后,芝麻开花节节高,STM32成功的故事也一直在延续。ST公司陆续在每一年都基于新的内核或者新的技术领域有所突破,发布超过了19个STM32 产品系列,包括一个MPU产品线,生产工艺也从180nm不断进阶到110nm、90nm和40nm。例如:

2009年推出了全球第一款超低功耗系列STM32 L1;

2010年推出了第一款在高性能的基于90纳米工艺、120 MHz 的STM32F2产品线;2011年推成第一款高性能Contex-M4的处理器STM32F4;

......

2019年推出全球最为强大的第一款双核处理器STM32MP1、最新一代混合信号Contex-M4 MCUs和世界上最大的MCU STM32H7;

2020年推出全球首颗内置LoRa收发器的SoC——STM32WL。

3.jpg

“一只南美洲亚马逊流域热带雨林中的蝴蝶,偶尔扇动几下翅膀,可以在两周以后引起美国德克萨斯州的一场龙卷风。”STM32这只小蝴蝶带来的改变效果也很明显。2007年ST公司的通用MCU全球排名还只是第11位,2015年便上升到第3位,2018年上升到第2位,2018年则在中国供应商的排名中ST公司一举拿下第一的高地,此后数年,ST的地位几乎无人撼动。

4.jpg

如何学习

入坑STM32后,我们应该如何学习?

如今,STM32堪称爆火,并且潜力无穷。所以,有很多人都在学STM32。

但STM32对入门者可能不是特别友好,因为知识很多,但是对于有一定开发经验的人来说,就是一把好兵器,它能帮你大大缩短开发周期。

那应该如何入坑STM32呢?

(1) 根据时间表定时定量学习

大学时期,都有实验室的学长学姐带着入门,安排任务。

比如,基本任务是一周内学完搭好环境、熟悉调试软件,结合《STM32Fxxx参考手册》、《STM32固件库使用手册》和光盘视频,实现基本篇的GPIO应用。

(2) 举一反三,并通过阶段任务检查学习效果

在学习例程时,可以尝试修改该例程的外设配置,达到举一反三的效果。

每一周,学长学姐会根据你的学习进度,安排给你一个阶段任务,用来检查你的学习效果。

如果你是自学,那么可以根据网上教程和各大资源网站上的“STM32入门小项目合集”,主动给自己找一个小项目,把它实现出来。

这里我推荐正点原子的资源,毕竟每次看视频时的片头曲“我的未来不是梦”让我对STM32充满激情,当然野火、小苗、普中也不错~

(3) 基本外设、功能会用就行,后期需要什么再去针对性地学

按部就班地把STM32知识从头到尾系统性地学习完,固然很好。但是,你要知道学习单片机只是为了解决问题,我们只要在遇到问题时,能够通过STM32解决就行。

因此,当你把基本外设、功能都差不多掌握了,程序能跑起来,并且也知道哪里可以修改、修改成什么就已经基本入门了。

此后,你可以通过一些大大小小项目,巩固理解和探索新功能,你的经验也随之增加。

(4) 学好C语言,可以学着画PCB制板、焊接

软件和硬件都要两手抓。C语言对于STM32的学习至关重要,C语言不好,还跑什么代码?学会画板子、焊板子,这样有什么需求,都可以自己添加。

当然,上面的建议都是给0基础的STM32入门者,若是你有一定基础,那当然是对症下药,哪里不会补哪里。

学海无涯,勇于探索新技术

“学海无涯、永无止境”,更何况是每一年都在推陈出新的STM32。

事实上,STM32 的开发方式已经发生了很大的变化。

比如:

2014 年,ST 公司推出了 HAL 库和 MCU 图形化配置软件STM32CubeMX。

2017 年年底,ST 公司收购了 Atollic 公司,把专业版 TrueSTUDIO 转为免费软件。

2019 年 4 月,ST 公司正式推出了自己的 STM32 程序开发 IDE 工具软件 STM32CubeIDE1.0.0,打造了一个完整的 STM32Cube 生态系统。

而STM32Cube 生态系统已经完全抛弃了早期的标准外设库,STM32 系列 MCU 都提供 HAL固件库以及其他一些扩展库。

STM32Cube 生态系统的两个核心软件是STM32CubeMX 和STM32CubeIDE,且都是由 ST 官方免费提供的。

使用 STM32CubeMX 可以进行 MCU 的系统功能和外设图形化配置,可以生成STM32CubeIDE 项目框架代码,包括系统初始化代码和已配置外设的初始化代码。

如果用户想在生成的 STM32CubeIDE 初始项目的基础上添加自己的应用程序代码只需把用户代码写在代码沙箱段内,就可以在 STM32CubeMX 中修改 MCU 设置,重新生成代码,而不会影响用户已经添加的程序代码。

由此看来,使用STM32CubeMX 和 TrueSTUDIO 进行STM32 开发是一个良好的组合方式!

本文直接来源:嵌入式资讯精选

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 32

该视频分为3个部分,第1部分将介绍如何在STM32CubeMX中设置Octo-SPI外设。第2部分将介绍如何初始化Octo-SPI外设并在存储器映射模式下设置Octo-SPI外设。第3部分将介绍如何为IS25LX256 OCTOSPI Flash 构建外部Flash loader。

来源:STM32单片机

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:demi@eetrend.com)。

围观 78

页面

订阅 RSS - STM32