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.
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.
Eine eigene Frage?
Dieser Thread ist über 9 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.