IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> stm32h743外部RAM非字节对齐访问,引起的hard fault -> 正文阅读

[嵌入式]stm32h743外部RAM非字节对齐访问,引起的hard fault

我遇到的情况非常相似,我先说说我遇到的情况:由于公司的STM32F437买不来了,价格500+, 但是STM32H743却只有200+,于是我收到了一个任务,用STM32H743替换之前的F437; 调试还算顺利,问题一一解决了,直到今天遇到 个hard fault,做嵌入式的人估计都知道,这错误谁遇到谁头痛;于是我先在网上搜了一下,没有人遇到过。?

死机时,RTTHREAD的提示如下:unaligned access

?车到山前必有路,于是我硬着头皮开始定位错误,好在我用的是万能的MDK,我一直这么认为,如果是在MDK上开发产品,没有单步执行解决不了了的问题,这次也不例外。

? ?当我一步一步执行时,发现在一个memcpy()时,出现硬件错误了,RTTHREAD提示说是没有对齐的数据访问,如下:

?我的外扩SRAM的地址为0x6c100000 ,? 上面的汇编指令 LDRPL R3, [R1], #0X04, 意思是从0x6c102D7E处拷贝4个字节到R3寄存器,只要执行这个指令,就会直接跳到错误中断处理。很明显0x6c102D7E不是一个4字节对齐的地址,但是在我的印象中外部SRAM SDRAM是不需要字节对齐访问的,于是我在F437上特意试了一下,一样的程序,就没有这个问题,于是我就怀疑是STM32H743的MPU在作怪,(我的直觉是正确的),于是我把MPU设置中的BUF打开,试了下,还是不行,方向是对的,但是研究的还不够深刻,于是我又上网上有针对性的搜索,就搜到了下面的文章 , 果然是MPU的问题,人家分析的更透彻, 我按照下面的方法修改后果然正常了。

stm32h743手册明确支持32bit访问16b的存储器,事下图:

??下面为转载的文章:STM32F7:访问未对齐的内存引起硬件异常的解决方法 - STM32F746-DISCO - 一板网电子技术论坛

现象

如果STM32F7xx微控制器与外部SDRAM一起使用时,由于未对齐访问,Cortex-M7内核可能会意外地进入硬件异常处理程序。 例如,这可能发生在LCD的帧缓冲器、RAM文件系统或任何其它数据位于SDRAM地址范围0xC0000000-0xC03FFFFF(最大4MB)中时。 即使CCR寄存器中的位UNALIGN_TRP(位3)未使能,但仍会产生硬件异常。

原因

一般来说,基于Cortex-M7的器件上的RAM访问不必以任何方式对齐。 Cortex-M7内核可以处理硬件的非对齐访问。 通常变量应该自然对齐,因为这些访问略快于未对齐访问。

STM32F7xx器件的外部SDRAM映射到地址范围0xC0000000 - 0xC03FFFFF(最大4MB)。 根据ARMv7-M体系结构参考手册B3.1章(表B3-1),区域0xC0000000-0xDFFFFFFF(32MB)被指定为Device Memory Type。 根据A3.2.1章节,对Device Memory Type的所有访问必须自然对齐。 如果不是,则将执行硬件异常,无论CCR寄存器中的位UNALIGN_TRP(位3)是否使能。

解决方法

STM32F7xx有几种可能的解决方法:

1.? ? 启用此区域的MPU

这是我们推荐的解决方法,该微控制器的emWin GUI演示中我们使用了该方法。 可以通过在访问SDRAM之前调用的以下代码来实现。

关键代码

  1. ??/* Configure the MPU attributes for SDRAM */
  2. ??MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  3. ??MPU_InitStruct.BaseAddress = 0xC0000000;
  4. ??MPU_InitStruct.Size = MPU_REGION_SIZE_4MB;
  5. ??MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  6. ??MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  7. ??MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  8. ??MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  9. ??MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  10. ??MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
  11. ??MPU_InitStruct.SubRegionDisable = 0x00;
  12. ??MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-10 11:01:09  更:2021-09-10 11:01:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:53:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码