串口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;
}
问题找到了,原来是我分配给STemWin的内存很大(130kByte),导致串口数据的数组被定义到CCM存储区,而CCM内存只能被CPU访问,DMA和其他外设不能直接访问
如果我把上面的代码放在FreeRTOS的任务里执行,则不会进入Hardfault,但是一个Byte的数据都发不出去。这又是什么情况?:dizzy: :):):):):):):):):):) 本帖最后由 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有点冲突。 学习了~
页:
[1]