2014-01-15 29 views
1

當我在閃存設備使用此結構後,它工作正常,但重新啓動(開機/關機)使用此結構(分配給任何位)後會導致HardFault irq。我使用Keil uVision和STM32F205。爲什麼它不起作用?以及我應該更改/刪除/添加以修復它?直接使用GPIOC-> ODR不會引起任何問題Kail中的位域有什麼問題?重新啓動後位字段keil硬故障

#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(); 
} 

回答

0

在文件 '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%.8X\r\n",hardfault_args[0]);   
    printf("R1 = 0x%.8X\r\n",hardfault_args[1]);   
    printf("R2 = 0x%.8X\r\n",hardfault_args[2]);   
    printf("R3 = 0x%.8X\r\n",hardfault_args[3]);   
    printf("R12 = 0x%.8X\r\n",hardfault_args[4]);   
    printf("LR = 0x%.8X\r\n",hardfault_args[5]);   
    printf("PC = 0x%.8X\r\n",hardfault_args[6]);   
    printf("PSR = 0x%.8X\r\n",hardfault_args[7]);   
    printf("BFAR = 0x%.8X\r\n",*(unsigned int*)0xE000ED38); 
    printf("CFSR = 0x%.8X\r\n",*(unsigned int*)0xE000ED28); 
    printf("HFSR = 0x%.8X\r\n",*(unsigned int*)0xE000ED2C); 
    printf("DFSR = 0x%.8X\r\n",*(unsigned int*)0xE000ED30); 
    printf("AFSR = 0x%.8X\r\n",*(unsigned int*)0xE000ED3C); 
    printf("SHCSR = 0x%.8X\r\n",SCB->SHCSR);     
    while (1); 
} 

如果你不能在執行過程中的點使用printf當該特定硬故障中斷髮生,然後保存所有上面的數據在全局緩衝區中,所以你可以在到達while (1)後查看它。

然後,請參閱http://www.keil.com/appnotes/files/apnt209.pdf上的'Cortex-M Fault Exceptions and Registers'部分以瞭解該問題,或者如果需要進一步的幫助,請在此處發佈輸出。