STM 32用户使用STM32F407芯片开发产品。使用三个内部ADC,其中ADC1和ADC2以ADC双模工作,ADC3独立工作。当代码运行时,解锁闪存后,发现ADC3不起作用(其灾难恢复数据寄存器似乎没有更新,但用于触发模数转换器的定时器TIM2仍然正常),且ADC3配置寄存器CR1和CR2在闪存编程前后没有变化。如果ADC3被重新配置,它将正常工作。
从问题现象来看,初步感觉与flash编程有关。
了解之后,客户确实进行了闪存编程,一些参数需要存储在闪存中。其ADC3由TIM2触发,ADC3的转换结果由直接存储器存取器传送。
有鉴于此,我将提醒他,如果它不是基于双BANK条件,则在闪存编程期间,中央处理器被阻塞,并且如果此时有中断,它将不会接收到响应,所以让他注意这一点以及由此可能导致的问题。
客户进一步反馈确认:
1:模数转换器的结果由直接内存存取法读取,而不是通过中断获得。
2:在2:闪存编程期间禁止所有中断;
3:奇怪的是,当ADC3被软件触发时却没有异常现象。用于触发模数转换器的定时器保持正常计数,并且只要模数转换器3被重新配置(不需要重新配置触发定时器),就可以恢复其正常操作。
首先,让我们谈谈客户提到的闪存编程期间完全中断关机的情况。事实上,从效果的角度来看,这个关闭中断是没有用的,无论如何,即使在闪存编程过程中有一个中断,中央处理器也不会响应。
结合其反馈,软件触发和定时器触发模数转换器之间有一个明显的区别,即定时器的触发对于用户来说通常是未知或不确定的,即具体的触发时间点是未知的。客户一直强调TIM工作正常,并对模数转换器无法触发感到惊讶。
总的来说,根据问题的症状和经验,初步判断ADC3发生了溢出事件,建议客户进一步检查确认。
后来,他的反馈是发生了模数转换器溢出事件。在闪存编程之前暂停TIM2触发可以避免溢出和模数转换器功能异常。
理论上,他的模数转换器的结果是现在的直接内存存取转移。触发直接内存存取时,内存管理器应该能够及时读取数据。为什么会发生溢出?在某个时刻,当模数转换器由时间延迟触发完成转换时,此时的直接存储器存取可能没有准备好,导致模数转换器的结果没有及时被取走。
是什么导致模数转换器的结果没有及时被取走?如果DMA配置为非循环模式,当DMA传输完成一轮数据时,DMA将不会继续进行数据传输。这时,中央处理器通常会进入DMA中断服务程序,做一些必要的处理或为下一轮传输做准备。如果在闪存编程过程中出现这种DMA传输完成中断,这可能会导致问题。由于在此期间无法获得响应,因此无法开始下一次DMA传输。然而,此时TIM仍然像往常一样触发模数转换器。如果结果不能及时消除,自然会导致溢出。
当模数转换器溢出时,如果溢出位未清0,后续模数转换器转换将不会触发直接存储器存取。具体到这种情况,严格来说,客户觉得以后不能读取模数转换器的更新数据,不是因为模数转换器不工作,而是因为它是由定时器触发进行转换的,只是因为溢出,不能正常触发DMA传输,因此不能实现模数转换器结果的传输。
因此,在上述应用情况下,定时器可以在闪存编程之前关闭,然后再打开。或者在DMA传输完成后的中断服务程序中,在重启DMA之前,暂时关闭定时器,检测并行ADC的溢出和错误,然后启动定时器和DMA传输。
防控疫情的需求激发之下,代替人类送药、送餐送菜、消毒巡逻的无人车成了疫情期间的特殊尖兵。疫情过后,无人车配送是否...
2020-03-23 17:12市场分调研机构Omdia的最新数据分析显示,全球智能城市人工智能(AI)软件市场将从6 738亿美元(2019年),在2025年将增长到4...
2020-04-07 17:55现代电测技术日趋成熟,由于具有精度高、便于微机相连实现自动实时处理等优点,已经广泛应用在电气量和非电气量的测量中。
2020-04-07 17:56微软经常在游戏领域开辟路径,扮演开拓者的角色,这一点体现在很多方面,包括微软的尖端技术(DX12终极版 DX光追),硬件(X...
2020-04-07 17:57去年 12 月,波音为美国宇航局发射了未载人的 Starliner 航天器。然而由于技术问题,任务并没有按计划进行。作为 NASA ...
2020-04-07 17:58