LMIC ABP STM32Cubemx example

LMIC ABP STM32 example

START with this before doing ABP http://iotbyskovholm.dk/?q=content/ibm-lmic-stm32cubemx

If you want to use the LMIC and the cubemx you just have to change some lines in the main.c

Thanks to Piotr Siwy to inspire me.

Here you find the file set /sites/default/files/bluepill_ABP.zip

if you just want to change the OTAA example from the video the follow these few steps.

You have to set the keys in

Then you have to put in some lines in the initfunc

And you have to move up readsensor and the reportfunc

 

job done ...it works very good on a bluepill ....

If you want to copy paste ...you can do it from code underneath

 


/* USER CODE BEGIN PV */
// application router ID (LSBF)  < ------- IMPORTANT
static const u1_t APPEUI[8]  = { 0x5F, 0x7D, 0x02, 0xD0, 0x7E, 0xD5, 0xB3, 0x70 };
// unique device ID (LSBF)       < ------- IMPORTANT
static const u1_t DEVEUI[8]  = { 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15 };

// device-specific AES key (derived from device EUI)
static const u1_t DEVKEY[16] = { 0x17, 0xD1, 0x31, 0x96, 0xDF, 0x02, 0x9C, 0x15, 0x45, 0x0B, 0x5C, 0x50, 0xA0, 0xDD, 0xD9, 0x55 };

//   ABP
static const u1_t NWKSKEY[16] = { 0xB9, 0x08, 0xC6, 0x34, 0x13, 0x24, 0x42, 0x31, 0xC1, 0x06, 0x2C, 0x15, 0x5F, 0xA4, 0x7C, 0x99 };
static const u1_t APPSKEY[16] = { 0x61, 0x87, 0x0A, 0x09, 0xCE, 0x1B, 0xA3, 0xC2, 0x92, 0x70, 0x36, 0xDE, 0xA1, 0x58, 0x61, 0xB4 };
static const u4_t DEVADDR = 0x260117A4;
//   ABP


/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);
static void MX_TIM4_Init(void);
static void MX_USART1_UART_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

// provide application router ID (8 bytes, LSBF)
void os_getArtEui (u1_t* buf) {
    memcpy(buf, APPEUI, 8);
}

// provide device ID (8 bytes, LSBF)
void os_getDevEui (u1_t* buf) {
    memcpy(buf, DEVEUI, 8);
}

// provide device key (16 bytes)
void os_getDevKey (u1_t* buf) {
    memcpy(buf, DEVKEY, 16);
}

void initsensor(){
     // Here you init your sensors
}

u2_t readsensor(){
    u2_t value = 0xDF;    /// read from evrything ...make your own sensor
    return value;
}

static osjob_t reportjob;

// report sensor value every minute
static void reportfunc (osjob_t* j) {
    // read sensor
    u2_t val = readsensor();
    debug_val("val = ", val);
    // prepare and schedule data for transmission
    LMIC.frame[0] = val << 8;
    LMIC.frame[1] = val;
    LMIC_setTxData2(1, LMIC.frame, 2, 0); // (port 1, 2 bytes, unconfirmed)
    // reschedule job in 10 seconds
    os_setTimedCallback(j, os_getTime()+sec2osticks(5), reportfunc);
}

void initfunc (osjob_t* j) {
    // intialize sensor hardware
    initsensor();
    // reset MAC state
    LMIC_reset();
    // start joining
    LMIC_startJoining();
    // init done - onEvent() callback will be invoked...

    //   ABP
    uint8_t appskey[sizeof(APPSKEY)];
    uint8_t nwkskey[sizeof(NWKSKEY)];
    memcpy(appskey, APPSKEY, sizeof(APPSKEY));
    memcpy(nwkskey, NWKSKEY, sizeof(NWKSKEY));
    LMIC_setSession (0x1, DEVADDR, nwkskey, appskey);

    LMIC_setupChannel(0, 868100000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(1, 868300000, DR_RANGE_MAP(DR_SF12, DR_SF7B), BAND_CENTI);      // g-band
    LMIC_setupChannel(2, 868500000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(3, 867100000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(4, 867300000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(5, 867500000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(6, 867700000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(7, 867900000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(8, 868800000, DR_RANGE_MAP(DR_FSK,  DR_FSK),  BAND_MILLI);      // g2-band

    // Disable link check validation
    LMIC_setLinkCheckMode(0);
    // TTN uses SF9 for its RX2 window.
    LMIC.dn2Dr = DR_SF9;
    // Set data rate and transmit power for uplink (note: txpow seems to be ignored by the library)
    LMIC_setDrTxpow(DR_SF7,14);

    os_setTimedCallback(j, os_getTime(), reportfunc);
    //   ABP

}

//////////////////////////////////////////////////
// LMIC EVENT CALLBACK
//////////////////////////////////////////////////

void onEvent (ev_t ev) {
    debug_event(ev);

    switch(ev) {

      // network joined, session established
      case EV_JOINING:
             debug_str("try joining\r\n");
             break;
      case EV_JOINED:
          debug_led(1);
          // kick-off periodic sensor job
          reportfunc(&reportjob);
          break;
      case EV_JOIN_FAILED:
          debug_str("join failed\r\n");
          break;
      case EV_SCAN_TIMEOUT:
          debug_str("EV_SCAN_TIMEOUT\r\n");
          break;
      case EV_BEACON_FOUND:
          debug_str("EV_BEACON_FOUND\r\n");
          break;
      case EV_BEACON_MISSED:
          debug_str("EV_BEACON_MISSED\r\n");
          break;
      case EV_BEACON_TRACKED:
          debug_str("EV_BEACON_TRACKED\r\n");
          break;
      case EV_RFU1:
          debug_str("EV_RFU1\r\n");
          break;
      case EV_REJOIN_FAILED:
          debug_str("EV_REJOIN_FAILED\r\n");
          break;
      case EV_TXCOMPLETE:
          debug_str("EV_TXCOMPLETE (includes waiting for RX windows)\r\n");
          if (LMIC.txrxFlags & TXRX_ACK)
              debug_str("Received ack\r\n");
          if (LMIC.dataLen) {
              debug_str("Received ");
              debug_str(LMIC.dataLen);
              debug_str(" bytes of payload\r\n");
          }
          break;
      case EV_LOST_TSYNC:
          debug_str("EV_LOST_TSYNC\r\n");
          break;
      case EV_RESET:
          debug_str("EV_RESET\r\n");
          break;
      case EV_RXCOMPLETE:
          // data received in ping slot
          debug_str("EV_RXCOMPLETE\r\n");
          break;
      case EV_LINK_DEAD:
          debug_str("EV_LINK_DEAD\r\n");
          break;
      case EV_LINK_ALIVE:
          debug_str("EV_LINK_ALIVE\r\n");
          break;
      default:
           debug_str("Unknown event\r\n");
          break;
    }
}

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */
  

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI1_Init();
  MX_TIM4_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim4);    // <-----------  change to your setup
   __HAL_SPI_ENABLE(&hspi1);         // <-----------  change to your setup

   osjob_t initjob;

   // initialize runtime env
   os_init();

   // initialize debug library
   debug_init();
   // setup initial job
   os_setCallback(&initjob, initfunc);
   // execute scheduled jobs and events
   os_runloop();
   // (not reached)
   return 0;


  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}