打印
[STM32F4]

给407内部FLASH编程时,遇到奇怪的现象。

[复制链接]
984|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yzzly|  楼主 | 2020-3-13 10:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
系统使用内部3个ADC,其中ADC1与ADC2为双ADC模式,ADC3为独立工作;编程时给FLASH加锁(FLASH_Unlock();),然后就发现ADC3不工作了(DR不更新,触发定时器TIM2正常),加锁前后ADC3配置寄存器CR1、CR2没有改变,如果重新配置ADC3则能正常工作。

使用特权

评论回复
沙发
香水城| | 2020-3-13 11:35 | 只看该作者
的确听起来奇怪,你有做flash编程吗?

这种问题没有代码并结合调试的话,别人很难告知为什么。

使用特权

评论回复
板凳
yzzly|  楼主 | 2020-3-13 12:13 | 只看该作者
香水城 发表于 2020-3-13 11:35
的确听起来奇怪,你有做flash编程吗?

这种问题没有代码并结合调试的话,别人很难告知为什么。 ...

做了编程,有一部分参数需要存放在FLASH内!

使用特权

评论回复
地板
香水城| | 2020-3-13 14:54 | 只看该作者
yzzly 发表于 2020-3-13 12:13
做了编程,有一部分参数需要存放在FLASH内!


1、你的ADC3是由TIM触发的,那ADC3的转换结果如何读取的?查询?还是中断方式抑或DMA方式?
2、提醒下,如果不是基于双BANK条件,在flash编程时 CPU是堵塞的,此时若发生中断是不会响应的。

使用特权

评论回复
5
yzzly|  楼主 | 2020-3-13 15:03 | 只看该作者
香水城 发表于 2020-3-13 14:54

1、你的ADC3是由TIM触发的,那ADC3的转换结果如何读取的?查询?还是中断方式抑或DMA方式?
2、提醒下 ...

1:ADC通过DMA读取;
2:FLASH编程时禁止任何中断(__disable_irq();)
3:奇怪的是ADC3改为软件触发,则没有这个现象,触发定时器计数正常啊,并且只要重新配置ADC3(没有重新配置触发定时器TIM2)就能恢复工作。

使用特权

评论回复
6
香水城| | 2020-3-13 15:56 | 只看该作者
yzzly 发表于 2020-3-13 15:03
1:ADC通过DMA读取;
2:FLASH编程时禁止任何中断(__disable_irq();)
3:奇怪的是ADC3改为软件触发,则 ...

软件触发和定时器触发的最大差别 在于 后者的触发对于我们用户来讲 有些未知性,
即不知它具体的触发时间点。

从你反馈的情况来看,说明TIM一直在正常工作。感觉ADC3发生过溢出事件,建议你围绕
这点好好查查代码,

使用特权

评论回复
7
yzzly|  楼主 | 2020-3-13 16:26 | 只看该作者
香水城 发表于 2020-3-13 15:56
软件触发和定时器触发的最大差别 在于 后者的触发对于我们用户来讲 有些未知性,
即不知它具体的触发时间 ...

的确是发生了溢出事件,在FLASH编程前暂停TIM触发则可以避免溢出发生,有没有其它的措施?谢谢!

使用特权

评论回复
8
香水城| | 2020-3-13 16:37 | 只看该作者
本帖最后由 香水城 于 2020-3-13 16:38 编辑
yzzly 发表于 2020-3-13 16:26
的确是发生了溢出事件,在FLASH编程前暂停TIM触发则可以避免溢出发生,有没有其它的措施?谢谢! ...

感觉还有进一步的原因。
按理说你现在ADC结果是DMA传输,TIM触发DMA时应该可以及时读取数据的,怎么还发生了溢出呢?
那就有种可能,在某个时刻,当ADC被TIM触发发生转换后,这时的DMA还没有准备好?

具体原因,还是得结合相关代码才好说。

使用特权

评论回复
9
yzzly|  楼主 | 2020-3-13 17:00 | 只看该作者
香水城 发表于 2020-3-13 16:37
感觉还有进一步的原因。
按理说你现在ADC结果是DMA传输,TIM触发DMA时应该可以及时读取数据的,怎么还发生 ...

很有道理,还得仔细看看,谢谢!

使用特权

评论回复
10
yzzly|  楼主 | 2020-3-13 17:35 | 只看该作者
本帖最后由 yzzly 于 2020-3-13 17:36 编辑
香水城 发表于 2020-3-13 16:37
感觉还有进一步的原因。
按理说你现在ADC结果是DMA传输,TIM触发DMA时应该可以及时读取数据的,怎么还发生 ...

是不是可以这么解释?由于在FLASH编程期间必须关闭所有中断,在编程期间,TIM仍不断的触发ADC,但是DMA在传输完成后不能产生中断(在中断内重新使能DMA),也就不能读取下一批次的ADC结果,所以导致ADC产生溢出事件。

使用特权

评论回复
11
香水城| | 2020-3-13 19:39 | 只看该作者
yzzly 发表于 2020-3-13 17:35
是不是可以这么解释?由于在FLASH编程期间必须关闭所有中断,在编程期间,TIM仍不断的触发ADC,但是DMA在 ...

使用特权

评论回复
12
yzzly|  楼主 | 2020-3-14 09:37 | 只看该作者

有没有优化的方法,还是只能在编程前暂停ADC触发?

使用特权

评论回复
13
香水城| | 2020-3-16 11:52 | 只看该作者
yzzly 发表于 2020-3-14 09:37
有没有优化的方法,还是只能在编程前暂停ADC触发?

既然知道原因了,你结合你的应用自行处理就好。

在FLASH编程前先暂停TIMER也是方便可行的。

如果你不关,可以考虑在DMA完成中断里再暂停定时器,对ADC的溢出和出错做个检测、清零,
之后再开TIMER和DMA也可以。

使用特权

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

本版积分规则

427

主题

1178

帖子

3

粉丝