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

串口DMA发送进入Hardfault

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

评分

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

查看全部评分

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

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版