打印
[STM32F4]

407内部FLASH编程

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

使用特权

评论回复
沙发
jiajs| | 2022-3-6 23:00 | 只看该作者
的确听起来奇怪,你有做flash编程吗?

使用特权

评论回复
板凳
chuxh| | 2022-3-6 23:04 | 只看该作者
这种问题没有代码并结合调试的话,别人很难告知为什么。

使用特权

评论回复
地板
jlyuan|  楼主 | 2022-3-6 23:06 | 只看该作者
做了编程,有一部分参数需要存放在FLASH内!

使用特权

评论回复
5
zhenykun| | 2022-3-6 23:10 | 只看该作者
你的ADC3是由TIM触发的,那ADC3的转换结果如何读取的?

使用特权

评论回复
6
zwll| | 2022-3-6 23:15 | 只看该作者
查询?

使用特权

评论回复
7
zhenykun| | 2022-3-6 23:17 | 只看该作者
还是中断方式抑或DMA方式?

使用特权

评论回复
8
supernan| | 2022-3-6 23:20 | 只看该作者
2、提醒下,如果不是基于双BANK条件,在flash编程时 CPU是堵塞的,此时若发生中断是不会响应的。

使用特权

评论回复
9
jlyuan|  楼主 | 2022-3-6 23:22 | 只看该作者
ADC通过DMA读取;

使用特权

评论回复
10
jlyuan|  楼主 | 2022-3-6 23:25 | 只看该作者
FLASH编程时禁止任何中断(__disable_irq();)

使用特权

评论回复
11
wyjie| | 2022-3-6 23:28 | 只看该作者
奇怪的是ADC3改为软件触发,则没有这个现象,触发定时器计数正常啊,并且只要重新配置ADC3(没有重新配置触发定时器TIM2)就能恢复工作。

使用特权

评论回复
12
zhenykun| | 2022-3-6 23:31 | 只看该作者
软件触发和定时器触发的最大差别 在于 后者的触发对于我们用户来讲 有些未知性,

使用特权

评论回复
13
juventus9554| | 2022-3-6 23:33 | 只看该作者
即不知它具体的触发时间点。

使用特权

评论回复
14
llljh| | 2022-3-6 23:36 | 只看该作者
从你反馈的情况来看,说明TIM一直在正常工作。感觉ADC3发生过溢出事件,建议你围绕
这点好好查查代码,
更多操作

使用特权

评论回复
15
jlyuan|  楼主 | 2022-3-6 23:39 | 只看该作者
的确是发生了溢出事件,在FLASH编程前暂停TIM触发则可以避免溢出发生,有没有其它的措施?谢谢!

使用特权

评论回复
16
huangchui| | 2022-3-6 23:43 | 只看该作者
感觉还有进一步的原因。
按理说你现在ADC结果是DMA传输,TIM触发DMA时应该可以及时读取数据的,怎么还发生了溢出呢?

使用特权

评论回复
17
zwll| | 2022-3-6 23:45 | 只看该作者
那就有种可能,在某个时刻,当ADC被TIM触发发生转换后,这时的DMA还没有准备好?

使用特权

评论回复
18
pengf| | 2022-3-6 23:49 | 只看该作者
具体原因,还是得结合相关代码才好说。

使用特权

评论回复
19
jlyuan|  楼主 | 2022-3-6 23:50 | 只看该作者
是不是可以这么解释?由于在FLASH编程期间必须关闭所有中断,在编程期间,TIM仍不断的触发ADC,但是DMA在传输完成后不能产生中断(在中断内重新使能DMA),也就不能读取下一批次的ADC结果,所以导致ADC产生溢出事件。

使用特权

评论回复
20
xxrs| | 2022-3-6 23:52 | 只看该作者
有没有优化的方法,还是只能在编程前暂停ADC触发?

使用特权

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

本版积分规则

880

主题

12030

帖子

4

粉丝