yxz1212_bao 发表于 2015-9-28 15:37:39

串口DMA发送进入Hardfault

这两天在用STM32F429II做串口DMA发送,全速运行时会进入Hardfault。初始化代码是修改正点原子的探索者开发板DMA例程而来的,全速运行时,串口助手能收到一次我发的数据,之后就进入Hardfault了。
我在内层while(1)中设置断点后,每次运行到断点停一下的运行方式,串口助手能够反复收到我发的数据。
用USART1和USART6都有同样的现象。
我在内层while(1)加了点的延时,也没什么用,这种设断点和不设断点的问题很奇怪
请大神帮忙看看这是什么原因?

while(1){
    USART_DMACmd(USART6,USART_DMAReq_Tx,ENABLE);
    MyDMA_Enable(DMA2_Stream6,20);

    while(1)<font color="#ff0000">//这个while中,除了if中的清除标志位的语句以外的语句设置断点,就不会跳到Hardfault</font>
    {
      uint16_t pro = 0;
      if(DMA_GetFlagStatus(DMA2_Stream6,DMA_FLAG_TCIF6)!=RESET)
      {
      DMA_ClearFlag(DMA2_Stream6,DMA_FLAG_TCIF6);<font color="#ff0000">//在除了这行以外的其他地方设置断点,就不会跳到Hardfault</font>
      break;
      }
      pro=DMA_GetCurrDataCounter(DMA2_Stream6);
      pro=1-pro/USART6_TX_MAX_SIZE;
      pro*=100;
   }


yxz1212_bao 发表于 2015-9-30 13:41:11

问题找到了,原来是我分配给STemWin的内存很大(130kByte),导致串口数据的数组被定义到CCM存储区,而CCM内存只能被CPU访问,DMA和其他外设不能直接访问


yxz1212_bao 发表于 2015-9-28 16:27:25

如果我把上面的代码放在FreeRTOS的任务里执行,则不会进入Hardfault,但是一个Byte的数据都发不出去。这又是什么情况?:dizzy:

你好我好大家好! 发表于 2015-9-28 17:05:31

:):):):):):):):):):)

yxz1212_bao 发表于 2015-9-29 17:45:21

本帖最后由 yxz1212_bao 于 2015-9-29 18:12 编辑

1.进入Hardfault的问题找到了,是因为我的SystemTick中断中调用了FreeRTOS的心跳回调函数,
而我又没有开启任务,所以进入SystemTick_Handler()中的xPortSysTickHandler()之后才会进入
Hardfault,屏蔽掉这个就好了,串口DMA没问题。
2.在任务里执行,一个数据都传不出去的问题,是因为系统里还移植了STemWin,初始化函数中调用
GUI_Init()的话,就会出现这个问题。根本原因还不知道,目前我用的是STemWin5.22,准备换成
最新的5.30再试试。
小结下,就是STemWin的初始化函数和串口DMA有点冲突。

guiyi 发表于 2015-9-30 15:56:18

学习了~
页: [1]
查看完整版本: 串口DMA发送进入Hardfault