Hallo, ich habe hier ein NUCLEO-F334R8 vor mir. Darauf befindet sich ein STM32F334R8. 2 grundlegende Fragen welche mich schon seit geraumer Zeit beschäftigen. 1.) Man kann, laut Beschreibung, den TIM1 mit 144Mhz laufen lassen. Sehe ich das richtig, dass dies nur mit einem HSE möglich ist (also einen externen Clock den man ggf. "drauflöten" müsste?). Mit den internen 8Mhz komme ich über die Multiplikatoren usw. ja nicht dort hin soweit ich das begriffen habe. 2.) Im Zusammenhang mit dem Board will mir der NVIC nicht einleuchten. Es steht ja, dass es 73 maskable interrupt channels gibt. Bei den EXTI Registern sehe/finde ich jedoch nur 38 zum konfigurieren. Wo ist der Rest?
ad 1.) Auf dem Nucleo kann man den 8MHz Takt vom Quarz des Debuggers auch zur Nucleo-CPU weiterleiten, dazu müssen eventuell 1-2 Lötbrücken gesetzt werden, siehe Doku. IIRC ist das mit MCO beschriftet. ad 2.) Die diverse Peripherie hat auch Interrupts, teilweise sogar mehrere pro Gerät. Im Datenblatt sollte es eine Liste geben welcher Vektor zu welcher Peripherpie gehört.
Naja, einen 8Mhz hätte ich ja intern auch (HSI). Aber der wird vor der PLLSRC ja mal /2 dividiert. beim PLLMUL könnt ich x16 und nochmal die x2 für den TIM1 dann bin ich aber erst bei 128Mhz. Das selbe würde ja für einen 8Mhz über den HSE Eingang gelten soweit ich das dem DB entnehmen kann. Es gibt den Abschnitt "External and internal interrupt/event line mapping". Aber da kann ich ja auch nur auswählen, welcher der GPIOs auf die jeweiligen EXTIx Interrupt Lines durch geht. Ja es gibt da eine Tabelle im Kapitel Interrupts (NVIC), die hat aber 84 Einträge wovon einige reserviert sind usw. Mir fehlt da leider total die Beschreibung, wie das zusammenhängt.
Warum soll man mit den Multiplikatoren nicht "dorthin" kommen. Z.b. SysClk von HSI oder HSE über die PLL auf 72MHz einstellen, dann lässt sich TIM1 mit x2 davon betreiben. RCC_CFGR3. Das mit den Interrupts verstehe ich nicht. Wo ist das Problem?
Ja schon klar, dass ich die auf 72Mhz konfigurieren muss aber das schaff ich mit den vorhandenen Multiplikatoren ja nicht. Da bräuchte ich in der PLL ja einen Multiplikator von 18, der geht aber nur bis 16. Bei PLLSRC komm ich ja mit max 4Mhz rein wenn ich HSI nehme (Anhang). Wie gesagt, ich verstehe nicht, wo ich die 72 Interrupts konfigurieren kann. Ich bin mal so frei und verlinke das Manual: http://www.st.com/content/ccc/resource/technical/document/reference_manual/71/30/2e/f3/20/5b/46/c1/DM00093941.pdf/files/DM00093941.pdf/jcr:content/translations/en.DM00093941.pdf 12.1.3 S. 189 ist ja eine schöne Liste. Wie konfiguriere ich die alle? Außerdem hab ich die Einträge in Liste nicht abgezählt, also ohne die Reserved, das müssten ja weniger sein als 72. Mit den folgenden EXTI_xxx Registern kann ich doch nur die "external lines" konfigurieren oder (also EXTI0-EXTI35). Ich kenn mich zwar mit dem Prinzip der uCs aus, ist aber leider schon länger her, dass ich damit zu tun hatte und der war damals auch definitiv einfacher.
Es scheint man kann mit HSI echt nur 64MHz erreichen. Also HSE oder MCO vom ST-Link mit 8MHz verwenden. Der NVIC ist ein Standard ARM Cortex-Gerät und im allgemeinen Cortex-M4 Programming Manual beschrieben. http://www.st.com/content/ccc/resource/technical/document/programming_manual/6c/3a/cb/e7/e4/ea/44/9b/DM00046982.pdf/files/DM00046982.pdf/jcr:content/translations/en.DM00046982.pdf
Hab ich dann beim HSE mit 8Mhz nicht das selbe Problem? Wird ja wieder mindestens durch 2 dividiert bevor er bei der PLL landet. Okay, besten Dank. Das werd ich mir mal zu Gemüte führen.
mit HSE auf 8MHz geht das schon: PREDIV = 0, PLLXTPRE = 0, PLLSRC = 1, PLLMUL = 9 Warum man den HSI nur halbiert in die PLL füttern kann versteh ich allerdings nicht.
Ah verstehe, den div kann man auch auf 0 setzten. Hab da nur den "Schaltplan" angeschaut und mir gedacht da ist auch 2 das Minimum weil 0 nicht angeführt ist. Besten Dank! Ich fürchte bzgl. der Interrupts werd ich nochmal auf dich zurückkommen müssen, aber da schau ich mir mal das Programming Manual an und dann. Über die CMSIS (also die Funktionen, Strukturen, ...) ist es eh recht einleuchtend es zu konfigurieren. Ich will aber halt genauer wissen, welche Register da wo wie gesetzt werden und wie das zusammenhängt.
So, wie vermutet muss ich jetzt noch einmal bzgl. der Interrupts fragen. Ich seh im Programming Manual das NVIC_ISERx. Ich hab mir auch den Code etwas näher angeschaut, was beim Einschalten des Interrupts für z.B. TIM2 passiert. Ich schaffe es jetzt jedoch nicht den Konnex herzustellen, wie diese Zeile mit meinem STM32 zusammenpasst. NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
Gf schrieb: > So, wie vermutet muss ich jetzt noch einmal bzgl. der Interrupts > fragen. > Ich seh im Programming Manual das NVIC_ISERx. Ich hab mir auch den Code > etwas näher angeschaut, was beim Einschalten des Interrupts für z.B. > TIM2 passiert. Ich schaffe es jetzt jedoch nicht den Konnex > herzustellen, wie diese Zeile mit meinem STM32 zusammenpasst. > > NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = > (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & > (uint8_t)0x1F); Ich auch nicht ;-) Spass beiseite, der Code setzt einfach ein Bit im passenden ISER. Bei meinem F304 hat TIM2 z.B. IRQ-Nr. 28, das würde also Bit 28 im ISER0 entsprechen.
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.