什么原因导致STM32程序变大后ADC工作不正常了?

快乐的老鼠 2018-11-22 09:48:44
你们有没有遇到这样的问题,程序貌似超过60多kb后adc转换出来的数据就很奇怪了,我用的是STM32L151系列的;
通过观察寄存器,adc的CR2寄存器发生了变化;




目前解决方法有两种:
① 控制程序不要超过60多kb;
② 强制将CR2寄存器赋值成正确的值;

我想知道问题的根本原因在哪儿,在此等候各位大神的回复~

...全文
1359 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐的老鼠 2019-06-13
  • 打赏
  • 举报
回复
引用 23 楼 weixin_42056347 的回复:
我也遇到了相同的问题。首先,万分感谢您给的解决方案,不知道您知道了问题的根本原因了吗?
还没找到呢,估计我用的是keil510,可能升级下keil这个问题就能解决掉吧,再或者是跟电脑上装了加密有关
weixin_42056347 2019-06-06
  • 打赏
  • 举报
回复
我也遇到了相同的问题。首先,万分感谢您给的解决方案,不知道您知道了问题的根本原因了吗?
Haiguozhe 2019-05-04
  • 打赏
  • 举报
回复
已经64K多了,没有发现ADC工作异常的现象
暖暖的纠结 2018-12-14
  • 打赏
  • 举报
回复 1
我的程序90多k也用了adc没有出现这个问题,但是遇到过类似的。因为当时用了2个ADC,配置上这2个ADC的代码完全是一样的,但是,实际上2个adc却莫名的不相同,后来debug查找后才发现,原来定义结构体变量的时候没有初始化,采用了默认值,但实际上编译的时候却分配了一个莫名得值。所以在函数中定义变量,或者结构体的时候,最好初始化,
失散糖 2018-12-14
  • 打赏
  • 举报
回复
watch一下那个寄存器的地址,用数据断点监视那个地址试试。虽然想这么弄,但是就算是踩内存了,从SRAM踩到PERIPH那也太过分了
诺水城子 2018-12-13
  • 打赏
  • 举报
回复
程序大小是没关系的。只要能编译通过下载进去,运行就没问题。我平时项目中经常是程序大小接近存储极限都没出现过这个问题。好好检查栈操作
熠晨 2018-11-30
  • 打赏
  • 举报
回复
引用 17 楼 靜聽雨落的回复:
引用 16 楼 城子山 的回复:
[quote=引用 14 楼 靜聽雨落 的回复:]
[quote=引用 13 楼 城子山 的回复:]
你这是典型的栈溢出问题。O0编译,是对代码不做任何优化;O1编译是编译时进行了优化,部分问题编译时给你优化了。你这个问题查一下定义的变量以及使用
优化等级对RAM基本上没有影响,另外栈足够大

这样给你说吧,定义一个变量,系统会在栈上开辟一个空间用于存储这个变量,但是在向这个栈空间传的值所占空间大于定义的空间时,这个栈临近的空间会被无意识的改变了[/quote]你说的情况对于有些问题是可以这样分析的,但我的这个非常奇怪,我若删除掉一些无关的语句,减少程序大小后,ADC又正常了,这个怎么看都是编译器的问题,但我又不擅长汇编,所以这个问题我也不太好查.[/quote] 你对比下汇编代码,是不是改了栈的数据,调用函数就会有栈操作
快乐的老鼠 2018-11-30
  • 打赏
  • 举报
回复
引用 16 楼 城子山 的回复:
引用 14 楼 靜聽雨落 的回复:
[quote=引用 13 楼 城子山 的回复:]
你这是典型的栈溢出问题。O0编译,是对代码不做任何优化;O1编译是编译时进行了优化,部分问题编译时给你优化了。你这个问题查一下定义的变量以及使用
优化等级对RAM基本上没有影响,另外栈足够大

这样给你说吧,定义一个变量,系统会在栈上开辟一个空间用于存储这个变量,但是在向这个栈空间传的值所占空间大于定义的空间时,这个栈临近的空间会被无意识的改变了[/quote]你说的情况对于有些问题是可以这样分析的,但我的这个非常奇怪,我若删除掉一些无关的语句,减少程序大小后,ADC又正常了,这个怎么看都是编译器的问题,但我又不擅长汇编,所以这个问题我也不太好查.
诺水城子 2018-11-30
  • 打赏
  • 举报
回复
引用 14 楼 靜聽雨落 的回复:
引用 13 楼 城子山 的回复:
你这是典型的栈溢出问题。O0编译,是对代码不做任何优化;O1编译是编译时进行了优化,部分问题编译时给你优化了。你这个问题查一下定义的变量以及使用
优化等级对RAM基本上没有影响,另外栈足够大

这样给你说吧,定义一个变量,系统会在栈上开辟一个空间用于存储这个变量,但是在向这个栈空间传的值所占空间大于定义的空间时,这个栈临近的空间会被无意识的改变了
诺水城子 2018-11-30
  • 打赏
  • 举报
回复
引用 14 楼 靜聽雨落 的回复:
引用 13 楼 城子山 的回复:
你这是典型的栈溢出问题。O0编译,是对代码不做任何优化;O1编译是编译时进行了优化,部分问题编译时给你优化了。你这个问题查一下定义的变量以及使用
优化等级对RAM基本上没有影响,另外栈足够大

栈溢出跟栈足够大没关系。这个是编程代码规范的问题。举个例子,定义一个char变量a, 然后给个memcpy(&a,"aa",2); 之类的都会导致栈溢出。后面的栈数据会被无意识的给改变了
快乐的老鼠 2018-11-29
  • 打赏
  • 举报
回复
引用 13 楼 城子山 的回复:
你这是典型的栈溢出问题。O0编译,是对代码不做任何优化;O1编译是编译时进行了优化,部分问题编译时给你优化了。你这个问题查一下定义的变量以及使用
优化等级对RAM基本上没有影响,另外栈足够大
快乐的老鼠 2018-11-27
  • 打赏
  • 举报
回复
引用 10 楼 Haiguozhe 的回复:
目前程序40多kb了
等您有机会到64kb以上时候再来光顾我这儿~
诺水城子 2018-11-27
  • 打赏
  • 举报
回复
你这是典型的栈溢出问题。O0编译,是对代码不做任何优化;O1编译是编译时进行了优化,部分问题编译时给你优化了。你这个问题查一下定义的变量以及使用
诺水城子 2018-11-27
  • 打赏
  • 举报
回复
你这不是程序大小的问题。栈溢出的症状
Haiguozhe 2018-11-26
  • 打赏
  • 举报
回复
目前程序40多kb了
worldy 2018-11-26
  • 打赏
  • 举报
回复
应该是你的代码无意改写了该寄存器
fly 100% 2018-11-26
  • 打赏
  • 举报
回复
感觉是栈被破坏了
快乐的老鼠 2018-11-26
  • 打赏
  • 举报
回复
引用 7 楼 hualantech 的回复:
应该是你的代码无意改写了该寄存器
应该没有吧,我只是将优化等级从O0改成O1就都正常了.
快乐的老鼠 2018-11-26
  • 打赏
  • 举报
回复
引用 5 楼 迷雾绿洲 的回复:
感觉是栈被破坏了
不可能,其他功能都正常~
hualantech 2018-11-26
  • 打赏
  • 举报
回复
应该是你的代码无意改写了该寄存器
加载更多回复(4)

27,383

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