[elektro] STM32F446 TIMER3 interrupt
r3flow
zoltan.nagy at vivor.hu
Tue Jul 31 21:53:01 CEST 2018
Amit kikapcsoltál az a Flash-ből utasítás olvasásra vonatkozik.
Ami a te problémádat okozza az a RAM előtti write buffer ami az ST
Cortex-M4-ekben van, ami azért van, hogy a CPU-nak ne kelljen megvárni a
RAM írással azt, hogy szabad legyen a busz. Emiatt a RAM write buffer
miatt van az, hogy a flash törlésed még nem történt meg amikor már
kiléptél az ISR-ből emiatt a CPU újrahívta az ISR-t.
Ezt a write buffert az ACTLR (0xE000 E008) regiszter 1. bitjével
(DISDEFWBUF) tudod kikapcsolni ezt a write buffert. Ebben az esetben
viszont lelassul a végrehajtásod mert a CPU mindig meg fogja várni a RAM
írás végét mielőtt végrehajtja a következő utasítást.
https://www.st.com/resource/en/programming_manual/dm00046982.pdf
Üdv,
Z.
On 2018-07-31 21:25, Bali Zoltan wrote:
> Köszönöm, ez megmagyarázza, de akkor nem értem,
> hogy kikapcsoltam(elvileg, CubeMx) az Insruction, data cache-t,
> meg a prefetch-et, és mégis dupláz. Vagy átver a Cube MX.
> Na mindegy, megnézem még online a regiszterekben.
>
> Köszi még egyszer.
> Üdv. Zoli
>
>
> 2018.07.31. 21:03 keltezéssel, r3flow via Elektro írta:
>> Régen olvastam végig az ARM.com-ot a cortex doksit de van olyan emlékem,
>> hogy külön felhívták a figyelmet arra hogy M3/M4 esetén ha túl gyorsan
>> kilép az ISR akkor duplázás történhet, mert a memória írás ami törölné
>> az interrupt bitet az írás cache miatt nem történik meg az ISR-ből
>> kilépés előtt, emiatt a CPU újrahívja az ISR-t.
>>
>> http://www.keil.com/support/docs/3928.htm
>>
>> Üdv,
>> Z.
>>
>>
>> On 2018-07-31 20:23, Bali Zoltan wrote:
>>> Hali!
>>>
>>> Itt a már lekopasztott kód, ami most fut is valójában.
>>>
>>> void TIM3_IRQHandler(void)
>>> {
>>> /* USER CODE BEGIN TIM3_IRQn 0 */
>>> GPIOC->BSRR = 1<<10;
>>> /* USER CODE END TIM3_IRQn 0 */
>>> //HAL_TIM_IRQHandler(&htim3);
>>> /* USER CODE BEGIN TIM3_IRQn 1 */
>>> if(TIM3->SR & TIM_SR_UIF) {
>>> }
>>> TIM3->SR = TIM3->SR & ~TIM_SR_UIF;
>>> GPIOC->BSRR = 1<<(10+16);
>>> /* USER CODE END TIM3_IRQn 1 */
>>> }
>>>
>>> F446, 48MHz, maximális optimalizálással, mindenféle prefetch
>>> varázslás kikapcsolva, csak UIE-vel, kétszer fut le az interrupt.
>>> A csatornák PWM-re vannak állítva, belső órajel, semmi különleges.
>>> Optimalizálás nélkül, egy interrupt van csak, mint a másik(F051)
>>> képen. Persze, ekkor hosszabb ideig magas a billentett port.
>>> Lehet túl rövid az IT futása? Ha bent volt a végrehajtási
>>> saját kódom is, akkor időnként duplázott csak. Azután kezdtem
>>> lekopasztani, miután az a gyanúm támadt, hogy a futási idővel van
>>> összefüggésben. Speciel most, pont kéne, hogy minél rövidebb legyen
>>> az IT... Volt már olyan változat, hogy SR regiszter simán nullázva.
>>>
>>> http://www.kepfeltoltes.eu/images/hdd1/2018/07/31/14620180731173944.png
>>>
>>>
>>> Átraktam a kódot, F051-re, ugyanazzal(remélem, mert Cube MX-el
>>> generáltam újra). Ez max optimalizálással sem dupláz, a fenti IT kóddal-
>>>
>>> http://www.kepfeltoltes.eu/images/hdd1/2018/07/31/49920180731172830.png
>>>
>>> F446-on még az IT prioritásokat vissza vettem mindet 4-re, csak a TIMER3
>>> van 0-án.
>>>
>>> Errátát néztem, semmi timer, IT vonatkozás.
>>>
>>> Ötlet? Tapasztalat?
>>>
>>> Köszi
>>>
>>> Üdv. Zoli
>>>
>>> -----------------------------------------
>>> elektro[-flame|-etc]
>> -----------------------------------------
>> elektro[-flame|-etc]
>>
>
> -----------------------------------------
> elektro[-flame|-etc]
More information about the Elektro
mailing list