STM32F051 zvlastne spravanie sa USART FLAGov

Stano stano.hw na gmail.com
Středa Březen 18 19:05:02 CET 2015


Zdravim konferenci
Narazil som na zvlastne chovanie flagov USARTu ktore si neviem vysvetlit
Ked dam breapoint na zaciatok IRQ rutiny, riadok: void USART1_IRQHandler 
(void) {
Tak pri prijati znaku debugger zastavy ako ma ale ked krokujem dalej 
alebo dam aj run
status = usart->ISR; uz do premennej nezapise flag RXNE.
Pricom pri sastaveni breakpointu ho vidim nastaveny ale dalsim krokom 
debugu sa vymaze.
(v tomto teste poctivo citam data z USART1->RDR registra, error flagy 
nenastanu}

Druhy problem ktory myslim ma rovnaku pricinu.
Zmazal som z rutiny dat citanie z USART1->RDR registra s cielom 
vygenerovat Overrun error.
Posielam na usarte znaky cca 1 za sekundu a nic, ORE flag nenastava.
Ked som poslal ale 2 s medzerou iba 250ms odrazu sa ORE nastavil.
Ale pri pomalom posielani dat ako keby nieco nulovalo RXNE a tym aj ORE.
Prvy problem moze byt sposobeny tym istym, kedze medzi zastavenim a 
spustenim programu,
alebo dalsieho kroku uplynie doba ktora by mohla byt na tento jav 
dostatocne dlha.

USART timeout feature mam vypnutu (skusal som aj zapnut, bez zmeny)
Watchdog nieje povoleny, v procesore nebezia ziadne dalsie interrupty a 
v main slucke je len
while(1);

Mate niekto aspon tusenie cim to moze byt? V principe to prilis nevadi 
kedze v aplikacii nepredpokladam
situaciu ze by boli taketo dlhe casy na spracovanie eventu. Ale 
"sprijemnuje" to debugovanie.
SPU STM32F051R8T6
Revizia B
Taktovany na 48MHz z HSE. (default startup kod)
Usart nastaveny na 115200Bd 8N1

Hruba kostra IRQ vektora:
void USART1_IRQHandler (void) {
    {
    volatile uint32_t status;
    uint32_t lastRxError;

    status = usart->ISR;
    if (status & USART_ISR_RXNE){

    }
    if (status & USART_ISR_TXE) {

    }
    if(status & (USART_ISR_PE | USART_ISR_FE | USART_ISR_NE | 
USART_ISR_ORE)){
        // Error flag
    }
}


S pozdravom,
       Stano


Další informace o konferenci Hw-list