Novinka:STM32F0xx 7.
(Kategorie: Mikroprocesory)
Napsal mard
01.01.1970

Takže v minulém dílu jsme probrali první projekt s STM32F0Discovery kitem a nyní uvedu další příklad toho, co není v demonstračních příkladech od ST. Tím je komunikace po RS232 (resp. USART). I přes to, že jde o protokol hodně starý, tak je velmi často používaný. Můžete jej využít třeba pro ladění nebo komunikaci s bluetooth modulem.

Úvodem

Zde uvedený příklad je maximálně zjednodušený aby jej mohli využít i začátečníci. Přesto upozorňuji na to, že uvedená imaplementace není nejlepší a je vhodná pro jednodušší projekty. Pro složitější programy, kdy je mcu vytížen i jinou prací velmi doporučuji využít jak pro příjem, tak pro odesílání DMA. V paměti vyhradíte dva buffery - příjmový a vysílací. Příjmový je kruhový a odesílací lineární. Pokud potřebujete něco odeslat, tak data vložíte do vysílacího bufferu a pustíte DMA (memory to periphery) pro odeslání, které postupně data odešle do USART periférie. Podle příznaku ukončení přenosu si otestujete že vše bylo odesláno. Příjem je stejný - kontrolujete kde se zastavil přenos (periphery to memory) a zda už dorazila celá zpráva. Pokud ano, tak zprávu zpracujete a změníte váš ukazatel pozice v kruhovém přijímacím bufferu na konec zpracované zprávy.
Zde takto komplikované věci pomineme - například odesíláme v cyklu, takže mcu nemůže dělat nic jiného než čekat na USART periférii. Nicméně příklad je k tomu, aby bylo jasné jak otevřít správné GPIO piny a jak je nastavit.


Program

Otevření správných pinů provedeme následujícím způsobem.
GPIO_InitTypeDef GPIO_InitStructure;

// pustime hodiny
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

// PA9 je Tx
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // alternate function!
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

// PA10 je Rx
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);

// nastavi se alternativni funkce
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);



Tím bychom měli piny připravené a připojené k periférii. Ale periférie sama je zatím mrtvá a musíme jí oživit, což uděláme následujícím způsobem.

USART_InitTypeDef USART_InitStructure;

// pustime hodiny
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

// nastavíme rychlost a další parametry
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // pozadujeme jak prijem tak i vysilani
USART_Init(USART1, &USART_InitStructure);

// spustime periferii
USART_Cmd(USART1, ENABLE);


V tomto okamžiku již je všechno připraveno k práci a zbývá vše jen vyzkoušet. Pokud máte tedy USART výstup připojený na vstup nějakého USB-USART převodníku a v PC spuštěný nějaký terminál (např. Hyperterminál) a ryhclost nastavenou na PC stejně jako máme v kitu, tak už zbývá jen periférii vyzkoušet.

uint8_t T_Buff[] = "Pokusny text z STM32F0 Discovery kitu/n/n";
uint8_t i=0;

/* posleme pres USART */
for (i=0; i<37; i++)
{
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
        USART_SendData(USART1,T_Buff[i]);
}



Aby jste to neměli tak jednoduché, tak neuvádím zdrojový kód v příloze jako obvykle. Ale věc je tak jednoduchá, že by to mohl zvládnout i začátečník sám. Alespoň napovím - v nekonečném main cyklu se testuje příznak (flag) přijetí bajtu USART jednotkou. Pokud je status flagu != RESET, tak se začne přijímat a přijímá se až do přijetí ukončovacího znaku (obvykle 0x0D) nebo do naplnění bufferu.


Závěr

Protože není mezi demopříklady ke kitu využití USART, tak jsem pokládá za užitečné takový příklad napsat, abych zjednodušil případné tápání začátečníkům s tímto levným a šikovným kitem.


Odkazy

Předcházející články:
STM32F0xx 1. naleznete zde. (popis jádra, různé typy pouzder)
STM32F0xx 2. naleznete zde. (popis jádra, různé typy pouzder)
STM32F0xx 3. naleznete zde. (pouzdro LQFP64 a LQFP48 v Eagle)
STM32F0xx 4. naleznete zde. (Verze redukce 1.0)
STM32F0xx 5. naleznete zde. (redukce verze 2.0)
STM32F0xx 6. naleznete zde. (první projekt s F0 - výstup PWM)

Stránka STMicroelectronics týkající se F0 je zde.


Tato novinka je z -MCU Mikroelektronika - Community Site
( http://mcu.cz/news.php?extend.3183 )