[elektro] GPIO AF valtas / spike
uprogc .
uprogc at gmail.com
Wed Aug 17 14:10:43 CEST 2016
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]
>>
>
>
More information about the Elektro
mailing list