【STM32】HAL库调用HAL_SPI_Transmit出现HartFault问题

发布者:星尘之泪最新更新时间:2021-10-14 来源: 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下禁用看门狗

推荐阅读最新更新时间:2024-11-17 11:36

STM32 4 path PWM output
  STM32的普通定时器有四路输出:TIMx_CH1、TIMx_CH2、TIMx_CH3和TIMx_CH4,可以使用输出比较的方法产生不同频率的方波输出,简单的方法是:   1)设置计数器为向上计数模式,将自动重装载寄存器设置为0xFFFF;这样计数器会循环计数。   2)每个定时器通道设置为输出比较模式,并设置比较匹配时对应的输出管脚翻转输出。   3)按照输出波形的半波周期计算出一个数值称作Half_Cyc。例如:定时器的时钟频率是72MHz,需要产生3456Hz的方波,则Half_Cyc = 72M/(3456*2) = 41667;如需要产生200kHz的方波,则Half_Cyc = 72M/(200k*2)
[单片机]
STM32开发笔记77: 内部看门狗长延时的产生
单片机型号:STM32L053R8T6 开发笔记STM32开发笔记45:看门狗驱动程序的移植介绍了看门狗驱动程序的基本设计方法。今天项目中看门狗的延时时间达到10秒,则实际运行效果只有3秒。 以下是看门狗最大延时时间的设置函数: void CIwdg::SetMaxRefreshInterval(uint8_t u8_second) { this- hIwdg.Instance = IWDG; this- hIwdg.Init.Prescaler = IWDG_PRESCALER_64; this- hIwdg.Init.Window = 4095; #if defined STM32F091xC || defi
[单片机]
stm32中的串口管脚
USART1_CK ------ PA8 USART1_TX ------ PA9 USART1_RX ----- PA10 USART1_CTS ----- PA11 USART1_RTS ----- PA12 USART2_CTS ----- PA0 USART2_RTS ----- PA1 USART2_TX ----- PA2 USART2_RX ----- PA3 USART2_CK ----- PA4 USART3_TX ----- PB10 USART3_RX ----- PB11 USART3_CK ----- PB12 USART3_CTS ----- PB13 USART3_RTS ----- PB1
[单片机]
STM32之timer2的精准延时
一、简介 本文介绍STM32系列如何使用timer2进行精确定时。 二、实验平台 库版本:STM32F10x_StdPeriph_Lib_V3.5.0 编译软件:MDK4.53 硬件平台:STM32开发板(主芯片stm32f103c8t6) 仿真器:JLINK 三、版权声明 四、实验前提 1、在进行本文步骤前,请先阅读以下博文: 暂无 2、在进行本文步骤前,请先实现以下博文: 暂无 五、基础知识 暂无 六、实验步骤 1、编写并添加定时器2驱动 1)编写驱动GUA_Timer2.c(存放在“……HARDWARE”) //***************************
[单片机]
<font color='red'>STM32</font>之timer2的精准延时
stm32芯片被锁,使用jlink就能轻轻松松解锁
如果一不小心将stm32开发板的芯片给锁了,那原因可能是忽略了一个比较低级的问题,就是将stm32中的一些不能独立使用的IO口给了高电平,stm32中有很多口是不能独立使用的,如图(以stm32103rct6 正点原子的mini板为例): (N:表示不能独立使用,Y:表示能独立使用) 其实截图的内容都是来自stm32不完全手册,需要更多资讯请看stm32不完全手册。 以上就是芯片被锁的一种可能比较低级的原因。接下来就讲一下芯片被锁之后的解决方法。 一般芯片被锁之后在编译后下载时会出现以下的报错: 那么如果是用jlink下载器的就可以直接用jlink来解决问题,用其他办法的我暂时还没试过,只试了用j
[单片机]
<font color='red'>stm32</font>芯片被锁,使用jlink就能轻轻松松解锁
关于stm32的优先级
一:综述 STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级 的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。 首先优先级分组,主要是设置抢占优先级和响应优先级的个数 抢占式优先级 0-15 根据分组设置 (0组 0) (1组 0-1) (2组 0-3) (3组0-7) (4组 0-15) 响应优先级 0-15 根据分组设置(0组 0-15) (1组 0-7) (2组 0-3) (3组 0-1) (4组 0) 如果是抢占优先级说的是厉害的打断不厉害的 而响应优先级则是针对,两个中断同时到达以后,先响应高的。 如果两个中断响应
[单片机]
如何快速上手学习STM32
单片机用处这么广,尤其是STM32生态这么火!如何快速上手学习呢? 你要考虑的是,要用STM32实现什么 为什么使用STM32而不是8051? 是因为51的频率太低,无法满足计算需求?是51的管脚太少,无法满足众多外设的IO? 是51的功耗太大,电池挺不住?是51的功能太弱,而你要使用SPI、I2C、ADC、DMA? 是51的内存太小而你要存储的东西太多? 当你需要使用STM32某些功能,而51实现不了的时候,那STM32自然不需要学习,你会直接去寻找STM32某方面的使用方法。比如要用spi协议的网卡、要使用串口通信、要使用rtos等等。 寄存器vs库函数 我的观点是:当你debug的时候寄存器很重要,当你需要理解芯片工
[单片机]
GD32单片机STM32远程下载手机程序升级固件下载局域网网页升级工具
GD32、STM32单片机,是我们最常见的一种MCU。通常我们在使用STM32单片机都会遇到程序在线升级下载的问题。 GD32/STM32单片机的在线下载通常需要以下几种方式完成: 1、使用ST/GD提供的串口下载工具,本地完成固件的升级下载。 2、自行完成系统BootLoader的编写,将系统程序分为BootLoader和APP两个部分,BootLoader完成固件升级。 3、使用STM32/GD固件服务器,完成固件的升级,固件服务器https://simplewifi.taobao.com/ 几种方式各有优缺点: 使用ST提供的方法进行固件升级,方法简单,不需要额外的开发。但是,只能本地完成STM32单片机的升级。
[单片机]
GD32单片机<font color='red'>STM32</font>远程下载手机程序升级固件下载局域网网页升级工具

