打印
[STM32F1]

开启UART中断,使用FSMC驱动LCD后,程序进入HardFault_Handle

[复制链接]
2754|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chengfei21|  楼主 | 2014-8-28 20:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
        芯片是STM32F103ZE,开发板是百为的,FSMC驱动外部的LCD代码也是百为提供的。
        程序中使用了UART1(PA9和PA10口),用FSMC驱动外部的LCD,发现一个奇怪的问题,当打开UART1的TC和RXNE中断后,再初始化FSMC进行LCD初始化时,就进入了HardFault_Handle,当我取消UART1的TC和RXNE中端使能后,LCD显示就正常了。
        还请高手帮我解答,谢谢。
        UART1的初始化代码如下:
GPIO_InitTypeDef  GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);

        /*Enable the USART1 Interrupt(使能USART1中断)*/
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

        /* Configure the NVIC Preemption Priority Bits */  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
       
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;   
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;                
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
  
        /* RXD */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);   

        /* TXD */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

        USART_InitStructure.USART_BaudRate = BAUD;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_Init(USART1, &USART_InitStructure);
       
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                                                //接收到数据中断
        USART_ITConfig(USART1, USART_IT_TC, ENABLE);                                                        //传输完成中断
       
        USART_Cmd(USART1, ENABLE);                                                                                                                                //UART1使能
       LCD和FSMC部分初始化代码如下:
GPIO_InitTypeDef GPIO_InitStructure;

  /* Enable FSMC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |
                         RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG |
                         RCC_APB2Periph_AFIO, ENABLE);

  /* Set PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.08(D13), PD.09(D14),
     PD.10(D15), PD.14(D0), PD.15(D1) as alternate
     function push pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |
                                GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 |
                                GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  /* Set PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10),
     PE.14(D11), PE.15(D12) as alternate function push pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
                                GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |
                                GPIO_Pin_15;
  GPIO_Init(GPIOE, &GPIO_InitStructure);

  /* Set PF.00(A0 (RS)) as alternate function push pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_Init(GPIOF, &GPIO_InitStructure);

  /* Set PG.12(NE4 (LCD/CS)) as alternate function push pull - CE3(LCD /CS) */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_Init(GPIOG, &GPIO_InitStructure);

FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
  FSMC_NORSRAMTimingInitTypeDef  p;

/*-- FSMC Configuration ------------------------------------------------------*/
/*----------------------- SRAM Bank 4 ----------------------------------------*/
  /* FSMC_Bank1_NORSRAM4 configuration */
  p.FSMC_AddressSetupTime = 0;
  p.FSMC_AddressHoldTime = 0;
  p.FSMC_DataSetupTime = 1;
  p.FSMC_BusTurnAroundDuration = 0;
  p.FSMC_CLKDivision = 0;
  p.FSMC_DataLatency = 0;
  p.FSMC_AccessMode = FSMC_AccessMode_A;

  /* Color LCD configuration ------------------------------------
     LCD configured as follow:
        - Data/Address MUX = Disable
        - Memory Type = SRAM
        - Data Width = 16bit
        - Write Operation = Enable
        - Extended Mode = Enable
        - Asynchronous Wait = Disable */
  FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;
  FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
  FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
  FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
  FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
  FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
  FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
  FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
  FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
  FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
  FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;

  FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  

  /* BANK 4 (of NOR/SRAM Bank 1~4) is enabled */
  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
Delay_10ms(5);                                                         /* delay 50 ms */
/* Start Initial Sequence ----------------------------------------------------*/
  LCD_WriteReg(R229,0x8000); /* Set the internal vcore voltage */
  LCD_WriteReg(R0,  0x0001); /* Start internal OSC. */
...
      
        
沙发
chengfei21|  楼主 | 2014-8-29 07:41 | 只看该作者
自己顶一下。

使用特权

评论回复
板凳
zxb1717| | 2014-8-29 16:51 | 只看该作者
先排除引脚是否有公用现象

使用特权

评论回复
地板
zxb1717| | 2014-8-29 16:57 | 只看该作者
"当打开UART1的TC和RXNE中断后,再初始化FSMC进行LCD初始化时,就进入了HardFault_Handle,"
能否等FSMC进行LCD初始化完了后再打开UART1的TC和RXNE中断?

使用特权

评论回复
5
chengfei21|  楼主 | 2014-8-29 20:32 | 只看该作者
zxb1717 发表于 2014-8-29 16:57
"当打开UART1的TC和RXNE中断后,再初始化FSMC进行LCD初始化时,就进入了HardFault_Handle,"
能否等FSMC进 ...

谢谢提醒,根据您的建议,问题已经得到解决。
但不知为何会出现这种情况?

使用特权

评论回复
6
chengfei21|  楼主 | 2014-8-29 20:32 | 只看该作者
zxb1717 发表于 2014-8-29 16:51
先排除引脚是否有公用现象

已经确认引脚没有复用的情况,问题已经在4楼的建议下得到解决,谢谢关注。

使用特权

评论回复
7
chengfei21|  楼主 | 2014-8-29 20:34 | 只看该作者
不知道为什么要先设置好FSMC,再打开UART的中断,哪位大虾解释下?

使用特权

评论回复
8
hudi008| | 2014-8-29 23:27 | 只看该作者
初始化的问题吧

使用特权

评论回复
9
hudi008| | 2014-8-29 23:27 | 只看该作者
看看软件运算是不是太多了

使用特权

评论回复
10
hudi008| | 2014-8-29 23:28 | 只看该作者
发代码看看的

使用特权

评论回复
11
51xlf| | 2014-8-29 23:56 | 只看该作者
读写错了可能

使用特权

评论回复
12
51xlf| | 2014-8-29 23:57 | 只看该作者
代码溢出了吧

使用特权

评论回复
13
chengfei21|  楼主 | 2014-8-30 18:48 | 只看该作者
谢谢楼上的各位回复,代码很短也没有复杂的运算,4楼已经告知了答案,但不知道为什么要这样操作?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:IC测试与应用 电子秤芯片/计量芯片/时钟芯片

10

主题

287

帖子

2

粉丝