[elektro] GPIO AF valtas / spike

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


A "register" mindenképpen regiszterbe kerül a változó, míg nem ilyen esetben elképzelhető hogy stack-en pihen mig nem használod, akkor olvassa be a regiszter majd használja. Hogy hogyan viselkedik az optimalizáció kérdése.
regiszter esetén meg a rutin ehhez a regiszterhez van rendelve a változó

"uprogc ." <uprogc at gmail.com> írta:
>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