Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2018:gsm-retransmitter

GSM Re-Transmitter

Zadání

Navrhněte a sestrojte GSM Re-Transmitter s GSM modulem Quectel M95, určený pro využití jako přístupový bod měřiče poškození parovodů. Jednotka musí být nezávislá a mít komunikační UART periferii. Hlavní funkce tohoto zařízení zahrnují příjem SMS příkazu, příkaz pro zpracování měřidlem a následné odeslání získaných dat z měření MMS zprávou. Implementujte vhodné ochranné algoritmy pro automatické či vzdálené resetování a základní detekci chyb při běhu firmwaru

Rozbor

Jak zmíněné měřidlo, tak i GSM modul komunikují pomocí UART sběrnice. Vcelku rozšířeným protokolem postaveným na UARTu je „AT command“ protokol, kde master posílá příkaz do slave pomocí stringu 'AT' s příslušným rozšířením o dotaz/příkaz. AT vzniklo ze slova Attention - poprvé použito u digitálních telefoních modemů.

Např: 'AT+IPR=9600<CR><LF>' nastavuje rychlost komunikace na 9600baudů.

AT protokol je podporován pouze u GSM modulu, měřidlo pouze posílá naměřená data (firmware měřidla je původně postaven pro Bluetooth UART - nutnost obsluhy přístroje být v dosahu Bluetooth vysílače). Jak je z popisu patrné, měřidlo je trvale instalováno v průmyslovém objektu a zejména z důvodu bezpečnosti (turbína elektrárny) není možno pravidelného fyzického styku s jednotkou - zdůvodnění GSM služby pro dálkové ovládání/získávání dat. Samostatný měřící přístroj je obsluhován PC softwarem (generace SMS příkazů) pro okamžitá měření, či časovaný program (i několik dnů). Nicméně každé jedno měření je doprovázeno odesláním dat. Příjem dat je plánován jako MMS na mail, či tel. číslo.

Funkce systému

Seznamováním se GSM modulem a detailními požadavky na obsluhu byl sestaven následující stavový diagram systému, který je složen z hlavní smyčky vlevo, jejíž statový automat je dále rozvinut vpravo. Nezávisle na hodinovém signálu periferií a jádra běží taktéž Watch Dog s periodou 26 vteřin, jenž hlídá zamrznutí nekonečné smyčky, či obsluhy MMS, která je v porovnání s jinými úlohami delší.

Nejprve je inicializován processor STM32F373, zejména pak jeho periferie UART pro komunikaci s měřidlem (UART1) a GSM modulem (UART3) v kruhém režimu a taktéž je zapnut Watch Dog. Inicializace modulu je v porovnání s inicializací procesoru delší a potřebuje kontrolu. U modulu jsou nastaveny parametry pro MMS službu, jsou vymazány SMS a zaslán dotaz, zda - li je GSM registrován v síti. Pokud modul vůbec nezačne komunikovat pomocí UART3, či není po dobu inicializace (asi 15 vteřin) registrován v sítí, je systém zresetován a začíná znova inicializací.

Po úspěšné inicializaci dochází k přechodu do nekonečné smyčky, kdy je jednou za 2 vteřiny odeslán prázdný, či konkrétní AT příkaz a je očekávána odpověď, která při validní hodnotě také resetuje Watch Dog. V případě delší než 4 - cyklové pomlky je restartován UART3 komunikující s GSM modulem a při pomlce delší než 26 sekund je systém kompletně zresetován jako v případě neúspěšné inicializace. Důvodem neustále komunikace s modulem je prevence zaseknutí modulu, aby byl případně včas zresetován - tato aplikace s ohledem na měřidlo odporu s proudem až 1 ampéra nelze zdaleka považovat za 'Low Power' a tedy hibernace systému za účelem šetření není na místě.

Pro celkovou funkci je zasadní přijetí nové SMS, kdy GSM modul notifikuje hostující zařízení zprávou o přijetí jako odezvu na prázdný AT command. Daná SMS musí být nejprve otevřena a její obsah zkrácen o hlavičku (data o odesílateli, čas odeslání, status SMS) a bezprostředně za textem ukončena, jinak nebude taková zpráva měřidlem správně vyhodnocena. Z důvodu limitované počtu SMS (24) je SMS následně smazána. Modul disponuje i interupt pinem, který v případě speciální akce změní stav, nicméně z preventivních důvodů není využit (zaseknutí - zamrznutí).