推荐帖子

Pt1000测量电路(精度为0.1°)
之前有了解过pt1000的测量电路,就是很不准确,求各位高人指点!file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/Users/372182098/QQ/WinTemp/GE/8C6B5CD2-B508-47B8-8B53-AEEBA13D57F7.jpgPt1000测量电路(精度为0.1°)这里有高人:https://bbs.eeworld.com.cn/thread-35473
林发扬 模拟电子
EVC4.0编程环境,如何把变量文件名传入fopen?
两个菜鸟问题:1.找到别人的代码:intorder=0;AnsiStringfileName,path=c:\\\\temp\\\\;FILE*fp;fileName=path+IntToStr(++i)+AnsiString(.txt);fp=fopen(fileName.c_str(),w);但是在EVC下AnsiString,.c_str()都不可使用。麻烦大虾点播~~~2.同样的这类其他问题挺多,主要是要一个程序从
qwer2006 嵌入式系统
WINCE COM支持 CoCreateInstance API失败
在EVC下我写一个DeviceQuery的组件在另外一个DLL里写下面代码:HRESULThr=::CoCreateInstance(CLSID_IDeviceQuery,NULL,CLSCTX_ALL,IID_DeviceQuery,(void**)&m_IDeviceQuery);编译没有问题,但是跑起来就这个函数调用失败。说明:我PB中加入了COM支持,DeviceQuery也注册了。请教各位eeworld朋友,这是为什么?谢谢!WINCECOM支持CoCrea
miko2007 WindowsCE
谁有XILINX的PCI开发板?有偿借用一周
帮朋友询问:XILINX的PCI开发板有偿借用一周因为是项目急用,所以如果有这个板子的朋友请帮帮忙谁有XILINX的PCI开发板?有偿借用一周没有帮顶!~有个朋友已经联系我了感谢大家关注。好像没有借用成功期待有这个板子的朋友继续帮忙回复板凳soso的帖子没有,继续帮顶继续等待...坛里面不是有SPARTAN的开发板吗?上面有PCI接口没有啊?帮顶,支持!!!有一块黄金串口卡,是XILINX的FPGA做的,但不是开发板,可以引出线
soso FPGA/CPLD
请教:430软件por事件和bor事件的区别
软件por事件和bor事件有什么不同吗?设置了个标志位,当某个程序因为某种原因而未执行,就触发por事件,(正常情况,该程序有执行),但是,当触发了por事件后,程序有重新从头开始,而,前面的因为某种原因未执行的程序,依旧没执行,这是为什么?未执行的,por后依旧没执行么?请教:430软件por事件和bor事件的区别非常感谢啊!
fish001 微控制器 MCU
C2000晒晒 + 28335开发板
当年,想用28335的处理能力做个语音识别的板子,结果就有了这个实验板。配置是28335+CPLD,28335负责数据处理,CPLD负责显示驱动。那个时候不是STM32还没普及不是?呵呵,现在用着当开发板或者核心板还是不错的。 C2000晒晒+28335开发板惊为天人。为什么功能越强的芯片,外围器件越少呢板子很牛啊!带CPLD的显示部分LZ能不能共享原理图期待,楼主来共享
ahuang227 微控制器 MCU
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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