现象描述
1、板子焊接好后安装上电池3v(纽扣电池),非充电的。
2、用万用表量量电池电压 3v没问题,但VBAT端电压则只有1点多v
3、将目标板上电(没有下载任何程序),再断电,则VBAT端电压正常。
4、试验我n多板子,结论同上。
5、不安装电池先给板子上电,再断电,再安装电池,现象同上。
疑问:
1、为什么会出现以上现象,这样生产出来的板子,没上电前,很容易将电池电耗光
2、是不是换上电池后都要马上上电。
3、哪里来的这么大的漏电流?
附图:
[img]file:///C:/Users/zhangyun/AppData/Local/Temp/9X9UZ@BWZ1P%25J@%25[(%60BWFJM.jpg[/img]
什么芯片型号?
最好贴一张照片,我根据生产编号去查一查。当然,如果你能找供应商咨询,可能可以更快得到结果。
芯片照片?型号STM32F103VCT6 Z
22 CNY 93
MLT HP 017
供货倒是正规渠道,只不过是中间商,不是一级代理商。估计咨询也没有,他们只懂贸易而已。买了500片。以后是不是可以从你那里进货啊?
从我这里进货? ST不做直销,都是通过代理商销售的。
趁你在线,再讨论个问题,经我验证,发现中断也有个bug,清中断标志后必须再另加一个语句,否则中断进2次,当然第二次进去你是查不到标志的。通讯,dma tim 中断都是这样。很容易验证的
趁你在线,再讨论个问题,经我验证,发现中断也有个bug,清中断标志后必须再另加一个语句,否则中断进2次,当然第二次进去你是查不到标志的。通讯,dma tim 中断都是这样。很容易验证的 ...
这么多人用STM32,我是第一次听说有这个问题,肯定是你哪里搞错了。
绝对的,我保证。因为是第一次用,我测试比较细,而且很好验证,但不影响应用,一般人可能不注意
void TIM6_IRQHandler(void) //1ms
{
ms_100_cntdbu++;
if ((TIM6->SR & 0x0001) != 0) // check interrupt source
{
ms_100_cnt++;
TIM6->SR &= ~(1<<0); // clear UIF flag
}
}
这2值不等的 ms_100_cntdbu ms_100_cn
TIM6->SR &= ~(1<<0); 这条语句不能是最后一条,否则就会再进一次中断,但标志没置位。通过输出管脚或者一个计数,很容易看到。只要TIM6->SR &= ~(1<<0); 再加一条语句,就行了。串口 和 dma都是这样。因为多进的这次查不到标志,一般人不容易注意。估计和指令流水线有关。
其它中断也是如此,我测的应该比较细了,先清没问题的,清完随便加点垃圾也没问题,只是不能是最后清。
用库函数的也没问题,原因同上。很久以前其它的芯片我也发现过类似问题。
我没有软件模拟,软件模拟应该没问题。实际运行肯定是这样子了。
关于中断的问题,我不认为是Bug,也许像你说的,与指令流水线有关。
因为从来都是先清中断标志再处理中断,所以没有人注意到这个(当然还需要验证)。
请问为什么一定要处理完中断在清中断标志呢?
1、“从来都是先清中断标志再处理中断”,这个有点绝对了,你看看3.3的库,例程中的中断处理,倒是很少是先清中断标志再处理的。
2、处理完清中断的目的和中断处理的内容有关。
a如果进去就清,在没有退出中断时,又来中断,可以将中断悬挂起来,下次再进,不会丢(仅限一次)。
最后清的目的,是减少中断次数,一般退出前还要查标志,处理好了,请标志退出,提高效率。
b当然对定时器中断之类的无所谓的。但对外部中断,比如要某些响应事件,一般都是后面清(一些soe时间处理)。
c另外中断处理程序比较长一般也是后面清中断的(少进中断,提高效率),看具体的应用了。
d如果n个中断源共用一个中断,也会出现后清的时候,比如定时器3的就有多个中断源。再比如多个管脚共用一个外部中断,不管谁引起的,都要处理所有的,然后统一清掉,如果先请,就要丢中断了。另外就是,一般严谨的处理即使你没有开放你没有用到的中断源,也会叫上标志判断,加上处理(空),清中断(就像中断处理原型是的,理论上永远不会进,但也加上处理)。这样也会出会出现最后清的时候。
你有时间验证一下这个问题。
3、 但不管怎样,我认为这是个bug(如果你验证和我说的一样的话),否则就应该再勘误表上说明,因为手册上并没说明或者提到必须先清中断再处理。
4、有的芯片是进行读操作的动作就清标志了,那是先清了。
另外VBAT的事情还请你关心
当然了,这个问题很好处理,知道就行,提出来的目的是希望把这些问题能够汇总到你那里,供别人参考。了解了就好处理,我是就怕程序超出我的预期。
回家吃饭了。下次在探讨。
另外就是我下周有个小批量,关于VBAT的事情还请指教!
多谢!
arm好像有这个例子,不知道对不对,在这里说一下,就说写一个内存的时候,最后的写要写两次才能真正的写入,你可以查看一下指令集关于写内存方面的说明,我只是提出这个观点,欢迎大家探讨。