wayne roberts / Mbed OS LoRaWAN_singlechannel_endnode

Dependencies:   SX127x sx12xx_hal TSL2561

Committer:
dudmuck
Date:
Thu Jul 27 17:53:37 2017 +0000
Revision:
16:915815632c1f
Parent:
10:00997daeb0c0
Child:
18:9ac71c0eb70d
simplify MAC beacon timer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudmuck 0:8f0d0ae0a077 1 /*
dudmuck 0:8f0d0ae0a077 2 / _____) _ | |
dudmuck 0:8f0d0ae0a077 3 ( (____ _____ ____ _| |_ _____ ____| |__
dudmuck 0:8f0d0ae0a077 4 \____ \| ___ | (_ _) ___ |/ ___) _ \
dudmuck 0:8f0d0ae0a077 5 _____) ) ____| | | || |_| ____( (___| | | |
dudmuck 0:8f0d0ae0a077 6 (______/|_____)_|_|_| \__)_____)\____)_| |_|
dudmuck 0:8f0d0ae0a077 7 (C)2015 Semtech
dudmuck 0:8f0d0ae0a077 8
dudmuck 0:8f0d0ae0a077 9 Description: Target board general functions implementation
dudmuck 0:8f0d0ae0a077 10
dudmuck 0:8f0d0ae0a077 11 License: Revised BSD License, see LICENSE.TXT file include in the project
dudmuck 0:8f0d0ae0a077 12
dudmuck 0:8f0d0ae0a077 13 Maintainer: Miguel Luis and Gregory Cristian
dudmuck 0:8f0d0ae0a077 14 */
dudmuck 0:8f0d0ae0a077 15 #include "mbed.h"
dudmuck 0:8f0d0ae0a077 16 #include "board.h"
dudmuck 0:8f0d0ae0a077 17
dudmuck 3:aead8f8fdc1f 18 #if defined(ENABLE_SX1272)
dudmuck 3:aead8f8fdc1f 19 SX1272MB2xAS Radio( NULL );
dudmuck 3:aead8f8fdc1f 20 #elif defined(ENABLE_SX1276)
dudmuck 3:aead8f8fdc1f 21 SX1276MB1xAS Radio( NULL );
dudmuck 3:aead8f8fdc1f 22 #endif
dudmuck 0:8f0d0ae0a077 23
dudmuck 0:8f0d0ae0a077 24 /*!
dudmuck 0:8f0d0ae0a077 25 * Nested interrupt counter.
dudmuck 0:8f0d0ae0a077 26 *
dudmuck 0:8f0d0ae0a077 27 * \remark Interrupt should only be fully disabled once the value is 0
dudmuck 0:8f0d0ae0a077 28 */
dudmuck 0:8f0d0ae0a077 29 static uint8_t IrqNestLevel = 0;
dudmuck 0:8f0d0ae0a077 30
dudmuck 0:8f0d0ae0a077 31 void BoardDisableIrq( void )
dudmuck 0:8f0d0ae0a077 32 {
dudmuck 0:8f0d0ae0a077 33 __disable_irq( );
dudmuck 0:8f0d0ae0a077 34 IrqNestLevel++;
dudmuck 0:8f0d0ae0a077 35 }
dudmuck 0:8f0d0ae0a077 36
dudmuck 0:8f0d0ae0a077 37 void BoardEnableIrq( void )
dudmuck 0:8f0d0ae0a077 38 {
dudmuck 0:8f0d0ae0a077 39 IrqNestLevel--;
dudmuck 0:8f0d0ae0a077 40 if( IrqNestLevel == 0 )
dudmuck 0:8f0d0ae0a077 41 {
dudmuck 0:8f0d0ae0a077 42 __enable_irq( );
dudmuck 0:8f0d0ae0a077 43 }
dudmuck 0:8f0d0ae0a077 44 }
dudmuck 0:8f0d0ae0a077 45
dudmuck 0:8f0d0ae0a077 46 void BoardInit( void )
dudmuck 0:8f0d0ae0a077 47 {
dudmuck 10:00997daeb0c0 48 uint32_t rtc_freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_RTC);
dudmuck 10:00997daeb0c0 49 if (rtc_freq != LSE_VALUE) {
dudmuck 10:00997daeb0c0 50 printf("bad rtc clock:%d\r\n", rtc_freq);
dudmuck 10:00997daeb0c0 51 for (;;) __NOP();
dudmuck 10:00997daeb0c0 52 }
dudmuck 0:8f0d0ae0a077 53 }
dudmuck 0:8f0d0ae0a077 54
dudmuck 0:8f0d0ae0a077 55 uint8_t BoardGetBatteryLevel( void )
dudmuck 0:8f0d0ae0a077 56 {
dudmuck 0:8f0d0ae0a077 57 return 0xFE;
dudmuck 0:8f0d0ae0a077 58 }
dudmuck 0:8f0d0ae0a077 59
dudmuck 0:8f0d0ae0a077 60 #ifdef TARGET_STM32L1 /* TARGET_NUCLEO_L152RE */
dudmuck 16:915815632c1f 61 /* 0x1ff80050: Cat1, Cat2 */
dudmuck 16:915815632c1f 62 #define ID1 ( 0x1ff800d0 ) /* Cat3, Cat4, Cat5 */
dudmuck 16:915815632c1f 63 #define ID2 ( ID1 + 0x04 )
dudmuck 16:915815632c1f 64 #define ID3 ( ID1 + 0x14 )
dudmuck 0:8f0d0ae0a077 65 DigitalOut rx_debug_pin(PC_3);
dudmuck 0:8f0d0ae0a077 66 #elif defined(TARGET_STM32L0) /* TARGET_NUCLEO_L073RZ */
dudmuck 0:8f0d0ae0a077 67 #define ID1 ( 0x1ff80050 )
dudmuck 16:915815632c1f 68 #define ID2 ( ID1 + 0x04 )
dudmuck 16:915815632c1f 69 #define ID3 ( ID1 + 0x14 )
dudmuck 9:08692264148b 70 #ifdef TARGET_DISCO_L072CZ_LRWAN1
dudmuck 1:53c30224eda8 71 DigitalOut rx_debug_pin(PA_0);
dudmuck 1:53c30224eda8 72 #else
dudmuck 1:53c30224eda8 73 DigitalOut rx_debug_pin(PC_3);
dudmuck 1:53c30224eda8 74 #endif
dudmuck 16:915815632c1f 75 #elif defined(TARGET_STM32L4) /* TARGET_NUCLEO_L476RG */
dudmuck 16:915815632c1f 76 #define ID1 ( 0x1fff7590 )
dudmuck 16:915815632c1f 77 #define ID2 ( ID1 + 0x04 )
dudmuck 16:915815632c1f 78 #define ID3 ( ID1 + 0x08 )
dudmuck 16:915815632c1f 79 DigitalOut rx_debug_pin(PC_3);
dudmuck 0:8f0d0ae0a077 80 #else
dudmuck 0:8f0d0ae0a077 81 #error "provide signature address for target"
dudmuck 0:8f0d0ae0a077 82 #endif
dudmuck 0:8f0d0ae0a077 83
dudmuck 0:8f0d0ae0a077 84 void BoardGetUniqueId( uint8_t *id )
dudmuck 0:8f0d0ae0a077 85 {
dudmuck 0:8f0d0ae0a077 86 id[7] = ( ( *( uint32_t* )ID1 )+ ( *( uint32_t* )ID3 ) ) >> 24;
dudmuck 0:8f0d0ae0a077 87 id[6] = ( ( *( uint32_t* )ID1 )+ ( *( uint32_t* )ID3 ) ) >> 16;
dudmuck 0:8f0d0ae0a077 88 id[5] = ( ( *( uint32_t* )ID1 )+ ( *( uint32_t* )ID3 ) ) >> 8;
dudmuck 0:8f0d0ae0a077 89 id[4] = ( ( *( uint32_t* )ID1 )+ ( *( uint32_t* )ID3 ) );
dudmuck 0:8f0d0ae0a077 90 id[3] = ( ( *( uint32_t* )ID2 ) ) >> 24;
dudmuck 0:8f0d0ae0a077 91 id[2] = ( ( *( uint32_t* )ID2 ) ) >> 16;
dudmuck 0:8f0d0ae0a077 92 id[1] = ( ( *( uint32_t* )ID2 ) ) >> 8;
dudmuck 0:8f0d0ae0a077 93 id[0] = ( ( *( uint32_t* )ID2 ) );
dudmuck 0:8f0d0ae0a077 94 }
dudmuck 0:8f0d0ae0a077 95
dudmuck 1:53c30224eda8 96 #define UART_TX_BUF_SIZE 256
dudmuck 1:53c30224eda8 97 char uart_tx_buf[UART_TX_BUF_SIZE];
dudmuck 16:915815632c1f 98 volatile unsigned uart_tx_buf_in;
dudmuck 16:915815632c1f 99 volatile unsigned uart_tx_buf_out;
dudmuck 16:915815632c1f 100 volatile bool uart_full;
dudmuck 1:53c30224eda8 101
dudmuck 1:53c30224eda8 102 #define PRINT_BUF_SIZE 96
dudmuck 1:53c30224eda8 103 int
dudmuck 1:53c30224eda8 104 isr_printf( const char* format, ... )
dudmuck 1:53c30224eda8 105 {
dudmuck 1:53c30224eda8 106 va_list arg;
dudmuck 1:53c30224eda8 107 char print_buf[PRINT_BUF_SIZE];
dudmuck 1:53c30224eda8 108 unsigned int i, printed_length;
dudmuck 1:53c30224eda8 109
dudmuck 1:53c30224eda8 110 va_start(arg, format);
dudmuck 1:53c30224eda8 111 printed_length = vsnprintf(print_buf, PRINT_BUF_SIZE, format, arg);
dudmuck 1:53c30224eda8 112 va_end(arg);
dudmuck 1:53c30224eda8 113
dudmuck 1:53c30224eda8 114 for (i = 0; i < printed_length; i ++) {
dudmuck 1:53c30224eda8 115 uart_tx_buf[uart_tx_buf_in] = print_buf[i];
dudmuck 1:53c30224eda8 116 if (++uart_tx_buf_in == UART_TX_BUF_SIZE)
dudmuck 1:53c30224eda8 117 uart_tx_buf_in = 0;
dudmuck 16:915815632c1f 118 if (uart_tx_buf_in == uart_tx_buf_out)
dudmuck 16:915815632c1f 119 uart_full = true;
dudmuck 1:53c30224eda8 120 }
dudmuck 1:53c30224eda8 121
dudmuck 1:53c30224eda8 122 return i;
dudmuck 1:53c30224eda8 123 }
dudmuck 1:53c30224eda8 124
dudmuck 7:e238827f0e47 125 RawSerial pc( USBTX, USBRX );
dudmuck 7:e238827f0e47 126
dudmuck 1:53c30224eda8 127 void bottom_half()
dudmuck 1:53c30224eda8 128 {
dudmuck 16:915815632c1f 129 unsigned in = uart_tx_buf_in;
dudmuck 16:915815632c1f 130
dudmuck 16:915815632c1f 131 while (in != uart_tx_buf_out) {
dudmuck 1:53c30224eda8 132 pc.putc(uart_tx_buf[uart_tx_buf_out]);
dudmuck 1:53c30224eda8 133 if (++uart_tx_buf_out == UART_TX_BUF_SIZE)
dudmuck 1:53c30224eda8 134 uart_tx_buf_out = 0;
dudmuck 1:53c30224eda8 135 }
dudmuck 16:915815632c1f 136
dudmuck 16:915815632c1f 137 if (uart_full) {
dudmuck 16:915815632c1f 138 uart_full = false;
dudmuck 16:915815632c1f 139 pc.printf("<FULL>");
dudmuck 16:915815632c1f 140 }
dudmuck 1:53c30224eda8 141 }