位字段 keil 重新启动后硬故障
Bit fields keil hardfault after restarting
当我在刷新设备后使用此结构时,它工作正常,但是重新启动(电源开/关)后使用此结构(分配给任何位)会导致硬故障 irq。我使用Keil uVision和STM32F205。为什么它不起作用?我应该更改/删除/添加什么来修复它?直接使用 GPIOC->ODR 不会造成任何问题 Kail 中的位域有什么问题?
#pragma anon_unions
typedef union {
struct {
__IO uint16_t Data_Bus:8; // 0-7 data bus
__IO uint16_t Ctr_Pins:6; // 8-13 control pins
__IO uint16_t :2; // 14-15 unused here
};
struct {
__IO uint16_t D0:1; // 0 data bus pin
__IO uint16_t D1:1; // 1 data bus pin
__IO uint16_t D2:1; // 2 data bus pin
__IO uint16_t D3:1; // 3 data bus pin
__IO uint16_t D4:1; // 4 data bus pin
__IO uint16_t D5:1; // 5 data bus pin
__IO uint16_t D6:1; // 6 data bus pin
__IO uint16_t D7:1; // 7 data bus pin
// --------------------------------
__IO uint16_t RS:1; // 8 reset
__IO uint16_t CS:1; // 9 chip select
__IO uint16_t CD:1; // 10 control / data
__IO uint16_t RD:1; // 11 read tick
__IO uint16_t WR:1; // 12 write tick
__IO uint16_t EN:1; // 13 enable display
// ---------------------------------
__IO uint16_t :1; // 14 unused
__IO uint16_t LD:1; // 15 led
};
} *PC_STRUCT_PTR, PC_STRUCT;
PC_STRUCT_PTR __TMP = (PC_STRUCT_PTR)(GPIOC_BASE+0x14);
#define PINOUTS (*__TMP)
它是这样用的:
void Write_Reg(unsigned char command)
{
PINOUTS.CD = 0; PINOUTS.RD = 1; PINOUTS.CS = 0; PINOUTS.WR = 0;
PINOUTS.Data_Bus = command; wait();
PINOUTS.WR = 1; PINOUTS.CS = 1; PINOUTS.CD = 1; wait();
}
在文件 'startup_stm32f20x.s' 中,确保您有以下代码段:
EXTERN HardFault_Handler_C ; this declaration is probably missing
__tx_vectors ; this declaration is probably there
DCD HardFault_Handler
然后,在同一文件中,添加以下中断处理程序(所有其他处理程序所在的位置):
PUBWEAK HardFault_Handler
SECTION .text:CODE:REORDER(1)
HardFault_Handler
TST LR, #4
ITE EQ
MRSEQ R0, MSP
MRSNE R0, PSP
B HardFault_Handler_C
然后,在文件"stm32f2xx.c"中,添加以下 ISR:
void HardFault_Handler_C(unsigned int* hardfault_args)
{
printf("R0 = 0x%.8Xrn",hardfault_args[0]);
printf("R1 = 0x%.8Xrn",hardfault_args[1]);
printf("R2 = 0x%.8Xrn",hardfault_args[2]);
printf("R3 = 0x%.8Xrn",hardfault_args[3]);
printf("R12 = 0x%.8Xrn",hardfault_args[4]);
printf("LR = 0x%.8Xrn",hardfault_args[5]);
printf("PC = 0x%.8Xrn",hardfault_args[6]);
printf("PSR = 0x%.8Xrn",hardfault_args[7]);
printf("BFAR = 0x%.8Xrn",*(unsigned int*)0xE000ED38);
printf("CFSR = 0x%.8Xrn",*(unsigned int*)0xE000ED28);
printf("HFSR = 0x%.8Xrn",*(unsigned int*)0xE000ED2C);
printf("DFSR = 0x%.8Xrn",*(unsigned int*)0xE000ED30);
printf("AFSR = 0x%.8Xrn",*(unsigned int*)0xE000ED3C);
printf("SHCSR = 0x%.8Xrn",SCB->SHCSR);
while (1);
}
如果无法在此特定硬故障中断发生的执行点使用 printf
,请将上述所有数据保存在全局缓冲区中,以便在到达while (1)
后可以查看它。
然后,请参阅 http://www.keil.com/appnotes/files/apnt209.pdf 的"Cortex-M 故障异常和寄存器"部分以了解问题,或者如果您需要进一步的帮助,请在此处发布输出。
相关文章:
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- 如何使用 ctypes 停止和重新启动从 Python 运行的C++代码
- 重新启动后,线程无法在 while 循环中再次运行
- 在程序和基于文本的游戏和C++内重新启动程序
- 在程序/基于文本的游戏/C++内重新启动程序
- 为什么使用 exec() 重新启动程序不能正常工作?
- 即使在我关闭应用程序并重新启动它后,如何保持我的 ID 被阻止?
- 有没有办法在不重新启动或注销的情况下加载游标?
- IO服务重新启动后,Boost最后期限计时器持续触发
- 在C++中重新启动随机数序列
- 稍后在构造函数中重新启动异常指令删除此指令
- 如何获取代码::块以在代码::块重新启动后保持库的配置?
- 我想在我设置的几秒钟后重新启动我的程序
- 如何使重新启动此循环,当用户输入 1 时,并在 0 时停止
- UDP 服务器每 5 秒重新启动一次
- C++堆溢出会导致硬故障
- 有没有办法检查内存缓存是否已重新启动?
- (Windows 10) 在不更新的情况下重新启动C++
- 位字段 keil 重新启动后硬故障
- 在__lib_init_array中,CC2538 (Cortex m3)启动时出现硬故障