Pokud je modul hovorově vyzváněn, jako v předchozím případě, je odpovězeno na prázdný AT příkaz notifikací 'RING' časově podobně se opakující přerušovanému vyzváněcímu tónu u mobilního telefonu (myšleno ze strany volajícího). Z praktického hlediska je až 4. posloupná hláška RING vyhodnocena jako žádost o kompletní reset - vzdálené resetování systému.

V případě přijatých dat UART1 spojujícím měřidlo a Re-Transmitter je vyvolána obsluha MMS. Obluha MMS svojí dobou trvání převyšuje periodu Watch Dog a tedy je resetován i v této rutině. MMS adresátem je recipient, jenž byl obsažen v SMS, která měření a tedy příjem dat na UARTu způsobila, nebo je MMS poslána na defaultní adresu. Při MMS obsluze není rozbalena případně přijatá SMS ani není reagováno na vyzvánění hovoru. Při odesílání MMS jsou jednotlivé příkazy nutné k odeslání akumulovány do jedné hodnoty, kde je zásádní GSM_MMS_SENT s hodnotou 1000 - výsledek rutiny musí být vyšší 1000.

Implementace

Celý GSM modul je reprezentován následující strukturou, kde pro zmíněný stavový automat je zásadní hodnota cmd_val.

 typedef struct gsm_device_type {
    int32_t cmd_val; /* value of parsed response - see 4.0 and 7.0 of this file*/
    int32_t tim_reqd; /* flag of timer request yes/no */
    int32_t rst_req; /* flag of reset request yes/no */
    int32_t sms_num; /* received SMS number in memory */
    int32_t upload_mode; /* variable for MMS upload state distinguish - value */
    int32_t rst_beep; /* variable for counting dialed beep - tones for system reset */
    uint32_t uart_attempt; /* variable for counting missed UART communication */
    char cmd_to_send[UART_BUFFSIZE]; /* array for customized AT command to be sent */
    char contact[UART_BUFFSIZE/2]; /* array for MMS recipient - email address */
    char *mms_pld; /* pointer on the MMS content to be sent */
    char *p_rspd; /* pointer on the received response from the GSM module*/
 } gsm_device_t;

Hodnota cmd_val totiž obsahuje hodnotu hashované odpovědi na příkaz/dotaz a dle ní se rozhoduje zda-li byla přijata SMS, byla SMS přečtena, dochází k příchozímu hovor apod.. Hodnota tim_reqd nabývá hodnot 1 a 0 a rozhoduje, zda - li bude použit 2 vteřinový časovač. Flag rst_req je v případě log. 1 vyhodnocen jako kompletní restart. V případě přijaté SMS je zapotřebí rozlišit její číslo v paměti, k tomu účelu slouží sms_num. Flag upload_mode pomáhá rozlišovat stav nahraných dat z měřidla, rst_beep uchovává počty případných vyzvánění pro reset systému. Člen uart_attempt uchovává případný počet „ztracených“ pokusů při navázájí spojení pro řešení tohoto problému. Z názvů polí je patrné že cmd_to_send dokáže uchovat generovaný příkaz, v poli contact je uložen příjemce MMS. Pro sdílení dat mezi vrstvemi se používájí dva důležité pointery odkazující na data přijmutá UART jednotkami v DMA módu. Pointer mms_pld ukazuje na buffer příjmu dat z měřidla (UART1), či chybovou hlášku při odesílání MMS, p_rspd odkazuje na buffer UART3 jenž zaobstarává řídící komunikaci mezi procesorem a GSM modulem.

  /* USER CODE BEGIN WHILE */
  
