你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

串口DMA发送进入Hardfault

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

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

  4.     while(1)<font color="#ff0000">//这个while中,除了if中的清除标志位的语句以外的语句设置断点,就不会跳到Hardfault</font>
  5.     {
  6.         uint16_t pro = 0;
  7.         if(DMA_GetFlagStatus(DMA2_Stream6,DMA_FLAG_TCIF6)!=RESET)
  8.         {
  9.         DMA_ClearFlag(DMA2_Stream6,DMA_FLAG_TCIF6);<font color="#ff0000">//在除了这行以外的其他地方设置断点,就不会跳到Hardfault</font>
  10.         break;
  11.         }
  12.         pro=DMA_GetCurrDataCounter(DMA2_Stream6);
  13.         pro=1-pro/USART6_TX_MAX_SIZE;
  14.         pro*=100;
  15.      }
复制代码



收藏 评论5 发布时间:2015-9-28 15:37

举报

5个回答
bao124 回答时间:2015-9-30 13:41:11
问题找到了,原来是我分配给STemWin的内存很大(130kByte),导致串口数据的数组被定义到CCM存储区,而CCM内存只能被CPU访问,DMA和其他外设不能直接访问
内存映射.png

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 结贴奖励

查看全部评分

bao124 回答时间:2015-9-28 16:27:25
如果我把上面的代码放在FreeRTOS的任务里执行,则不会进入Hardfault,但是一个Byte的数据都发不出去。这又是什么情况?
你好我好大家好! 回答时间:2015-9-28 17:05:31
bao124 回答时间: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有点冲突。
皈依 回答时间:2015-9-30 15:56:18
学习了~

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版