历史上的今天
返回首页

历史上的今天

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

正在发生

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

2021-09-03 来源:eefocus

问题描述:

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];

在这里插入图片描述

推荐阅读

史海拾趣

Eurotech公司的发展小趣事

随着全球对环保问题的日益关注,Eurofarad公司也积极响应这一趋势。公司注重环保理念在产品设计和生产过程中的应用,努力减少对环境的影响。同时,公司还积极推动可持续发展战略,通过优化生产流程和采用环保材料等方式,降低能源消耗和废弃物排放。这些努力不仅符合了社会的期望,也为公司的长期发展提供了有力保障。

Deltron / DEM Manufacturing公司的发展小趣事

为了进一步扩大市场份额和增强竞争力,DEM Manufacturing积极寻求与其他企业的战略合作。公司与其他电子行业的领军企业建立了长期稳定的合作关系,共同开发新产品、拓展新市场。这些合作不仅为公司带来了更多的商业机会,还促进了整个电子行业的发展和进步。

请注意,以上故事梗概是基于已知事实进行的概括和虚构,旨在展示Deltron / DEM Manufacturing公司在电子行业中的发展历程和成就。具体细节和实际情况可能有所不同。

Fortiming Corporation公司的发展小趣事

背景:在电子行业,成本控制和供应链管理是企业竞争力的重要体现。

发展:Fortiming不断优化供应链管理流程,与上游供应商建立长期稳定的合作关系,确保原材料的稳定供应和质量可靠。同时,公司还通过技术创新和工艺改进,降低生产成本,提高产品竞争力。这些措施使得Fortiming在激烈的市场竞争中保持了良好的盈利能力。

Adam Tech公司的发展小趣事

Adam Tech公司成立于1987年,总部位于美国新泽西州。创业初期,公司面临着资金短缺、市场竞争激烈等诸多困难。然而,创始人凭借对电子连接器行业的深刻理解和执着追求,带领团队克服重重困难,逐渐在市场上站稳脚跟。公司最初的产品线相对单一,但凭借着高品质和可靠的性能,逐渐赢得了客户的信任。

Barry Industries Inc公司的发展小趣事

Barry Industries Inc在创业初期面临资金短缺、技术壁垒和市场竞争激烈等诸多挑战。然而,公司创始人凭借对电子行业的深厚理解和对市场需求的敏锐洞察,坚信公司的微波半导体封装技术具有巨大潜力。在创始团队的坚持与努力下,公司逐渐克服了初期的困难,逐步在市场上建立了自己的地位。

EasySync公司的发展小趣事

为了进一步提升竞争力,EasySync公司积极寻求与行业领先企业的战略合作。通过与这些企业的合作,公司不仅获得了更多的技术支持和市场资源,还共同研发出了一系列创新产品。这些产品不仅丰富了公司的产品线,还进一步巩固了公司在同步技术领域的领先地位。

问答坊 | AI 解惑

帮分析个简单的程序。。实在扛不住弄出来了

用定时器1做的简单输出,友善micro2440的板子 请帮我分析下,搞了好长时间,还是出不来 流驱动:#include \"options.h\" #include #include #include #include #include #include #include #include #include \"time.h\"  ...…

查看全部问答>

C语言与单片机C语言(C51)有啥不同?

请问一下各位 学校里学的C语言和单片机C语言(C51)有啥子不一样的?哪个好学一点. 在学校里学了C语言后感觉没有学到啥子,挺浮浅的,现在只记得一些简单的规则和语法。 不知道现在是继续学它基础打扎实点呢,还是就开始学C51,希望大家给点建 ...…

查看全部问答>

wince界面设计问题

请问要设计出这样的界面需要使用什么软件? 这种界面设计使用的什么方法。都是贴的图吗? 那具体设计过程是怎么样的? 好像是先设计整个界面,然后在截图。 …

查看全部问答>

在WINCE60里面把CELLCORE组件加进了NK,怎么测试这块是不是可以正常工作?有没简单的测试AP可用?怎么测试RIL组件绑定了物理通信的串口?

在WINCE60里面把CELLCORE组件加进了NK,怎么测试这块是不是可以正常工作?有没简单的测试AP可用?怎么测试RIL组件绑定了物理通信的串口?…

查看全部问答>

ppc2003可以直接访问sql2000 server中的数据吗?

ppc2003通过wifi跟局域网连接后,可以通过编程直接访问服务器上sql2000 server中的数据吗?有人说必须在ppc上安装sql CE,然后通过sql CE跟服务器上的sql2000交换数据?真的是这样?…

查看全部问答>

立即报名预约2010吉时利新能源与新材料测试技术研讨会

2010年度吉时利测试测量技术全国巡回研讨会将从9月初开始,在成都、重庆、合肥、南京、哈尔滨、武汉、兰州举办届时吉时利资深技术专家将与您深入交流: 绿色电子革命中的光电测试/新能源测试方案 新材料的测试方案 微弱信号测量难点与应对方 ...…

查看全部问答>

uCADCDMA通道4中断问题!

使用uC2.86   ADC使用DMA中断的模式,在DMA1_CH1 初始化以及 中断 都没问题,都可以进中断, 但是改成 DMA1_CH4 就再也不进中断了,为什么?? 难道 DR_ADDRESS 地址不对?? RCC,等其他设置应该都没问题请大家看下我的初始化函 ...…

查看全部问答>

问高手一个关于STM8 I2C的问题

最近在调STM8 的I2C(不想搞模拟的I2C),结果I2C没有调通,不知道问题所在,软件是参考I2C EEPROM固件那个程序写的。初始化如下: void IIC_Init(void) { UCHAR temp; CLK_PCKENR1 |= 0x01; I2C_CR1    = 0x00;  &n ...…

查看全部问答>

关于vca810的放大增益

本帖最后由 dontium 于 2015-1-23 12:51 编辑 我这两天用面包板按照vca810芯片的datasheet中的figure2 电路搭建了一个压控放大,将8脚的50欧姆电阻去掉,并在8脚加了一个vpp=30mv,f=800hz的正弦波(函数发生器产生),并在1脚直接接地。但是在Vc= ...…

查看全部问答>

《TMS320C28x系列DSP》读书笔记--通用目标文件格式,段

      TMS320系列DSP的目标文件各式为通用目标文件格式 COFF (Command Object File Format,简称COFF)。 采用这种目标文件各式的优点是:将指令和数据按照段的概念进行组织和存储,这使得程序的可读性大大增强,更容易编写 ...…

查看全部问答>