历史上的今天

今天是:2024年09月03日(星期二)

正在发生

2021年09月03日 | 【STM32】HAL库调用HAL_SPI_Transmit出现HartFault问题

发布者:星尘之泪 来源: eefocus关键字:STM32  HAL库 手机看文章 扫描二维码
随时随地手机看文章

问题描述:

HAL库调用硬件SPI发送函数HAL_SPI_Transmit会导致程序进入HartFault


// flash 页大小(字节)

#define FLASH_SPI_PAGE_SIZE       (256)


static uint8_t write_buffer[FLASH_SPI_PAGE_SIZE + 4];


spi1_write(W25QXX_CHANNEL, (uint8_t *)write_buffer, (length + 4));


/**

 * @brief SPI写入

 * @param *txBuffer 发送字节集

 * @param txLength 发送长度

 * @return spi发送的长度

 * */

uint32_t spi1_write(SPIChannel channel, uint8_t *txBuffer, uint32_t txLength)

{

  if(channel == W25QXX_CHANNEL)

  {

    W25QXX_CHANNEL_ON;

  }


  HAL_SPI_Transmit(&hspi2, txBuffer, txLength, 500);


  if(channel == W25QXX_CHANNEL)

  {

    W25QXX_CHANNEL_OFF;

  }


  return txLength;

}


原因分析:

Debug发现进入HartFault之前最后一句话是

在这里插入图片描述

是该揭开它真正面纱的时候了:我们再看出现问题的那条语句:


hspi->Instance->DR = *((uint16_t *)pData);


再看我们数组的定义:uint8_t

出现问

题这条语句把我们定义的uint8_t 数组转换成了uint16_t 同时进行半字的操作(同时操作两个byte)。这样看确实提高了执行效率,但是却也埋下了隐患。


产生这样的问题,我们就不得不扯得更远一点,arm内核对数据的非对齐数据访问。


Arm对内存的访问支持字(4byte)、半字(2byte)、字节(1byte)的直接访问,但是呢他们是有一定的要求的:


存取字时要求地址按字对齐,也就是地址要是4的整数倍,如0x0000、0x0004、0x0008(该地址只是举例,mcu的地址分配请参考具体手册的地址映射图)

存取半字是要求地址按半字对齐,也就是地址是2的倍数,这样假如通过0x0001、0x0003这样非2倍数的地址来读取一个半字就会产生错误

存取字节简单,只要地址不超范围就可以

这么看来是不是有点清晰了,我们出现错误的地方不就是在操作一个半字(uint16占用两个byte也就是半字),那么进入到了hardfault应该就是操作了非半字对齐的地址。


下面我们将write_buffer地址打印出来:


rtt_printf("0x%08xn",write_buffer);

在这里插入图片描述

很显然,这个地址并不是非半字对齐的地址。

解决方案:

将write_buffer定义成uint32_t即四字节对齐即可。

static uint32_t write_buffer[(FLASH_SPI_PAGE_SIZE + 4 )>>2];

在这里插入图片描述

关键字:STM32  HAL库 引用地址:【STM32】HAL库调用HAL_SPI_Transmit出现HartFault问题

上一篇:【STM32】解决引脚复用成PWM开漏输出峰值达不到外部上拉的电
下一篇:【STM32】Debug下禁用看门狗

推荐阅读

  关于成龙的荣誉,怕说上一天一夜也说不完,他是唯一一位获得奥斯卡荣誉奖的中国人,他是中国在好莱坞最成功的华人演员,他也是世界范围内的中国名片,在某些战乱地区,他的照片甚至比防弹衣更有效。   他热衷于慈善,脚步遍布全球,把自己的影响力带到了世界其它地方;他也热衷环保,关于他“抠门”的例子很多,他会在各种场合演示和宣传各种环保的...