while (1) {

    /********** GSM MODULE STATE MACHINE, PROCESSING SECTION - SOLVE THE STATE***********/

    switch (gsmmod->cmd_val) {

    case GSM_OK :
    	gsm_idle_state(gsmmod);
    	break;
    case GSM_SMS_RCVD :
    	gsm_SMS_tbread(gsmmod);
    	break;
    case GSM_SMS_READ :
    	gsm_SMS_publish(gsmmod);
    	break;
    case GSM_SMS_DEL :
    	gsm_SMS_del(gsmmod);
    	break;
    case GSM_RING :
    	gsm_mod_dialed(gsmmod);
    	break;
    case GSM_MMS_POST :
    	gms_MMS_send(gsmmod);
    	break;
    case GSM_NOCRR :
    	gsm_mod_hangup(gsmmod);
    	break;
    default: /* Nothing to do */
    	break;
    }

    /* Start the timer */
    if (gsmmod->tim_reqd) {
    	tim_gsm_respnd(START_THE_TIMER);
    }

    /******************** GSM MODULE RECEIVING SECTION - GET STATE-**********************/

    /* Check the UART DMA ring buffers if anything received*/
    refresh_uart3(gsmmod);
    refresh_uart1(gsmmod);

    /* Command had been sent and module responded + response time elapsed*/
    if (uart3_received_flag && tim_gsm_respnd(GET_TIMER_STATE)) {

    	/* Process received response, reset timers */
    	gsm_rec_respnd2(gsmmod, 1);
    	tim_gsm_respnd(RESET_THE_TIMER);
    	green_led_mode_ctl(ONCE_FLASH);
    	uart3_received_flag = 0;
    	gsmmod->uart_attempt = 0u;
    	CLEAR_WATCH_DOG();
    }
    /* Module does not respond - give another chance eventually reset TX and RX GSM UART */
    else if (tim_gsm_respnd(GET_TIMER_STATE)) {
    	gsm_missed_response(gsmmod);
    }
    /* Uploading data from the measurement device to sent it as MMS*/
    gsm_upload_mode(gsmmod);
	
    /******************** USER REMOTE RESET ROUTINE *************************************/

    if (gsmmod->rst_req) {
    	/* Full system reset including Poteron Reset routine - all data will be lost*/
    	printf("__COMPLETE_RESET__\r\n");
    	NVIC_SystemReset();
    }

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
}

Úsek kódu je v podstatě celý mechanismus vyjma inicializačních funckcí - koresponduje se smyčkou stavového diagramu vlevo (detail vpravo), přičemž začíná AT command send a končí AT FSM. Pro zapnutí GSM modulu je nutné zaslat pulz PowerKey (viz projekt, datasheet modulu). Ihned po inicializaci procesoru začne blikat Green_LED (asi 10Hz) detekující inicializaci (stav FAST_FLASH).

GSM MODULE STATE MACHINE, PROCESSING SECTION - SOLVE THE STATE

V defaultním případě (po resetu) začíná cyklus ve stavu GSM_OK, který vyšle prázdný AT příkaz. V případě příjmu SMS je její čtení sekvečně rozděleno podle stavů GSM_SMS_RCVD - vyšle příkaz pro přečtení SMS, jenž je bezprostředně následován stavem GSM_SMS_READ kdy je SMS zpráva ošetřena o hlavičku a zápatí, případně získán příjemce MMS a finální smazání zprávy. Po těchto třech úkonech získává měřidlo pomocí UART1 extrahovaný příkaz z SMS a měří.

Stavy GSM_RING, GSM_NOCRR ošetřují případné volání na číslo jednotky, kde GSM_RING detekuje aktivní volání a GSM_NOCRR zavěšení hovoru. Pro opakování - nutno volat modul nejméně na zaznění 4. tónu pro vyvolání akce resetu. Rutina přiřazena k hodnotě GSM_RING v tomto případě nastaví flag rst_req na log. 1. Nakonec je zapnut 2 vteřinový timer (nedojde k jeho zapnutí pouze mezi stavy GSM_SMS_READ a GSM_SMS_DEL).

GSM MODULE RECEIVING SECTION - GET STATE

Funkcemi refresh_uart1() a refresh_uart3() jsou zkontrolovány a vyhodnoceny DMA buffery UART periferií, kde UART1 obsluhuje linku s naměřenými daty (výstup z měřidla), či UART3 neustálou komunikaci mezi GSM modulem a procesorem.

V případě příjmu znaku '\n' (uart3_received_flag) na UART3 sběrnici a vypršení časového úseku timeru tim_gsm_respnd() je vyhodnocena přijmutá odpověď na zaslaný AT command pomocí gsm_rec_respond2(), je vyresetován timer i Watch Dog a pomocná signalizační Green_LED nastavena na mód jednoho blinknutí za sekundu ONCE_FLASH (pracovní mód). LED může blikat i 2x za vteřinu (TWICE_FLASH) pokud modul neodpovídá a při pokusu o restart UART3 gsm_missed_response() )

Pokud vypršel časovač tim_gsm_respnd(), pomocí funkce gsm_missed_response() je při opakovaném vypršení času restartováno rozhraní UART3, přičemž je vždy nastaven cmd_val na GSM_OK, aby byl zaslán další prázdný AT command na začátku smyčky. Pokud se nepodaří navázat delší dobu, Watch Dog způsobí restart celého systému (zmíněných 26s).

USER REMOTE RESET ROUTINE

Pokud bylo rozhodnuto v průběhu programu o resetu:

  • nesprávné odeslání MMS (viz video, výsledek MMS rutiny musí být větší 1000, 1000 je výsledek příkazu odeslání)
  • dlouhé vyvolávání modulu (vzdálený reset uživatelem)

