[elektro] GPIO AF valtas / spike

hg12345 hg12345 at freemail.hu
Wed Aug 17 20:43:46 CEST 2016


Hi,
érdemes meglesni ilyen esetekben az asm listát, sokat segít, de ovatosan kell nézni, mert minden -o??? esetén másképp generálódik, ill a ha változtatsz a rutinban ez is változhat.

Ilyen esetekre vannak még kód fixáló utasítás, hogy az optimalizáció ne keverje össze végrehajtási sort.
ha esetleg érdekes lehet :  
https://developer.arm.com/docs/dui0774/latest/compiler-specific-intrinsics


"uprogc ." <uprogc at gmail.com> írta:
>Tomoritettem a kodot es idaig meg nem lattam spikeot, valoszinuleg mar
>nincs is ahogy legyen.
>
>Eddig valamiert nem esett le nekem hogy hogyan is irhatnam csak egyszer az
>AFR-t ;)
>
>Koszi.
>
>2016-08-17 15:10 GMT+03:00 uprogc . <uprogc at gmail.com>:
>
>> Mennyire segit a *register* uint32_t *ize ARM eseten ?
>>
>> Ezzel jobb eredmenyt kaptam mint volatile-al.
>>
>> 2016-08-17 15:07 GMT+03:00 uprogc . <uprogc at gmail.com>:
>>
>>> Koszi kiprobalom.
>>> Volatile nem kerdes, de azert koszi.
>>>
>>> Eredetileg igy volt megirva :
>>>
>>> Uart3McuInit()
>>> {
>>> ....
>>>     GpioInit( &obj->Tx, tx, PIN_ALTERNATE_FCT, PIN_PUSH_PULL,
>>> PIN_PULL_UP, 0 );
>>>     GpioInit( &obj->Rx, rx, PIN_ALTERNATE_FCT, PIN_PUSH_PULL,
>>> PIN_PULL_UP, 0 );
>>>
>>>     GPIO_PinAFConfig( obj->Tx.port, ( obj->Tx.pin & 0x0F ),
>>> GPIO_AF_USART3 ); //--> glitch
>>>     GPIO_PinAFConfig( obj->Rx.port, ( obj->Rx.pin & 0x0F ),
>>> GPIO_AF_USART3 );
>>> }
>>>
>>> Igy sokkal rosszabb volt, minden alkalommal tuske.
>>>
>>> Aztan a PULL_UP-okat kicsereltem PULL_DOWN-ra. Igy a USART huzza fel a
>>> kimenetet H szintre.
>>>
>>> Igy jobb lett + a kod optimalizalassal, de veletlenszeruen igy is
>>> elofordul tuske. Nem ertem miert csak veletlenszeruen...
>>>
>>>
>>> 2016-08-17 14:53 GMT+03:00 hg12345 <hg12345 at freemail.hu>:
>>>
>>>> Hi, szerintem az ST ARM-okban van ilyen funkció az UART/USART-ban.
>>>> ha csak egyszer akarod írni a AFR regiszterek, akkor
>>>>
>>>> volatile register tmp;
>>>> tmp = (AFR & mask) | new;
>>>> AFR = tmp;
>>>>
>>>> a "volatile", ha nem így csinálod kioptimalizálja,
>>>>
>>>> amúgy megpróbálható egy sorba leírva, ezt áltálaban jó optimalizálja,
>>>>
>>>> AFR =  (AFR & mask) | new;   (az AFR gyárilag "volatile")
>>>> ez biztos beolvassa a belső regiszterbe az AFR értéket elvégzi a
>>>> műveletet és  és kiírja.
>>>>
>>>> Sokat segíthet, ha átállítás előtt úgy állítod a GPIO lábat, hogy a
>>>> TX-nek megfelelő állapotú legyen, esetleg még segíthet az is ha mindig
>>>> felhúzó ellenállást állítasz kimenetre, mert amikor átkapcsol ez mindig
>>>> felhúz, még ha egy pillanatra bemenet lenne....
>>>>
>>>>
>>>> "uprogc ." <uprogc at gmail.com> írta:
>>>> >Jobban orulnek ha mar nem kellene a HW-t bonyolitani.
>>>> >
>>>> >2016-08-17 14:21 GMT+03:00 Pipi <lista at puzsar.hu>:
>>>> >
>>>> >> nem tudsz még egy lábat elhasználni?
>>>> >> pici soros ellenállás a tx-el, erre megy a másik gpio láb, ami vagy
>>>> >> kimenet, vagy ts/bemenet, ezzel adod a break-ot
>>>> >>
>>>> >> Idézet ("uprogc ." <uprogc at gmail.com>):
>>>> >>
>>>> >> Sziasztok,
>>>> >>>
>>>> >>> Break conditiont kell generalnom a usart-on.
>>>> >>> Ugy oldottam meg hogy atvaltok gpio-ra es lehuzom a tx labat t idore,
>>>> >>> aztan
>>>> >>> visszavaltok usart-ra es kuldom amit kell.
>>>> >>>
>>>> >>> Amikor kapcsolok vissza usart-ra ( gpio / AF valtas ) akkor van egy
>>>> tuske
>>>> >>> a
>>>> >>> tx es rx pin-en.
>>>> >>> A tusket konkretan az AFR ketszeri irasa okozza a fv. vegen.
>>>> >>>
>>>> >>> Optimalizaltam ezt:
>>>> >>> void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource,
>>>> >>> uint8_t
>>>> >>> GPIO_AF)
>>>> >>>
>>>> >>> ugy hogy a fv. vegen csak ennyi maradt:
>>>> >>>   *afr =  temp_2;
>>>> >>>   *afr |= temp;
>>>> >>>
>>>> >>> Az afr egy mutato , erteke :
>>>> >>> afr = &GPIOx->AFR[indx];
>>>> >>>
>>>> >>> Igy eltunt a tuske, viszont nem teljesen, veletlenszeruen megjelenik.
>>>> >>>
>>>> >>> Hogy tudnam meg jobban optimalizalni a gpio / af atvaltast ?
>>>> >>>
>>>> >>> Udv.
>>>> >>> Szabi
>>>> >>> -----------------------------------------
>>>> >>>           elektro[-flame|-etc]
>>>> >>>
>>>> >>
>>>> >>
>>>> >> -----------------------------------------
>>>> >>          elektro[-flame|-etc]
>>>> >-----------------------------------------
>>>> >          elektro[-flame|-etc]
>>>>
>>>> -----------------------------------------
>>>>           elektro[-flame|-etc]
>>>>
>>>
>>>
>>
>-----------------------------------------
>          elektro[-flame|-etc]



More information about the Elektro mailing list