小米在一周之内两次成为舆论焦点。 8月30日晚间,证监会更新首次公开发行股票(IPO)申请终止审查企业名单,名单显示小米集团已经于8月26日终止审查。随后小米在港交所发布公告称,公司决定终止本次主板存托凭证发行。 这意味着,曾经顶着“CDR概念第一股”的小米正式撤出A股IPO排队通道。这是本周小米第二次引发资本市场关注,前一次是高管抛售股票。 8...
在基本入门熟悉了开发环境后,我开始学习stm32中的gpio口用法,学习的方法还是最直观简便的先控制LED灯。然而stm32中点亮led倒没有51单片机那么简便。有过51单片机学习经验的伙伴们,肯定熟悉下图的代码(51中控制led的程序)。 如果同样方法写在stm32中肯定是不行的了,首先因为stm32中没有51头文件中那样定义好了P0口可以直接进行总线操作,其次s...
据外媒Apple Insider报道,苹果目前正在访问韩国和日本的汽车制造商,公司计划在2024年推出“苹果汽车”。报道称,苹果正拜访韩国和日本供应链和汽车制造商,为2024年量产Apple Car电动汽车做准备。公司已造访丰田汽车、SK集团和LG电子。双方讨论的主要话题是,在全球芯片短缺的大背景下,应如何生产Apple Car。在电池方面,出于安全性考虑,苹果正在考...

史海拾趣

问答坊 | AI 解惑

宽带放大器/平衡混频器

      各种CMOS数字功能都可用于很多模拟领域。例如,一个CMOS器件(MC74AC00)有可能成为一种小功率、低噪声宽带放大器和平衡混频器。…

查看全部问答∨

HT-220/10高频开关电源的研制

摘要:使用无损吸收电路,能够提高硬开关PFC的工作频率,并降低开关损耗。应用全桥移相软开关技术,实现了DC/DC变换器的大功率输出。通过应用这两种技术,研制HF220/10型高频开关电源。 关键词:无损吸收PFC变换器ZVS?FB …

查看全部问答∨

Wince5.0 direct3d问题,请指点一下,谢谢!

公司找的外包软件公司需要direct3d功能,对此不了解,所以有几个问题想请教一下: 1、外包公司一直提到direct3d.dll,而WINCE5.0中有d3dm.dll,两者之间的关系是类似于MDD与PDD之间的关系还是同等关系? 2、看他们软件介绍是需要Pocket PC\\Windo ...…

查看全部问答∨

已经实现开机自动运行程序,关于输入的一点问题

我按照网上查到的方法 用自己的程序替换掉了explorer.exe [HKEY_LOCAL_MACHINE\\Init] "Launch50"="myapp.exe" "Depend50"=hex:14,00,1e,00 编译的系统能够运行,并且程序全屏。 我的疑问是,我想在程序的界面中输入东西怎么办? ...…

查看全部问答∨

关于固化在硬件上的图片取出问题

各位大侠大哥你们好,小弟近日在做界面修改时,发现界面上的图片都是通过bmptobin.exe去生成相应的*.h文件的,现在我想将图片从器件中拿出来,做修改后再放回去,我找了一些方法,但是网上介绍的说可以通过bintobmp和reEdit这个软件可以将里面的数 ...…

查看全部问答∨

MMI 3002514 是什么?

micro motion 公司的MMI 3002514是什么器件啊?…

查看全部问答∨

vxworks下用usb驱动d12芯片的问题?

vxworks下用usb驱动d12芯片,要注意哪些关键的地方?可以指点一下吗? 谢谢! …

查看全部问答∨

想学习uC/OSII,有什么好书可以看??

如题,最近想研究下uC/OSII,各位有没有什么好书或者资料什么的,给点参考建议!谢谢了!…

查看全部问答∨

ST意法uPSD8位微控制器选型指南

ST 意法uPSD 8位微控制器选型指南 系列…

查看全部问答∨

线性功放

我想做一个放大线性调频信号的线性功放,以前没做过,请指教一下,谢谢。…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved