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

[复制链接]
3219|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的初始化代码如下:
  1. GPIO_InitTypeDef  GPIO_InitStructure;
  2.         USART_InitTypeDef USART_InitStructure;
  3.         NVIC_InitTypeDef NVIC_InitStructure;
  4.        
  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);

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

  8.         /* Configure the NVIC Preemption Priority Bits */  
  9.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  10.        
  11.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;   
  12.         NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;                
  13.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  14.         NVIC_Init(&NVIC_InitStructure);
  15.   
  16.         /* RXD */
  17.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  18.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  19.   GPIO_Init(GPIOA, &GPIO_InitStructure);   

  20.         /* TXD */
  21.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  22.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  23.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  24.   GPIO_Init(GPIOA, &GPIO_InitStructure);

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

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

  4.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |
  5.                          RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG |
  6.                          RCC_APB2Periph_AFIO, ENABLE);

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

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

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

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

  28. FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
  29.   FSMC_NORSRAMTimingInitTypeDef  p;

  30. /*-- FSMC Configuration ------------------------------------------------------*/
  31. /*----------------------- SRAM Bank 4 ----------------------------------------*/
  32.   /* FSMC_Bank1_NORSRAM4 configuration */
  33.   p.FSMC_AddressSetupTime = 0;
  34.   p.FSMC_AddressHoldTime = 0;
  35.   p.FSMC_DataSetupTime = 1;
  36.   p.FSMC_BusTurnAroundDuration = 0;
  37.   p.FSMC_CLKDivision = 0;
  38.   p.FSMC_DataLatency = 0;
  39.   p.FSMC_AccessMode = FSMC_AccessMode_A;

  40.   /* Color LCD configuration ------------------------------------
  41.      LCD configured as follow:
  42.         - Data/Address MUX = Disable
  43.         - Memory Type = SRAM
  44.         - Data Width = 16bit
  45.         - Write Operation = Enable
  46.         - Extended Mode = Enable
  47.         - Asynchronous Wait = Disable */
  48.   FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;
  49.   FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
  50.   FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
  51.   FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
  52.   FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
  53.   FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
  54.   FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
  55.   FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
  56.   FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
  57.   FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
  58.   FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
  59.   FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
  60.   FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
  61.   FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;

  62.   FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  

  63.   /* BANK 4 (of NOR/SRAM Bank 1~4) is enabled */
  64.   FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
  1. Delay_10ms(5);                                                         /* delay 50 ms */
  2. /* Start Initial Sequence ----------------------------------------------------*/
  3.   LCD_WriteReg(R229,0x8000); /* Set the internal vcore voltage */
  4.   LCD_WriteReg(R0,  0x0001); /* Start internal OSC. */
  5. ...
      
        
 楼主| 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中断?
 楼主| chengfei21 发表于 2014-8-29 20:32 | 显示全部楼层
zxb1717 发表于 2014-8-29 16:57
"当打开UART1的TC和RXNE中断后,再初始化FSMC进行LCD初始化时,就进入了HardFault_Handle,"
能否等FSMC进 ...

谢谢提醒,根据您的建议,问题已经得到解决。
但不知为何会出现这种情况?
 楼主| chengfei21 发表于 2014-8-29 20:32 | 显示全部楼层
zxb1717 发表于 2014-8-29 16:51
先排除引脚是否有公用现象

已经确认引脚没有复用的情况,问题已经在4楼的建议下得到解决,谢谢关注。
 楼主| chengfei21 发表于 2014-8-29 20:34 | 显示全部楼层
不知道为什么要先设置好FSMC,再打开UART的中断,哪位大虾解释下?
hudi008 发表于 2014-8-29 23:27 | 显示全部楼层
初始化的问题吧
hudi008 发表于 2014-8-29 23:27 | 显示全部楼层
看看软件运算是不是太多了
hudi008 发表于 2014-8-29 23:28 | 显示全部楼层
发代码看看的
51xlf 发表于 2014-8-29 23:56 | 显示全部楼层
读写错了可能
51xlf 发表于 2014-8-29 23:57 | 显示全部楼层
代码溢出了吧
 楼主| chengfei21 发表于 2014-8-30 18:48 | 显示全部楼层
谢谢楼上的各位回复,代码很短也没有复杂的运算,4楼已经告知了答案,但不知道为什么要这样操作?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

10

主题

287

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部