历史上的今天
今天是:2025年02月13日(星期四)
2019年02月13日 | STM32F0非对齐访问引起的硬件错误及其排除
2019-02-13 来源:eefocus
前段时间在用STM32L0芯片时遇到一个硬件错误,主要是内存的非对齐访问导致的。
注:CM3内核支持非对齐访问,而CM0不支持非对齐访问。
先科普一下,什么是非对齐访问

如上图所示,若要访问的变量是int、float、u32类型的(占4字节),则这些变量在内存中,只能以图中0、4、8为起始地址;
若要访问的变量是u16类型的(占2字节),则这些变量在内存中,只能以0、2、4、6、8、10为起始地址;
如上图所示,像*(u16 * )0x20000001这样读取数据的话,在CM0内核的芯片上就会直接进hardfault。
故事是这样的,我用了两片595来驱动数码管,用SPI方式。我想,反正一片595就是一个8位的移位寄存器,每次发送一个u8类型的数据要发送两次,我干嘛不把两个595当成一个16位的移位寄存器,发一个u16类型的数据就好了。所以我就把SPI初始化成这样:
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_1LINE;
hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
和数码管有关的,我还定义了两个结构体
typedef struct
{
u8 buf[4];
u8 no;
} Display_TypeDef;
typedef struct
{
u8 buf[2];
u8 no;
} SPI_LED_TX_TypeDef;
Display_TypeDef Display_structure;
SPI_LED_TX_TypeDef SPILED_TxStructure;
然后定时器中断中,每隔一段时间往595发送数据,代码如下
void TIM1_CC_IRQHandler(void)
{
u16capture = 0;
HAL_TIM_IRQHandler(&htim1);
capture= TIM_GetCapture1(TIM1);
TIM_SetCompare1(TIM1,capture + 10);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
if(Display_structure.no< 4)
{
SPILED_TxStructure.buf[1]= 0x0a;
}
SPILED_TxStructure.buf[0]= 0x0b;
HAL_SPI_Transmit_IT(&hspi1,SPILED_TxStructure.buf,1);
}
除了初始化的代码,就上面这一小段代码,然而一运行,就直接跳到hardfault里面。
这个现象当时让我大为不解。在纠结了两个下午之后,终于知道了问题所在(原谅我第一次遇到hardfault)。
当出现hardfault这类异常时,在调试状态下,点开view中call stack window,如下图:

在HardFault_Handler处右击鼠标,见下图

选择Show Caller,会出现下图,即hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr)这句引起了Hardfault。

知道是哪里引起的就好办了,经过分析,发现*((uint16_t *)hspi->pTxBuffPtr)这里面的hspi->pTxBuffPtr就是指向0x20000005,引发了hardfault。让我们来看一下内存分布:

最后怎么搞定的呢。发现Display_TypeDef这个结构体占了5个字节,SPI_LED_TX_TypeDef这个结构体占了3个字节,把他们定义成如下就OK了:
typedef struct
{
u8 buf[4];
u16 no;
} Display_TypeDef;
typedef struct
{
u8 buf[2];
u16 no;
} SPI_LED_TX_TypeDef;
恩,就写到这里把。坚持把工作遇到的一些问题记录下来。
下一篇:SystemInit()函数详解
史海拾趣
|
EK-STM32F开发板,JP7跳至VBAT端,电池供电。USB供电时RTC准确的,拔掉USB后板上电池供电工作,24小时之后插上USB,时间慢了大约8小时10分钟,拔掉USB后测电池电压,为3.2V,电量应该可以的,请问这是什么原因?… 查看全部问答> |
|
基于PXI总线和LabVIEW技术,构建了无源干扰设备测试诊断系统,可完成无源干扰设备各种功能、性能参数快速、准确地测试,并依据测试结果,进行故障诊断,给出维修策略。硬件平台基于高性价比的PXI,测试程序采用LabVIEW开发,故障诊断程序采用 ...… 查看全部问答> |
|
就是这样的电路图,Proteus中可以到12v,为什么实际中只有4.3v?洞洞板上做了两遍了,都是4.3,参数也是那个网页版计算器得来的,小弟不才,请高手指点一二!… 查看全部问答> |
|
DSP28335+AIC23能收发数据,但数据貌似不对,听起来全是噪声,请教是否硬件问题 我现在使用的硬件是研旭的开发板,软件是TI给的Interfacing the TMS320F2833x to the AIC23B Stereo Audio Codec.zip,改一下控制接口和数据接口。 通过控制接口改变采样率,经过示波器测试,控制接口正常;MCBSP的接收和发送中断都能进去,数据接 ...… 查看全部问答> |
|
第一课 什么是卷积 卷积有什么用 什么是傅利叶变换 什么是拉普拉斯变换 引子很多朋友和我一样,工科电子类专业,学了一堆信号方面的课,什么都没学懂,背了公式考了试,然后毕业了。 先说\"卷积有什么用\"这个问题。(有人抢答,\"卷 ...… 查看全部问答> |




