Hallo, ich bin beim ARM programmieren ziemlich neu und habe versucht ein einfaches PWM Signal an T1C1 zum laufen zu bringen. Leider habe ich nicht sehr viele Tutorials gefunden. Das Programm, dass ich bisher geschrieben habe funktioniert leider nicht. Könnt ihr mir sagen, wo mein Fehler liegt? P.S.: Ich schreibe mit der IDE von CooCox Code: #include <stm32f10x.h> #include <stm32f10x_conf.h> int main(void) { RCC -> APB2ENR |= RCC_APB2ENR_TIM1EN; TIM1 -> CR1 |= TIM_CR1_CEN; RCC ->APB2ENR |= RCC_APB2ENR_IOPAEN; GPIOA ->CRH |= GPIO_CRH_CNF8_0 | GPIO_CRH_CNF8_1 | GPIO_CRH_MODE8_0 | GPIO_CRH_MODE8_1; TIM1 ->PSC = 0; TIM1 ->ARR = 60000; TIM1 ->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1CE; TIM1 ->CCER |= TIM_CCER_CC1E; TIM1 ->BDTR |= TIM_BDTR_MOE; TIM1 ->EGR |= TIM_EGR_UG; RCC ->APB2ENR |= (1<<4); GPIOC ->CRH |= ((1<<20) | (1<<21)); while(1) { TIM1 ->CCR1 = 30000; } }
> Das Programm, dass ich bisher geschrieben habe funktioniert leider nicht. Was funktioniert nicht? Was hast du erwartet, und was hast du stattdessen festgestellt? Das Tutorial von Diller verwendest die StdPeriphLib. Ich nehme an, du suchst ein kommentiertes Beispiel ohne Hardware Abstraktion: http://stefanfrings.de/stm32/index.html#pwm Was mir bei deinem Code direkt ins Auge sticht ist, dass du überall "|=" verwendest. Du scheinst davon auszugehen, das alle Register initial auf 0 stehen. Hast du dich dessen vergewissert? > GPIOA ->CRH |= GPIO_CRH_CNF8_0 | GPIO_CRH_CNF8_1 | GPIO_CRH_MODE8_0 | GPIO_CRH_MODE8_1; Damit ist der Ausgang als Open-Drain für 50MHz (viel hilft viel, was?) konfiguriert. War das beabsichtigt und passt das zu deiner Beschltung? > TIM_CCMR1_OC1CE ich glaube, du wolltest TIM_CCMR1_OC1PE benutzen. > BDTR > EGR Ich denke nicht, dass diese Register für deinen Anwendungsfall relevant sind. Die würde ich für's Erste nicht anrühren.
Schau mal ins "General purpose Timer Cookbook" von ST (Kapitel 1.3.1 ff.): http://www.st.com/content/ccc/resource/technical/document/application_note/group0/91/01/84/3f/7c/67/41/3f/DM00236305/files/DM00236305.pdf/jcr:content/translations/en.DM00236305.pdf Viele Grüße Igel1
:
Bearbeitet durch User
Andreas S. schrieb: > Schau mal ins "General purpose Timer Cookbook" von ST (Kapitel 1.3.1 > ff.): > http://www.st.com/content/ccc/resource/technical/document/application_note/group0/91/01/84/3f/7c/67/41/3f/DM00236305/files/DM00236305.pdf/jcr:content/translations/en.DM00236305.pdf Das würde ich auf jeden Fall auch empfehlen. Ansonsten hast du hier ein funktionierendes Beispiel für PWM mit einem General Purpose Timer ohne irgendwelche Libraries: https://github.com/ChristianRinn/bare_metal_stm32f103c8/blob/master/src/example03_gpio-timer-pwm/main.c Hier ist noch ein Beispiel mit einem Advanced Timer: https://github.com/ChristianRinn/bare_metal_stm32f103c8/blob/master/src/example04_timer-complementary-pwm/main.c Grundsätzlich kann man aber den Advanced Timer wie einen GP-Timer verwenden. Das einzige was man zwingend benötigt ist das MOE-Bit im BDTR, also
1 | TIM1 ->BDTR |= TIM_BDTR_MOE; |
Ob Timo noch lebt? Wenn ja, so würden sich all diejenigen, die hier Rat und Tat abgeliefert haben, sicherlich über ein kleines Feedback freuen ... Viele Grüße Igel1
Andreas S. schrieb: > Ob Timo noch lebt? Sieht nicht danach aus. Timo schrieb: > habe versucht ein > einfaches PWM Signal an T1C1 zum laufen zu bringen. Leider habe ich > nicht sehr viele Tutorials gefunden. Das Programm, dass ich bisher > geschrieben habe funktioniert leider nicht. Könnt ihr mir sagen, wo mein > Fehler liegt? Bei einer solchen Disposition wäre erstmal ne Frage fällig: Möchte er eine nette Antwort oder eine ehrliche Antwort haben? W.S.
Timo schrieb: > Leider habe ich nicht sehr viele Tutorials gefunden. Es gibt von ST ganz viele Codebeispiele zu allen Peripheriemodulen und mit CubeMX kriegt man PWM im nu zum laufen. Ich würde daher mal mit CubeMX die gewünschten Einstellungen für PWM machen und den automatisch erzeugten Code dann mit Deinem Code vergleichen.
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.