[STM32H7]

STM32H7 IAR函数形参影响程序功能 奇怪问题

[复制链接]
楼主: FAQ
手机看帖
扫描二维码
随时随地手机跟帖
FAQ|  楼主 | 2019-12-6 15:33 | 显示全部楼层
steelen 发表于 2019-12-6 15:23
2个函数是一起用的?还是单独用的
IAR的优化有时候不靠谱的

cache开了,mpu也设置了,难道是cache和mpu的问题?

实际上我也怀疑过cache和mpu,到目前为止我都还没有搞清楚cache和mpu的原理和用法,只是照搬例子代码,修改为已用。

会不会是cache和mpu的问题?cache和mpu之前的F1系列的单片机没有,到了这种高级点的单片机带cache和mpu的感觉坑好多,总感觉奇奇怪怪的。

代码如下:
void CPU_CACHE_Enable(void)
{
  /* Enable I-Cache */
  SCB_EnableICache();
  
  /* Enable D-Cache */
  SCB_EnableDCache();
}

void MPU_Config(void)
{
  MPU_Region_InitTypeDef MPU_InitStruct;
  
  /* Disable the MPU */
  HAL_MPU_Disable();
  
  /* Configure the MPU attributes as WT for SRAM */
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.BaseAddress = 0x60000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_256MB;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  MPU_InitStruct.SubRegionDisable = 0x00;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  
  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  
  /* Enable the MPU */
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}

使用特权

评论回复
steelen| | 2019-12-6 17:45 | 显示全部楼层
可能是CACHE问题

使用特权

评论回复
FAQ|  楼主 | 2019-12-6 20:07 | 显示全部楼层

CACHE注释了也不行啊

void CPU_CACHE_Enable(void)
{
  /* Enable I-Cache */
// SCB_EnableICache();
  
  /* Enable D-Cache */
// SCB_EnableDCache();
}

使用特权

评论回复
FAQ|  楼主 | 2019-12-6 21:47 | 显示全部楼层

问题又进一步研究情况:我发现必须写个带形参函数,如果函数不带形参,或者干脆删除这个函数都会导致后面的程序功能不正常,后面的程序功能是FMC读写16bit LCD,这个带形参的函数功能和FMC 驱动LCD用的引脚没有任何软硬件干涉,但是一旦没有这个带形参的函数就里面不能正常FMC读写LCD

好奇怪啊。从未遇到这种奇怪情况

使用特权

评论回复
雪山飞狐D| | 2019-12-6 23:45 | 显示全部楼层
本帖最后由 雪山飞狐D 于 2019-12-6 23:47 编辑

  M3的C语言转汇编前三个形参会默认调用内核寄存器R0-R3,也就是说形参会赋值给R0-R3,可能这样跟某些库深度优化的汇编冲突了

使用特权

评论回复
憨厚诚实大叔| | 2019-12-8 13:15 | 显示全部楼层
我用STM32F4,也发现类似的问题,就是这么坑,然后项目比较赶,我也就不在意这些细节了。印象中,初始化封装成函数和直接大杂烩写一起的问题,前者初始化不成功,不过现在用STM32CubeMX初始化,然后直接用寄存器操作,就没再遇到这些蛋疼的问题了。
STM32没意思,在抽空学linux中

使用特权

评论回复
LMCH| | 2019-12-8 15:28 | 显示全部楼层
如果换个IDE编译呢?

使用特权

评论回复
steelen| | 2019-12-10 10:03 | 显示全部楼层
堆栈大小设置了没有?堆栈定位到哪里了?
可能是堆栈问题

使用特权

评论回复
FAQ|  楼主 | 2019-12-10 12:47 | 显示全部楼层
steelen 发表于 2019-12-10 10:03
堆栈大小设置了没有?堆栈定位到哪里了?
可能是堆栈问题

设置了啊,调大调小都试了,没用,我也怀疑是堆栈错误。

使用特权

评论回复
FAQ|  楼主 | 2019-12-10 12:48 | 显示全部楼层
steelen 发表于 2019-12-10 10:03
堆栈大小设置了没有?堆栈定位到哪里了?
可能是堆栈问题

怀疑入栈出栈过程中出现问题了

使用特权

评论回复
steelen| | 2019-12-11 09:40 | 显示全部楼层
会不会是芯片本身的BUG ?

使用特权

评论回复
FAQ|  楼主 | 2019-12-11 14:51 | 显示全部楼层
steelen 发表于 2019-12-11 09:40
会不会是芯片本身的BUG ?

不敢轻易怀疑芯片本身bug,但也不排除芯片本身bug。

使用特权

评论回复
heisexingqisi| | 2019-12-11 15:11 | 显示全部楼层
楼主,你用Keil试试看,我从来没遇到过这个问题,你别用IAR了,用keil试试看

使用特权

评论回复
heisexingqisi| | 2019-12-11 15:11 | 显示全部楼层
搞不好是IAR编译器缺陷。

使用特权

评论回复
heisexingqisi| | 2019-12-11 15:11 | 显示全部楼层
因为你说了,带个参数就他妈好了。

使用特权

评论回复
heisexingqisi| | 2019-12-11 15:11 | 显示全部楼层
这说明芯片本身是没问题的,是在编译过程出错了。

使用特权

评论回复
bjxdylzsts| | 2020-5-9 11:12 | 显示全部楼层
你好,我最近也在用H7和IAR8.2,发现些奇怪的问题;首先是register的寄存器是芯片实际的寄存器定位有出入,比如ETH的寄存器,和cpu实际的完全弄乱了。然后发现cpu寄存器运行时有时候,Rn寄存器有时候会乱跳。我也没开cache;堆栈也够大;请问你这个问题后来找到原因了么?

使用特权

评论回复
FAQ|  楼主 | 2020-5-9 11:37 | 显示全部楼层
bjxdylzsts 发表于 2020-5-9 11:12
你好,我最近也在用H7和IAR8.2,发现些奇怪的问题;首先是register的寄存器是芯片实际的寄存器定位有出入, ...

我的这个问题还没有解决, 一直丢在一边。

使用特权

评论回复
bjxdylzsts| | 2020-5-9 14:30 | 显示全部楼层
FAQ 发表于 2020-5-9 11:37
我的这个问题还没有解决, 一直丢在一边。

我的后来看了 好像实际的地址是对的;执行也正常,估计是函数调用层次太多;iar显示乱了。打开iar的编译看到的地址就没问题。

使用特权

评论回复
FAQ|  楼主 | 2021-10-28 11:10 | 显示全部楼层
mintspring 发表于 2019-12-5 19:47
听你这么讲,我也是觉得很奇怪,之前没遇到过类似情况。期待楼主研究出来是哪儿的问题。因为是H7比较新,会 ...

破案了,时隔近两年,发现是TFT的复位脚对应STM32输出脚设置成了开漏输出了,应该有上拉电阻或者直接设置成推挽输出也可以。否则TFT不能正常复位,就不能正常显示。这个是根本原因。但是到现在依然还是搞不懂和函数有没有形参有什么关系。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则