Je využita CSMSIS funkce ARM NVIC_SystemReset(), která způsobí reset ekvivalentní hardwarovému resetu pinu procesoru. Nutno podotknout, že procesor ovládá GPIO pin v módu otevřeného kolektoru jenž je připojen přímo na reset pin kontroléru měřidla - možnost tvrdého resetu měřidla.

Bezpečnostní prvky

Projekt je psán protektivní medodou, kde důležité funkce vracejí výsledek, jenž je dále vyhodnocován - detekce špatné odezvy GSM modulu. Důležitou součastí je vícekrate zmíňovaný 26 vteřinový Watch Dog, jenž běží ze samostatného zdroje hodinového signálu 40 kHz, WatchDog není zastaven ani při zastavení procesoru v obyčejném debug módu ST-LINK.

Pomocí dvou-vteřinového časovače tim_gsm_respnd() lze v přetrvávající neaktivitě restartovat UART3, stejně jako při jakékomkoliv detekovatelném problému UARTu - Využit HAL_UART_ErrorCallback(UART_HandleTypeDef *huart), jenž je schopen zaznamena například šum na RX terminálu, stejně jako zapnutí nového příjmu UART. Poznámka, při rádiové aktivitě modulu občas dochází k šumu na UART3 sběrnici (modul vysílá až 2 watty výkonu).

Vzdálené resetování je patrné voláním na modul - číslo není veřejné, pokud modul neodpovídá je sám Watch Dogem zresetován.

Detaily při implementaci

Pro vytvoření projektu byl využit nástroj MX Cube V1 4.27.00 a ATTOLIC true studio 9.00. Pomocí MX Cube byl vygenerován projekt s patřičnými periferiemi do párovaných c-file/header-file a nevyužité piny nastaveny jako analogové. Vytvořené projektové soubory jsou poté na nejnižší vrstvě gsm_driver.c a gsm_driver.h obsahující rozhraní mezi STM HAL periferálními funkcemi pro komunikaci s GSM modulem či měřidlem anebo Callbacky pomocných periferie jako například časovač. Aplikačními vrstvami gsm_dal.c/gsm_dal.h (driver above layer) je zajištěn chod celého popsaného stavového automatu switch-case. V programu není využito IRQ handlerů, pouze Callback funkcí. Komunikace s GSM modulem je nastavena na rychlost v případě UART3 na 9600 baudů, s měřidlem (UART1) na 115200 baudů. Funkce printf tiskne pomocné hlášky pomocí nezávislého UART2 (115200 baud, jako jediný nemá zapnut RX DMA mód).

Prvotní verze projektu byla napsána na procesoru STM32F303 - Nucleo 144 a vytvořeném Zio shieldu. Z důvodu vzájemné kompatibility HAL knihoven nebylo těžké přejít na procesor STM32F373RCT6. Důvod změny procesoru byla jeho cena a fakt že byl ve větším množstvím na firemním skladě. Vlevo je zmíněný Nucleo 144, vpravo již finální modul jenž je použit v měřidle. Footprint zkompilované aplikace bez optimalizací je 21kB SRAM, 8,7kB FLASH. Z toho buffer UART1 zabírá 16384 Bytů SRAM - pro případné zpracování velkého počtu naměřených hodnot.

Demonstrační video (pro detaily zvolte Full Sreen mode)

  • Inicializace
  • Odeslání SMS příkazu a jeho příjem zapnutí měření (0:37)
  • Přijmutí dat z měření - vyslání MMS (1:03 viditelná data <mge … >)
  • Finální příjem MMS do měřícího softwaru

Pro orientaci - komentář v „Sticky Notes“

  • Nedostatečné volání pro reset
  • reset

Závěr

Zařízení splňuje zadání na příjem a úpravu SMS, její odeslání v rámci příkazu měřidlu, příjem naměřených dat a odeslání MMS na stanového číslo či e-mail. I přes jednoduchost systému a kratší testování (urgentní úkol) nebyly nalezeny stavy z nichž by se firmware sám nedostal do normálního běhu. Technickým úskalím může být zaseknutí GSM modulu, jenž by ale mělo být pohlídáno Watch Dogem procesoru - ten sám by se zaseknut neměl. Samostatný projekt je dostupný níže, avšak není upraven do ideálního stavu - možnost zjednodušení a vyčištění kódu.

Materiály a zdroje

2018/gsm-retransmitter.txt · Poslední úprava: 2019/01/14 10:14 autor: Vladimír Šustek