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