Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
2018:gsm-retransmitter [2019/01/14 09:52] Vladimír Šustek [Implementace] |
2018:gsm-retransmitter [2019/01/14 10:14] (aktuální) Vladimír Šustek [Materiály a zdroje] |
||
---|---|---|---|
Řádek 24: | Řádek 24: | ||
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í). | 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á zpráva RING vyhodnocena jako žádost o kompletní reset - vzdálené resetování systému. | + | 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řipadně 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. | + | 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===== | =====Implementace===== | ||
Řádek 45: | Řádek 45: | ||
} gsm_device_t; | } 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. | + | 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 */ | /* USER CODE BEGIN WHILE */ | ||
Řádek 122: | Řádek 122: | ||
} | } | ||
- | Ú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). | + | Ú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 === | === 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 sekvečně její čtení 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ěří. | + | 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). | 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). | ||
Řádek 132: | Řádek 132: | ||
=== GSM MODULE RECEIVING SECTION - GET STATE === | === GSM MODULE RECEIVING SECTION - GET STATE === | ||
- | Funkcemi refresh_uart1(gsmod) a refresh_uart3(gsmod) 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. | + | 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, pomocná signalizační LED nastavena na mód jednoho blinknutí za sekundu ONE_FLASH. Tato LED bliká neustále při inicializaci = FAST_FLASH a dvakrát za sekundu - TWICE_FLASH při pokusu o restart UART3 gsm_missed_response(gsmod) ) | + | 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(gsmod) 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). | + | 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 === | === USER REMOTE RESET ROUTINE === | ||
Řádek 145: | Řádek 145: | ||
* dlouhé vyvolávání modulu (vzdálený reset uživatelem) | * 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. Nunto 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. | + | 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===== | =====Bezpečnostní prvky===== | ||
Řádek 151: | Řádek 151: | ||
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. | 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. | + | 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 WatchDogem zresetován. | + | 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==== | =====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. Není využito IRQ handlerů, pouze Callback funkcí. Komunikace s GSM modulem je (UART3) je 9600 baud, s měřidlem (UART1) 115200 baud. Funkce printf tiskne pomocné hlášky pomocí nezávislého UART2 115200 baud (jako jediný nemá zapnut RX DMA mód). | + | 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. | 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. | ||
Řádek 189: | Řádek 189: | ||
=====Závěr==== | =====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í doupraven do ideálního stavu - možnost zjednodušení a vyčištení kódu. | + | 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. |
Řádek 204: | Řádek 204: | ||
{{ :2018:gsm:gsm_modul_schema.pdf |Schéma finálního přípravku (deska vpravo - sekce detaily implementace)}} | {{ :2018:gsm:gsm_modul_schema.pdf |Schéma finálního přípravku (deska vpravo - sekce detaily implementace)}} | ||
- | --- //[[xsuste08@stud.feec.vutbr.cz|Vladimír Šustek]] 2019/01/10 12:31// | + | --- //[[xsuste08@stud.feec.vutbr.cz|Vladimír Šustek]] 2019/01/14 10:14// |