Jetzt muss ich auch mal die werte Forengemeinde um Hilfe bitten:
Ich bin dabei ein eigenes Board (4-L Multilayer) mit einem STM32L152V8T6
in Betrieb zu nehmen. Bei der Schaltung kommt es auf extrem niedrige
Stromaufnahme an, daher auch die Wahl des Controllers. Vorab getestet
mit dem ST STM32L152c-discovery board (da ist der kleinere Bruder
(64pin) verbaut. die mitgelieferte Demosoftware zeigt u.A. Stromaufnahme
in verschiedenen Modi
Mein eigenes Board benimmt sich dagegen als Vielfrass:
Discovery eigenes
Run 700uA 2.3mA
Sleep 240uA 1.9mA
LP Run 7.3uA 53uA
LP Sleep 3.6uA 53uA
Software ist die gleiche drauf, bei meinem Board ist nichts am
Controller angeschlossen (ausser Block C's) und ein Taster, equivalent
zum Discovery.
der Controller auf meinem Board lässt sich normal ansprechen und tut
auch...
bis auf die Stromaufnahme. Es kann nur am Chip liegen, beim Board ohne
Chip (nur die C's) fließt auch kein Strom. Hat einer vieleicht noch eine
Idee ?
War da der Debugger noch angeschlossen? Der verfälscht die Strommessung.
Du machst nichts, was im Errata-Sheet erwähnt wird? http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00278726.pdf Wie sieht die Spannungsversorgung aus? Derselbe Step-Down/LDO wie auf dem Discovery, dieselbe Spannung (z.B. 1,65V)? Derselbe Takt nach Initialisierung?
1 | #include "stm32f1xx.h" |
2 | static char text[255]; |
3 | RCC_ClocksTypeDef Clocks; |
4 | |
5 | void init(void) { |
6 | SystemInit(); // Initialize the System |
7 | |
8 | GPIO_InitTypeDef GPIO_InitStructure; |
9 | USART_InitTypeDef USART_InitStruct; |
10 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); |
11 | RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); |
12 | |
13 | // UART1: Configure PA9 and PA10
|
14 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; |
15 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; |
16 | GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; |
17 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; |
18 | GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; |
19 | GPIO_Init(GPIOA, &GPIO_InitStructure); |
20 | |
21 | GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1); |
22 | GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1); |
23 | |
24 | USART_InitStruct.USART_BaudRate = 57600; |
25 | USART_InitStruct.USART_WordLength = USART_WordLength_8b; |
26 | USART_InitStruct.USART_StopBits = USART_StopBits_1; |
27 | USART_InitStruct.USART_Parity = USART_Parity_No; |
28 | USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; |
29 | USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; |
30 | USART_Init(USART1, &USART_InitStruct); |
31 | USART_Cmd(USART1, ENABLE); |
32 | |
33 | |
34 | RCC_GetClocksFreq(&Clocks); |
35 | }
|
36 | |
37 | void uart_tx(char *out) { |
38 | while (*out) { |
39 | while(!(USART1->ISR & USART_FLAG_TXE)) { |
40 | // Nothing, really.;
|
41 | }
|
42 | USART1->TDR = *out++; |
43 | }
|
44 | }
|
45 | |
46 | int main (void) { |
47 | init(); |
48 | |
49 | sprintf(text, "STM32F1xx-Test begins.\r\nHCLK is %ld MHz, PCLK %ld MHz, System %ld MHz, ADC %ld MHz.\r\n", (Clocks.HCLK_Frequency/1000000), (Clocks.PCLK_Frequency/1000000), (Clocks.SYSCLK_Frequency/1000000), (Clocks.ADCCLK_Frequency/1000000)); |
50 | uart_tx(text); |
51 | }
|
Mal den Code für STM32F0 grob auf F1 gemünzt (PA9+10 auch da UART?), darauf aber gerade ungetestet (keine Zeit grade).
erstmal Danke für die "frühe" Antwort. Spannungsversorgung identisch 3V VDD bei beiden Systemen. Am Discoveryboard hängt zusätzlich ja noch das Glass-LCD, bei mir ist garnix dran, nur die üblichen Blocks (5 x 100nF/10uF Kerko), zusätzliche Blocks noch an VDDA->VSSA und der Quarz (32...kHz) an OSC32IN/OUT, wie auch beim Discovery. Was mich auch noch etwas mistrauisch macht: selbst im Reset zieht das Ding auch noch immerhin 0.9mA. Wenn ich nachher etwas Zeit habe, werde ich noch mal prüfen: alle GPIO'S in definierten Zustand z.B. Input und Pulldown's an und dann Clocks aus und STOP. (empfohlen wird zwar alles auf Analogeingang, aber erstmal testen, wo da vielleicht ein Unterschied besteht. Vieleicht floatet ja der eine oder andere Pin irgendwo hin, ist ja schon nicht mehr so ganz trivial mit 'ner korrekten Messung bei den Strömen :-) Achso, Deinen Code kann ich ja auch mal laufen lassen, die Pins sollten stimmen.
Sind alls unbeschalteten Pins auf "Analog" eingestellt? Die Querstroeme der Eingangsinverter zeigen sich sonst deutlich. Gibt es unversorgte Schaltungsteile, in die ein als Ausgang geschalteter uC Pin Strom in die Schutzdioden hineinpumpt? Gleiche Taktfrequenz? Wo sind WFE/WFI um in den Sleep Modus zu kommen? Im Run Modus braucht z.B. der F411 deutlich weniger Strom!
@Uwe Bonnes Momentan kann ich mich nur sporadisch mit dem Projekt befassen, soviel jedoch vorab: * Startup mit MSI = 2MHz * GPIO-Clocks ein * GPIO's (so weit wie möglich -> PA13/14 :-) ) auf Analogmodus das macht ca. 30-40uA Reduzierung pro Port aus * GPIO-Clocks aus * es sollte dann eigentlich __WFE() folgen, bis dahin bin ich jedoch noch nicht gekommen. Das Board ist NUR mit dem Controller, Block-C's und SWD-Anschluss bestückt, auch fehlt momentan noch der vorgesehene Quarz an OSC32. Weiter runter als ca. 500uA bin ich aber immer noch nicht...
Bernd S. schrieb: > @Uwe Bonnes > Momentan kann ich mich nur sporadisch mit dem Projekt befassen, soviel > jedoch vorab: > * Startup mit MSI = 2MHz > * GPIO-Clocks ein > * GPIO's (so weit wie möglich -> PA13/14 :-) ) auf Analogmodus > das macht ca. 30-40uA Reduzierung pro Port aus > * GPIO-Clocks aus > * es sollte dann eigentlich __WFE() folgen, bis dahin bin ich jedoch > noch nicht gekommen. > > Das Board ist NUR mit dem Controller, Block-C's und SWD-Anschluss > bestückt, auch fehlt momentan noch der vorgesehene Quarz an OSC32. > > Weiter runter als ca. 500uA bin ich aber immer noch nicht... Das Datenblatt sagt fuer 2 MHz im Run Modus typisch 470 und max. 600 uA. Dann passt doch alles.
Das schon, ist richtig, aber ich will ja noch bis zum STOP kommen, hab ich aber noch nicht testen können
Zur Info: habe bei ST / GitHUb noch 'n paar passende Examples gefunden https://github.com/bjornfor/stm32-test damit bin ich im Lowpower RunMode schon mal bis auf 150uA 'runtergekommen. Allerdings gibts ab und an da mal eine Hardfault Exception (Bus Failure...) das habe ich dann mit der KEIL-IDE festgestellt. Normalerweise nutze ich jedoch Coocox 1.7.7. Nur muss man da schon ziemliche Klimmzüge veranstalten, um überhaupt einigermassen debuggen zu können (HW-Reset problem). Ich denke mal, dass damit wohl das Problem fast gelöst ist. Also Danke nochmal an alle für Eure Tips. Vielleicht stelle ich das Projekt mal hier 'rein, wenns soweit gediehen ist.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
