added lorawan example in IAR, and added support for LIS3MDL and LPS22HB sensors

1. modified the HTS221: removed magic numbers, added a sensor_tempnhumi_t struct to accommodate temperature and humidity data
2. added .h and .c files for LIS3MDL magnetic sensor
3. added .h and .c files for LPS22HB pressure sensor
3. added IAR (EWARM) project for lorawan example
4. added bsp.c and bsp.h to manager the sensors
This commit is contained in:
Winfred LIN
2020-03-31 17:48:27 +11:00
parent a3078ac232
commit da5884920a
19 changed files with 8101 additions and 1494 deletions

2
.gitignore vendored
View File

@@ -32,3 +32,5 @@ board/*/MDK-ARM/*.uvguix.*
board/*/MDK-ARM/EventRecorderStub.scvd
board/*/MDK-ARM/*/*.htm
board/*/MDK-ARM/*/*.build_log.htm
Obj/*
Debug/*

View File

@@ -0,0 +1,35 @@
/**
******************************************************************************
* @file bsp.c
* @author jieranzhi
* @brief provide high level interfaces to manage the sensors on the
* application, this is a modified version of the official api
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "bsp.h"
void BSP_Sensor_Init(void)
{
/* Initialize sensors */
HTS221_Init();
LPS22HB_Init();
LIS3MDL_Init();
}
void BSP_Sensor_Read(sensor_data_t *sensor_data)
{
sensor_tempnhumi_t tempnhumi_sensor;
sensor_press_t press_sensor;
sensor_magn_t magn_sensor;
HTS221_Get_TemperatureAndHumidity(&tempnhumi_sensor);
LPS22HB_Get_Press(&press_sensor);
LIS3MDL_Get_Magn(&magn_sensor);
sensor_data->sensor_press = press_sensor;
sensor_data->sensor_tempnhumi = tempnhumi_sensor;
sensor_data->sensor_magn = magn_sensor;
}

View File

@@ -0,0 +1,89 @@
/*
/ _____) _ | |
( (____ _____ ____ _| |_ _____ ____| |__
\____ \| ___ | (_ _) ___ |/ ___) _ \
_____) ) ____| | | || |_| ____( (___| | | |
(______/|_____)_|_|_| \__)_____)\____)_| |_|
(C)2013 Semtech
Description: contains all hardware driver
License: Revised BSD License, see LICENSE.TXT file include in the project
Maintainer: Miguel Luis and Gregory Cristian
*/
/**
******************************************************************************
* @file bsp.h
* @author MCD Application Team
* @brief contains all hardware driver
******************************************************************************
* @attention
*
* <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
* SLA0044, the "License"; You may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* www.st.com/SLA0044
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_H__
#define __BSP_H__
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include "HTS221.h"
#include "LPS22HB.h"
#include "LIS3MDL.h"
/* Exported types ------------------------------------------------------------*/
typedef struct
{
sensor_press_t sensor_press; /* pressure sensor */
sensor_tempnhumi_t sensor_tempnhumi; /* temperature and humidity */
sensor_magn_t sensor_magn; /* magnetometer */
//--------------------------- accelerator and gyroscope -------------------//
int16_t accel_x; /* in g */
int16_t accel_y; /* in g */
int16_t accel_z; /* in g */
int16_t gyro_x; /* in degree/s */
int16_t gyro_y; /* in degree/s */
int16_t gyro_z; /* in degree/s */
} sensor_data_t;
/* Exported constants --------------------------------------------------------*/
/* External variables --------------------------------------------------------*/
/* Exported macros -----------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
/**
* @brief initialises the sensor
*
* @note
* @retval None
*/
void BSP_Sensor_Init(void);
/**
* @brief sensor read.
*
* @note none
* @retval sensor_data
*/
void BSP_Sensor_Read(sensor_data_t *sensor_data);
#ifdef __cplusplus
}
#endif
#endif /* __BSP_H__ */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -2,7 +2,8 @@
* @breif HTS221<32><31><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
* @author Mculover666(www.mculover666.cn)
* @date 2019-12-27
* @version 1.0.0
* @modified by jieranzhi 2020/03/23
* @version 1.0.1
********************************************/
#include <HTS221.h>
@@ -15,7 +16,7 @@ void HTS221_Init()
//<2F><><EFBFBD>÷ֱ<C3B7><D6B1><EFBFBD>
cmd = 0x3F;
HAL_I2C_Mem_Write(&hi2c1, HTS221_ADDR_WR, 0x10, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 0xFFFF);
HAL_I2C_Mem_Write(&hi2c1, HTS221_ADDR_WR, HTS221_AV_CONF, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 0xFFFF);
//<2F><><EFBFBD>õ<EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cmd = 0x84;
@@ -57,11 +58,11 @@ uint8_t HTS221_Get_Temperature(int16_t* temperature)
int32_t tmp32;
/*1. <20><>ȡT0_degC_x8 <20><> T1_degC_x8 У<><D0A3>ֵ */
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, 0x32, I2C_MEMADD_SIZE_8BIT, &T0_degC_x8, 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, 0x33, I2C_MEMADD_SIZE_8BIT, &T1_degC_x8, 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, HTS221_T0_degC_x8, I2C_MEMADD_SIZE_8BIT, &T0_degC_x8, 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, HTS221_T1_degC_x8, I2C_MEMADD_SIZE_8BIT, &T1_degC_x8, 1, 0xFFFF);
/*2. <20><>ȡT1_degC <20><> T0_degC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ*/
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, 0x35, I2C_MEMADD_SIZE_8BIT, &tmp, 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, HTS221_T1_T0_msb, I2C_MEMADD_SIZE_8BIT, &tmp, 1, 0xFFFF);
// <20><><EFBFBD><EFBFBD>T0_degC and T1_degC ֵ */
T0_degC_x8_u16 = (((uint16_t)(tmp & 0x03)) << 8) | ((uint16_t)T0_degC_x8);
@@ -70,10 +71,10 @@ uint8_t HTS221_Get_Temperature(int16_t* temperature)
T1_degC = T1_degC_x8_u16>>3;
/*3. <20><>ȡ T0_OUT <20><> T1_OUT ֵ */
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, 0x3C, I2C_MEMADD_SIZE_8BIT, &buffer[0], 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, 0x3D, I2C_MEMADD_SIZE_8BIT, &buffer[1], 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, 0x3E, I2C_MEMADD_SIZE_8BIT, &buffer[0], 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, 0x3F, I2C_MEMADD_SIZE_8BIT, &buffer[1], 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, HTS221_T0_OUT_L, I2C_MEMADD_SIZE_8BIT, &buffer[0], 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, HTS221_T0_OUT_H, I2C_MEMADD_SIZE_8BIT, &buffer[1], 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, HTS221_T1_OUT_L, I2C_MEMADD_SIZE_8BIT, &buffer[0], 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, HTS221_T1_OUT_H, I2C_MEMADD_SIZE_8BIT, &buffer[1], 1, 0xFFFF);
T0_out = (((uint16_t)buffer[1])<<8) | (uint16_t)buffer[0];
T1_out = (((uint16_t)buffer[3])<<8) | (uint16_t)buffer[2];
@@ -90,8 +91,8 @@ uint8_t HTS221_Get_Temperature(int16_t* temperature)
T_out = (((uint16_t)buffer[1])<<8) | (uint16_t)buffer[0];
/* 5. ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>㵱ǰ<E3B5B1><C7B0>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ֵ */
tmp32 = ((int32_t)(T_out - T0_out)) * ((int32_t)(T1_degC - T0_degC)*10);
*temperature = tmp32 /(T1_out - T0_out) + T0_degC*10;
tmp32 = ((int32_t)(T_out - T0_out)) * ((int32_t)(T1_degC - T0_degC));
*temperature = tmp32*10 /(T1_out - T0_out) + T0_degC*10;
return 0;
}
@@ -108,24 +109,24 @@ uint8_t HTS221_Get_Humidity(int16_t* humidity)
/* 1. <20><>ȡH0_rH and H1_rH У<><D0A3>ֵ */
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, 0x30, I2C_MEMADD_SIZE_8BIT, &buffer[0], 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, 0x31, I2C_MEMADD_SIZE_8BIT, &buffer[1], 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, HTS221_H0_rH_x2, I2C_MEMADD_SIZE_8BIT, &buffer[0], 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, HTS221_H1_rH_x2, I2C_MEMADD_SIZE_8BIT, &buffer[1], 1, 0xFFFF);
H0_rh = buffer[0] >> 1;
H1_rh = buffer[1] >> 1;
/*2. <20><>ȡ H0_T0_OUT У<><D0A3>ֵ */
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, 0x36, I2C_MEMADD_SIZE_8BIT, &buffer[0], 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, 0x37, I2C_MEMADD_SIZE_8BIT, &buffer[1], 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, HTS221_H0_T0_OUT_L, I2C_MEMADD_SIZE_8BIT, &buffer[0], 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, HTS221_H0_T0_OUT_H, I2C_MEMADD_SIZE_8BIT, &buffer[1], 1, 0xFFFF);
H0_T0_out = (((uint16_t)buffer[1])<<8) | (uint16_t)buffer[0];
/*3. <20><>ȡ H1_T0_OUT У<><D0A3>ֵ */
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, 0x3A, I2C_MEMADD_SIZE_8BIT, &buffer[0], 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, 0x3B, I2C_MEMADD_SIZE_8BIT, &buffer[1], 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, HTS221_H1_T0_OUT_L, I2C_MEMADD_SIZE_8BIT, &buffer[0], 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, HTS221_H1_T0_OUT_H, I2C_MEMADD_SIZE_8BIT, &buffer[1], 1, 0xFFFF);
H1_T0_out = (((uint16_t)buffer[1])<<8) | (uint16_t)buffer[0];
/*4. <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>ȡת<C8A1><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ */
HTS221_Start();
while(status_dat != 0x03)
while(status_dat != (HTS221_T_DA|HTS221_H_DA))
{
HAL_I2C_Mem_Read(&hi2c1, HTS221_ADDR_RD, HTS221_STATUS_REG, I2C_MEMADD_SIZE_8BIT, &status_dat, 1, 0xFFFF);
}
@@ -145,3 +146,20 @@ uint8_t HTS221_Get_Humidity(int16_t* humidity)
return 0;
}
/* <20><>ȡHT221<32><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sensor<6F><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
uint8_t HTS221_Get_TemperatureAndHumidity(sensor_tempnhumi_t* tempnhumi_sensor)
{
int16_t temperature;
int16_t humidity;
HTS221_Get_Temperature(&temperature);
HTS221_Get_Humidity(&humidity);
tempnhumi_sensor->temp_sensitivity = 64;
tempnhumi_sensor->temperature = temperature;
tempnhumi_sensor->humi_sensitivity = 256;
tempnhumi_sensor->humidity = humidity;
return 0;
}

View File

@@ -10,6 +10,7 @@
#define HTS221_CTRL_REG2 0x21
#define HTS221_CTRL_REG3 0x22
#define HTS221_AV_CONF 0x10
#define HTS221_STATUS_REG 0x27
#define HTS221_HUMIDITY_OUT_L 0x28
@@ -17,9 +18,45 @@
#define HTS221_TEMP_OUT_L 0x2A
#define HTS221_TEMP_OUT_H 0x2B
void HTS221_Init(void);
#define HTS221_H0_rH_x2 0x30
#define HTS221_H1_rH_x2 0x31
#define HTS221_H0_T0_OUT_L 0x36
#define HTS221_H0_T0_OUT_H 0x37
#define HTS221_H1_T0_OUT_L 0x3A
#define HTS221_H1_T0_OUT_H 0x3B
#define HTS221_T0_degC_x8 0x32
#define HTS221_T1_degC_x8 0x33
#define HTS221_T1_T0_msb 0x35
#define HTS221_T0_OUT_L 0x3C
#define HTS221_T0_OUT_H 0x3D
#define HTS221_T1_OUT_L 0x3E
#define HTS221_T1_OUT_H 0x3F
/**
* @brief temperature & humidity sensor structures definition
* added by jieranzhi, 2020/03/29
*/
typedef struct
{
uint8_t temp_sensitivity;
int16_t temperature;
uint16_t humi_sensitivity;
int16_t humidity;
}sensor_tempnhumi_t;
/**
* @brief STATUS structures definition
*/
typedef enum
{
HTS221_T_DA = 0x01U, /*!< temperature data available */
HTS221_H_DA = 0x02U, /*!< humidity data available */
}HTS221_StatusTypeDef;
void HTS221_Init(void);
uint8_t HTS221_Get_Temperature(int16_t* temperature);
uint8_t HTS221_Get_Humidity(int16_t* humidity);
uint8_t HTS221_Get_TemperatureAndHumidity(sensor_tempnhumi_t* tempnhumi_sensor);
#endif /* _HTS221_H_ */

View File

@@ -0,0 +1,136 @@
/**
******************************************************************************
* @file LIS3MDL.c
* @author jieranzhi
* @update 2020/03/23 19:00 CST
* @brief This file provides code for the LIS3MDL Initialization
* and data output codes.
******************************************************************************
* @attention
*
* 1. this code is used as one of the examples in TencentOS_tiny project, it's
* just a simple implementation of the sensor functionalities, to implement
* more functions, please refer to the datasheet or the official software
* package provided by ST (STM32CubeExpansion_LRWAN_V1.3.1)
*
* 2. in this file the host MCU will to read the output persistently, which is
* NOT of power efficient.
*
******************************************************************************
*/
#include <LIS3MDL.h>
#include <i2c.h>
// initialization of LIS3MDL
void LIS3MDL_Init()
{
uint8_t cmd = 0;
// enable temperature sensor(temperature compensation);X and Y axes operative
// mode(Medium-performance); Output data rate(10Hz); disable high data rate
// disable Self-test
cmd = 0xB0;
HAL_I2C_Mem_Write(&hi2c1, LIS3MDL_ADDR_WR, LIS3MDL_CTRL_REG1, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 0xFFFF);
// Full-scale:+/-4gauss; Reboot memory(normal)
cmd = 0x00;
HAL_I2C_Mem_Write(&hi2c1, LIS3MDL_ADDR_WR, LIS3MDL_CTRL_REG2, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 0xFFFF);
// disable lowpower mode; Operating mode (continuous mode)
cmd = 0x00;
HAL_I2C_Mem_Write(&hi2c1, LIS3MDL_ADDR_WR, LIS3MDL_CTRL_REG3, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 0xFFFF);
// Z-axis operative mode (Medium-performance)
cmd = 0x04;
HAL_I2C_Mem_Write(&hi2c1, LIS3MDL_ADDR_WR, LIS3MDL_CTRL_REG4, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 0xFFFF);
// disable FAST READ; data block update(continuous)
cmd = 0x40;
HAL_I2C_Mem_Write(&hi2c1, LIS3MDL_ADDR_WR, LIS3MDL_CTRL_REG5, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 0xFFFF);
}
// get fullscale configuration
LIS3MDL_FullScaleTypeDef LIS3MDL_Get_FullScale()
{
uint8_t fullscale;
HAL_I2C_Mem_Read(&hi2c1, LIS3MDL_ADDR_RD, LIS3MDL_CTRL_REG2, I2C_MEMADD_SIZE_8BIT, &fullscale, 1, 0xFFFF);
fullscale = (fullscale<<1)>>6;
return (LIS3MDL_FullScaleTypeDef)fullscale;
}
// set fullscale of the sensor
void LIS3MDL_Set_FullScale(LIS3MDL_FullScaleTypeDef fullscale)
{
uint8_t ctrl_reg2_value;
uint8_t fullscale_config = (uint8_t)fullscale;
HAL_I2C_Mem_Read(&hi2c1, LIS3MDL_ADDR_RD, LIS3MDL_CTRL_REG2, I2C_MEMADD_SIZE_8BIT, &ctrl_reg2_value, 1, 0xFFFF);
fullscale_config = (ctrl_reg2_value&0x9F)|(fullscale_config<<5);
HAL_I2C_Mem_Write(&hi2c1, LIS3MDL_ADDR_WR, LIS3MDL_CTRL_REG2, I2C_MEMADD_SIZE_8BIT, &fullscale_config, 1, 0xFFFF);
}
// calculate the sensitivity per fullscale
uint16_t LIS3MDL_Get_Sensitivity(LIS3MDL_FullScaleTypeDef fullscale)
{
uint16_t sensitivity = 1;
switch(fullscale)
{
case FULLSCALE_4:{
sensitivity = 6842;
break;
}
case FULLSCALE_8:{
sensitivity = 3421;
break;
}
case FULLSCALE_12:{
sensitivity = 2281;
break;
}
case FULLSCALE_16:{
sensitivity = 1711;
break;
}
default:{
sensitivity = 1;
}
}
return sensitivity;
}
// start a new acquisition by enabling the one-shot bit in the LIS3MDL_CTRL_REG2
// and read the magnetic field from the sensor
uint8_t LIS3MDL_Get_Magn(sensor_magn_t* magn_sensor)
{
uint8_t status_dat = 0;
uint8_t magn_x_out_l = 0;
uint8_t magn_x_out_h = 0;
uint8_t magn_y_out_l = 0;
uint8_t magn_y_out_h = 0;
uint8_t magn_z_out_l = 0;
uint8_t magn_z_out_h = 0;
// get fullscale and sensitivity
LIS3MDL_FullScaleTypeDef fullscale = LIS3MDL_Get_FullScale();
magn_sensor->fullscale = (uint8_t)fullscale;
magn_sensor->sensitivity = LIS3MDL_Get_Sensitivity(fullscale);
// wait until the data is ready
while((status_dat&LIS3MDL_ZYXDA) != LIS3MDL_ZYXDA)
{
HAL_I2C_Mem_Read(&hi2c1, LIS3MDL_ADDR_RD, LIS3MDL_STATUS_REG, I2C_MEMADD_SIZE_8BIT, &status_dat, 1, 0xFFFF);
}
HAL_I2C_Mem_Read(&hi2c1, LIS3MDL_ADDR_RD, LIS3MDL_X_OUT_L, I2C_MEMADD_SIZE_8BIT, &magn_x_out_l, 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, LIS3MDL_ADDR_RD, LIS3MDL_X_OUT_H, I2C_MEMADD_SIZE_8BIT, &magn_x_out_h, 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, LIS3MDL_ADDR_RD, LIS3MDL_Y_OUT_L, I2C_MEMADD_SIZE_8BIT, &magn_y_out_l, 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, LIS3MDL_ADDR_RD, LIS3MDL_Y_OUT_H, I2C_MEMADD_SIZE_8BIT, &magn_y_out_h, 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, LIS3MDL_ADDR_RD, LIS3MDL_Z_OUT_L, I2C_MEMADD_SIZE_8BIT, &magn_z_out_l, 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, LIS3MDL_ADDR_RD, LIS3MDL_Z_OUT_H, I2C_MEMADD_SIZE_8BIT, &magn_z_out_h, 1, 0xFFFF);
magn_sensor->magn_x = (uint16_t)magn_x_out_h<<8|magn_x_out_l;
magn_sensor->magn_y = (uint16_t)magn_y_out_h<<8|magn_y_out_l;
magn_sensor->magn_z = (uint16_t)magn_z_out_h<<8|magn_z_out_l;
return 0;
}

View File

@@ -0,0 +1,93 @@
/**
******************************************************************************
* @file LIS3MDL.h
* @author jieranzhi (the developer)
* @update 2020/03/23 19:00 CST
* @brief This file contains basic functions prototypes and pre-definitions
* of the register addresses
******************************************************************************
* @attention
*
* 1. the temperature sensor embedded in the LIS3MDL is intended to be embedded
* temperature compensation. Therefore, in this file we DO NOT include the
* temperature output
*
* 2. on the P-NUCLEO-LRWAN3, the SDO/SA0 pad is connected to voltage supply(
* via a resistor), LSb is <20><>1<EFBFBD><31> (address 1011101b)
*
* 3. for more information, please refer to the datasheet
* (https://www.st.com/resource/en/datasheet/lis3mdl.pdf)
*
******************************************************************************
*/
#ifndef _LIS3MDL_H_
#define _LIS3MDL_H_
#include <stm32l0xx_hal.h>
/* Registers -----------------------------------------------------------------*/
#define LIS3MDL_ADDR_WR 0x3C
#define LIS3MDL_ADDR_RD 0x3D
#define LIS3MDL_CTRL_REG1 0x20
#define LIS3MDL_CTRL_REG2 0x21
#define LIS3MDL_CTRL_REG3 0x22
#define LIS3MDL_CTRL_REG4 0x23
#define LIS3MDL_CTRL_REG5 0x24
#define LIS3MDL_STATUS_REG 0x27
#define LIS3MDL_X_OUT_L 0x28
#define LIS3MDL_X_OUT_H 0x29
#define LIS3MDL_Y_OUT_L 0x2A
#define LIS3MDL_Y_OUT_H 0x2B
#define LIS3MDL_Z_OUT_L 0x2C
#define LIS3MDL_Z_OUT_H 0x2D
/* Enumeration ---------------------------------------------------------------*/
/**
* @brief STATUS structures definition
*/
typedef enum
{
LIS3MDL_ZYXOR = 0x80U, /*!< XYZ-axis data overrun */
LIS3MDL_ZOR = 0x40U, /*!< Z-axis data overrun */
LIS3MDL_YOR = 0x20U, /*!< Y-axis data overrun */
LIS3MDL_XOR = 0x10U, /*!< X-axis data overrun */
LIS3MDL_ZYXDA = 0x08U, /*!< XYZ-axis data available */
LIS3MDL_ZDA = 0x04U, /*!< Z-axis data available */
LIS3MDL_YDA = 0x02U, /*!< Y-axis data available */
LIS3MDL_XDA = 0x01U, /*!< X-axis data available */
}LIS3MDL_StatusTypeDef;
/**
* @brief STATUS structures definition
*/
typedef enum
{
FULLSCALE_4 = 0x00U,
FULLSCALE_8 = 0x01U,
FULLSCALE_12 = 0x02U,
FULLSCALE_16 = 0x03U
}LIS3MDL_FullScaleTypeDef;
/**
* @brief magnetic sensor structures definition
*/
typedef struct
{
uint8_t fullscale; // fullscale of magnetometer
uint16_t sensitivity; // sensitivity per fullscale
uint16_t magn_x; // X-magnetic value in LSB
uint16_t magn_y; // Y-magnetic value in LSB
uint16_t magn_z; // Z-magnetic value in LSB
}sensor_magn_t;
/* Functions -----------------------------------------------------------------*/
void LIS3MDL_Init(void);
void LIS3MDL_Set_FullScale(LIS3MDL_FullScaleTypeDef fullscale);
LIS3MDL_FullScaleTypeDef LIS3MDL_Get_FullScale(void);
uint16_t LIS3MDL_Get_Sensitivity(LIS3MDL_FullScaleTypeDef fullscale);
uint8_t LIS3MDL_Get_Magn(sensor_magn_t* magn_sensor);
#endif /* _LIS3MDL_H_ */

View File

@@ -0,0 +1,79 @@
/**
******************************************************************************
* @file LPS22HB.c
* @author jieranzhi
* @update 2020/03/23 19:00 CST
* @brief This file provides code for the LPS22HB Initialization
* and data output codes.
******************************************************************************
* @attention
*
* 1. this code is used as one of the examples in TencentOS_tiny project, it's
* just a simple implementation of the sensor functionalities, to implement
* more functions, please refer to the datasheet or the official software
* package provided by ST (STM32CubeExpansion_LRWAN_V1.3.1)
*
* 2. in this file the host MCU need to read the output persistently, which is
* not of power efficient, to achieve better power consumption performance,
* it is recommended to use FIFO.
*
******************************************************************************
*/
#include <LPS22HB.h>
#include <i2c.h>
// initialization of LPS22HB
void LPS22HB_Init()
{
uint8_t cmd = 0;
// reset the Low-power mode configuration
cmd = 0x00;
HAL_I2C_Mem_Write(&hi2c1, LPS22HB_ADDR_WR, LPS22HB_RES_CONF_REG, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 0xFFFF);
// setup data rate(power down, 000); disable lowpass filter (we use one-shot in this case); Block data update(continuous)
cmd = 0x00;
HAL_I2C_Mem_Write(&hi2c1, LPS22HB_ADDR_WR, LPS22HB_CTRL_REG1, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 0xFFFF);
// reboot mode(normal); disable FIFO; enable IF_ADD_INC; enable I2C; software reset mode(normal); one-shot mode(idle)
cmd = 0x10;
HAL_I2C_Mem_Write(&hi2c1, LPS22HB_ADDR_WR, LPS22HB_CTRL_REG2, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 0xFFFF);
// interupt control: set to default value (0x00)
cmd = 0x00;
HAL_I2C_Mem_Write(&hi2c1, LPS22HB_ADDR_WR, LPS22HB_CTRL_REG3, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 0xFFFF);
}
// enable one-shot to start a new acquisition (conversion)
static void LPS22HB_Start()
{
uint8_t cmd = 0;
HAL_I2C_Mem_Read(&hi2c1, LPS22HB_ADDR_RD, LPS22HB_CTRL_REG2, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 0xFFFF);
cmd |= 0x01;
HAL_I2C_Mem_Write(&hi2c1, LPS22HB_ADDR_WR, LPS22HB_CTRL_REG2, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 0xFFFF);
}
// start a new acquisition by enabling the one-shot bit in the LPS22HB_CTRL_REG2
// and read the pressure from the sensor
uint8_t LPS22HB_Get_Press(sensor_press_t* press_sensor)
{
uint8_t status_dat = 0;
uint8_t pressure_out_l = 0;
uint8_t pressure_out_h = 0;
uint8_t pressure_out_xl = 0;
press_sensor->sensitivity = 4096;
LPS22HB_Start();
while((status_dat&LPS22HB_P_DA) != LPS22HB_P_DA)
{
HAL_I2C_Mem_Read(&hi2c1, LPS22HB_ADDR_RD, LPS22HB_STATUS_REG, I2C_MEMADD_SIZE_8BIT, &status_dat, 1, 0xFFFF);
}
HAL_I2C_Mem_Read(&hi2c1, LPS22HB_ADDR_RD, LPS22HB_PRESS_OUT_XL, I2C_MEMADD_SIZE_8BIT, &pressure_out_xl, 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, LPS22HB_ADDR_RD, LPS22HB_PRESS_OUT_L, I2C_MEMADD_SIZE_8BIT, &pressure_out_l, 1, 0xFFFF);
HAL_I2C_Mem_Read(&hi2c1, LPS22HB_ADDR_RD, LPS22HB_PRESS_OUT_H, I2C_MEMADD_SIZE_8BIT, &pressure_out_h, 1, 0xFFFF);
press_sensor->pressure = (((uint32_t)pressure_out_h<<16) | ((uint16_t)pressure_out_l<<8) | pressure_out_xl);
return 0;
}

View File

@@ -0,0 +1,68 @@
/**
******************************************************************************
* @file LPS22HB.h
* @author jieranzhi (the developer)
* @update 2020/03/23 19:00 CST
* @brief This file contains basic functions prototypes and pre-definitions
* of the register addresses
******************************************************************************
* @attention
*
* 1. the temperature sensor embedded in the LPS22HB is intended to be embedded
* temperature compensation. Therefore, in this file we DO NOT include the
* temperature output
*
* 2. on the P-NUCLEO-LRWAN3, the SDO/SA0 pad is connected to voltage supply(
* via a resistor), LSb is <20><>1<EFBFBD><31> (address 1011101b)
*
* 3. for more information, please refer to the datasheet
* (https://www.st.com/resource/en/datasheet/dm00140895.pdf)
*
******************************************************************************
*/
#ifndef _LPS22HB_H_
#define _LPS22HB_H_
#include <stm32l0xx_hal.h>
/* Registers -----------------------------------------------------------------*/
#define LPS22HB_ADDR_WR 0xBA
#define LPS22HB_ADDR_RD 0xBB
#define LPS22HB_CTRL_REG1 0x10
#define LPS22HB_CTRL_REG2 0x11
#define LPS22HB_CTRL_REG3 0x12
#define LPS22HB_RES_CONF_REG 0x1A
#define LPS22HB_STATUS_REG 0x27
#define LPS22HB_PRESS_OUT_XL 0x28
#define LPS22HB_PRESS_OUT_L 0x29
#define LPS22HB_PRESS_OUT_H 0x2A
/* Enumeration ---------------------------------------------------------------*/
/**
* @brief STATUS structures definition
*/
typedef enum
{
LPS22HB_T_OR = 0x20, /*!< temperature overrun */
LPS22HB_P_OR = 0x10, /*!< pressure overrun */
LPS22HB_T_DA = 0x02, /*!< new temperature data available */
LPS22HB_P_DA = 0x01, /*!< new pressure data available */
}LPS22HB_StatusTypeDef;
/**
* @brief pressure sensor structures definition
*/
typedef struct
{
uint16_t sensitivity; // sensitivity per fullscale
uint32_t pressure; // X-magnetic value in LSB
}sensor_press_t;
/* Functions -----------------------------------------------------------------*/
void LPS22HB_Init(void);
uint8_t LPS22HB_Get_Press(sensor_press_t* press_sensor);
#endif /* _LPS22HB_H_ */

View File

@@ -1,6 +1,7 @@
#include "lora_demo.h"
#include "HTS221.h"
#include "RHF76.h"
#include <Math.h>
#include "bsp.h"
/*
==================================================================================
@@ -54,9 +55,18 @@
uint16_t report_period = 10;
typedef struct device_data_st {
uint8_t temperature;
uint8_t humidity;
uint8_t magn_fullscale; // fullscale of magnetometer
uint8_t temp_sensitivity;
uint16_t humi_sensitivity;
uint16_t press_sensitivity;
uint16_t magn_sensitivity; // sensitivity per fullscale
int16_t temperature;
int16_t humidity;
int16_t magn_x; // X-magnetic value in LSB
int16_t magn_y; // Y-magnetic value in LSB
int16_t magn_z; // Z-magnetic value in LSB
uint16_t period;
uint32_t pressure;
} __PACKED__ dev_data_t;
typedef struct device_data_wrapper_st {
@@ -86,29 +96,103 @@ void recv_callback(uint8_t *data, uint8_t len)
printf("report_period: %d\n", report_period);
}
void print_to_screen(sensor_data_t sensor_data)
{
float pressure = sensor_data.sensor_press.pressure*1.0/sensor_data.sensor_press.sensitivity;
float altitude = (pow(1013.25/pressure,1.0/5.257) - 1)*((int16_t)sensor_data.sensor_tempnhumi.temperature/10.0+273.15)/0.0065;
printf("temperature: %2.2f\n", (int16_t)sensor_data.sensor_tempnhumi.temperature / 10.0);
printf("humidity : %2.2f\n", sensor_data.sensor_tempnhumi.humidity / 10.0);
printf("pressure : %2.2f,\t altitude: %2.2f\n", pressure, altitude);
printf("magn : %2.3f, %2.3f, %2.3f\n",
(int16_t)sensor_data.sensor_magn.magn_x*1.0/sensor_data.sensor_magn.sensitivity,
(int16_t)sensor_data.sensor_magn.magn_y*1.0/sensor_data.sensor_magn.sensitivity,
(int16_t)sensor_data.sensor_magn.magn_z*1.0/sensor_data.sensor_magn.sensitivity);
}
/**
* @brief application entry
* @modified by jieranzhi 2020/03/31
* @note following javascript code snippet demonstrate how to correctly
* decode the data passed to Tencent cloud
****************************** CODE START *****************************
function RawToProtocol(fPort, bytes)
{
var data ={
"method": "report",
"clientToken": new Date(),
"params": {}
}
var magnFullscale = bytes[0];
switch(magnFullscale)
{
case 0:
data.params.magnFullscale = 4;
break;
case 1:
data.params.magnFullscale = 8;
break;
case 2:
data.params.magnFullscale = 12;
break;
case 3:
data.params.magnFullscale = 16;
break;
}
var tempSensitivity = bytes[1];
var humiSensitivity = bytes[2] | (bytes[3]<<8);
var presSensitivity = bytes[4] | (bytes[5]<<8);
var magnSensitivity = bytes[6] | (bytes[7]<<8);
data.params.temperature = (convertToInt16(bytes[8] | (bytes[9]<<8))*1.0/10).toFixed(2);
data.params.humidity = ((bytes[10] | (bytes[11]<<8))*1.0/10).toFixed(2);
data.params.magnX = (convertToInt16(bytes[12] | (bytes[13]<<8))*1.0/magnSensitivity).toFixed(2);
data.params.magnY = (convertToInt16(bytes[14] | (bytes[15]<<8))*1.0/magnSensitivity).toFixed(2);
data.params.magnZ = (convertToInt16(bytes[16] | (bytes[17]<<8))*1.0/magnSensitivity).toFixed(2);
data.params.period = bytes[18] | (bytes[19]<<8);
data.params.pressure = ((bytes[20] | (bytes[21]<<8) | (bytes[22]<<16) | (bytes[23]<<24))*1.0/presSensitivity).toFixed(2);
data.params.altitude = ((Math.pow(1017.92/data.params.pressure,1.0/5.257) - 1)*(data.params.temperature/10.0+273.15)/0.0065).toFixed(2);
data.params.fPort = fPort;
return data;
}
function convertToInt16(num)
{
var intNum = num;
if ((num & 0x8000) > 0) {
intNum = num - 0x10000;
}
return intNum;
}
****************************** CODE END *****************************
*/
void application_entry(void *arg)
{
int16_t temperature;
int16_t humidity;
sensor_data_t sensor_data;
HTS221_Init();
// initialization of sensors
BSP_Sensor_Init();
rhf76_lora_init(HAL_UART_PORT_1);
tos_lora_module_recvcb_register(recv_callback);
tos_lora_module_join_otaa("8cf957200000fa57", "8cf957200000fa572059aaaaad204a72");
tos_lora_module_join_otaa("8cf957200000f53c", "8cf957200000f52c6d09aaaaad205a72");
while (1) {
HTS221_Get_Temperature(&temperature);
HTS221_Get_Humidity(&humidity);
printf("temperature: %2.1f\n", temperature / 10.0);
printf("humidity : %2.1f\n", humidity / 10.0);
dev_data_wrapper.u.dev_data.temperature = temperature / 10;
dev_data_wrapper.u.dev_data.humidity = humidity / 10;
dev_data_wrapper.u.dev_data.period = report_period;
BSP_Sensor_Read(&sensor_data);
print_to_screen(sensor_data);
// generate data frame
dev_data_wrapper.u.dev_data.magn_fullscale = (uint8_t)(sensor_data.sensor_magn.fullscale);
dev_data_wrapper.u.dev_data.temp_sensitivity = (uint8_t)(sensor_data.sensor_tempnhumi.temp_sensitivity);
dev_data_wrapper.u.dev_data.humi_sensitivity = (uint16_t)(sensor_data.sensor_tempnhumi.humi_sensitivity);
dev_data_wrapper.u.dev_data.press_sensitivity = (uint16_t)(sensor_data.sensor_press.sensitivity);
dev_data_wrapper.u.dev_data.magn_sensitivity = (uint16_t)(sensor_data.sensor_magn.sensitivity);
dev_data_wrapper.u.dev_data.temperature = (int16_t)(sensor_data.sensor_tempnhumi.temperature);
dev_data_wrapper.u.dev_data.humidity = (int16_t)(sensor_data.sensor_tempnhumi.humidity);
dev_data_wrapper.u.dev_data.magn_x = (int16_t)(sensor_data.sensor_magn.magn_x);
dev_data_wrapper.u.dev_data.magn_y = (int16_t)(sensor_data.sensor_magn.magn_y);
dev_data_wrapper.u.dev_data.magn_z = (int16_t)(sensor_data.sensor_magn.magn_z);
dev_data_wrapper.u.dev_data.pressure = (uint32_t)(sensor_data.sensor_press.pressure);
dev_data_wrapper.u.dev_data.period = report_period;
// send data to the server (via gateway)
tos_lora_module_send(dev_data_wrapper.u.serialize, sizeof(dev_data_t));
tos_task_delay(report_period * 1000);
}

File diff suppressed because it is too large Load Diff

View File

@@ -66,7 +66,7 @@
</option>
<option>
<name>OGLastSavedByProductVersion</name>
<state>8.32.1.18618</state>
<state>8.30.1.17146</state>
</option>
<option>
<name>GeneralEnableMisra</name>
@@ -215,17 +215,12 @@
<name>ICCARM</name>
<archiveVersion>2</archiveVersion>
<data>
<version>35</version>
<version>34</version>
<wantNonLocal>1</wantNonLocal>
<debug>1</debug>
<option>
<name>CCOptimizationNoSizeConstraints</name>
<state>0</state>
</option>
<option>
<name>CCDefines</name>
<state>USE_HAL_DRIVER</state>
<state>STM32L073xx</state>
<state></state>
</option>
<option>
<name>CCPreprocFile</name>
@@ -237,7 +232,7 @@
</option>
<option>
<name>CCPreprocLine</name>
<state>0</state>
<state>1</state>
</option>
<option>
<name>CCListCFile</name>
@@ -286,7 +281,7 @@
<option>
<name>CCAllowList</name>
<version>1</version>
<state>11111110</state>
<state>00000000</state>
</option>
<option>
<name>CCDebugInfo</name>
@@ -334,7 +329,7 @@
</option>
<option>
<name>OutputFile</name>
<state>$FILE_BNAME$.o</state>
<state></state>
</option>
<option>
<name>CCLibConfigHeader</name>
@@ -350,18 +345,7 @@
</option>
<option>
<name>CCIncludePath2</name>
<state>$PROJ_DIR$\..\..\BSP\Inc</state>
<state>$PROJ_DIR$\..\..\..\..\platform\vendor_bsp\st\STM32L0xx_HAL_Driver\Inc</state>
<state>$PROJ_DIR$\..\..\..\..\platform\vendor_bsp\st\STM32L0xx_HAL_Driver\Inc\Legacy</state>
<state>$PROJ_DIR$\..\..\..\..\platform\vendor_bsp\st\CMSIS\Device\ST\STM32L0xx\Include</state>
<state>$PROJ_DIR$\..\..\..\..\platform\vendor_bsp\st\CMSIS\Include</state>
<state>$PROJ_DIR$\..\..\..\..\arch\arm\arm-v7m\common\include</state>
<state>$PROJ_DIR$\..\..\..\..\arch\arm\arm-v7m\cortex-m0+\iccarm</state>
<state>$PROJ_DIR$\..\..\..\..\kernel\core\include</state>
<state>$PROJ_DIR$\..\..\..\..\kernel\pm\include</state>
<state>$PROJ_DIR$\..\..\..\..\osal\cmsis_os</state>
<state>$PROJ_DIR$\..\..\TOS_CONFIG</state>
<state>$PROJ_DIR$\..\..\..\..\examples\helloworld</state>
<state></state>
</option>
<option>
<name>CCStdIncCheck</name>
@@ -377,16 +361,16 @@
</option>
<option>
<name>CCOptLevel</name>
<state>3</state>
<state>1</state>
</option>
<option>
<name>CCOptStrategy</name>
<version>0</version>
<state>1</state>
<state>0</state>
</option>
<option>
<name>CCOptLevelSlave</name>
<state>3</state>
<state>1</state>
</option>
<option>
<name>CompilerMisraRules98</name>
@@ -424,7 +408,7 @@
</option>
<option>
<name>IccStaticDestr</name>
<state>0</state>
<state>1</state>
</option>
<option>
<name>IccCppInlineSemantics</name>
@@ -438,6 +422,10 @@
<name>IccFloatSemantics</name>
<state>0</state>
</option>
<option>
<name>CCOptimizationNoSizeConstraints</name>
<state>0</state>
</option>
<option>
<name>CCNoLiteralPool</name>
<state>0</state>
@@ -445,7 +433,7 @@
<option>
<name>CCOptStrategySlave</name>
<version>0</version>
<state>1</state>
<state>0</state>
</option>
<option>
<name>CCGuardCalls</name>
@@ -475,10 +463,6 @@
<name>IccRTTI2</name>
<state>0</state>
</option>
<option>
<name>OICompilerExtraOption</name>
<state>1</state>
</option>
</data>
</settings>
<settings>
@@ -699,7 +683,7 @@
<name>ILINK</name>
<archiveVersion>0</archiveVersion>
<data>
<version>22</version>
<version>21</version>
<wantNonLocal>1</wantNonLocal>
<debug>1</debug>
<option>
@@ -776,11 +760,11 @@
</option>
<option>
<name>IlinkIcfOverride</name>
<state>1</state>
<state>0</state>
</option>
<option>
<name>IlinkIcfFile</name>
<state>$PROJ_DIR$/stm32l073xx_flash.icf</state>
<state>lnk0t.icf</state>
</option>
<option>
<name>IlinkIcfFileSlave</name>
@@ -840,7 +824,7 @@
</option>
<option>
<name>IlinkProgramEntryLabel</name>
<state>__iar_program_start</state>
<state></state>
</option>
<option>
<name>DoFill</name>
@@ -1015,10 +999,6 @@
<name>IlinkTrustzoneImportLibraryOut</name>
<state>###Unitialized###</state>
</option>
<option>
<name>OILinkExtraOption</name>
<state>1</state>
</option>
</data>
</settings>
<settings>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<workspace>
<project>
<path>$WS_DIR$\TencentOS_tiny.ewp</path>
</project>
<batchBuild/>
</workspace>

View File

@@ -0,0 +1,346 @@
;/******************** (C) COPYRIGHT 2016 STMicroelectronics ********************
;* File Name : startup_stm32l073xx.s
;* Author : MCD Application Team
;* Description : STM32L073xx Ultra Low Power Devices vector
;* This module performs:
;* - Set the initial SP
;* - Set the initial PC == _iar_program_start,
;* - Set the vector table entries with the exceptions ISR
;* address.
;* - Configure the system clock
;* - Branches to main in the C library (which eventually
;* calls main()).
;* After Reset the Cortex-M0+ processor is in Thread mode,
;* priority is Privileged, and the Stack is set to Main.
;********************************************************************************
;*
;* Redistribution and use in source and binary forms, with or without modification,
;* are permitted provided that the following conditions are met:
;* 1. Redistributions of source code must retain the above copyright notice,
;* this list of conditions and the following disclaimer.
;* 2. Redistributions in binary form must reproduce the above copyright notice,
;* this list of conditions and the following disclaimer in the documentation
;* and/or other materials provided with the distribution.
;* 3. Neither the name of STMicroelectronics nor the names of its contributors
;* may be used to endorse or promote products derived from this software
;* without specific prior written permission.
;*
;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
;* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
;* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
;* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
;* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
;* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
;* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;*
;*******************************************************************************/
;
;
; The modules in this file are included in the libraries, and may be replaced
; by any user-defined modules that define the PUBLIC symbol _program_start or
; a user defined start symbol.
; To override the cstartup defined in the library, simply add your modified
; version to the workbench project.
;
; The vector table is normally located at address 0.
; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
; The name "__vector_table" has special meaning for C-SPY:
; it is where the SP start value is found, and the NVIC vector
; table register (VTOR) is initialized to this address if != 0.
;
; Cortex-M version
;
MODULE ?cstartup
;; Forward declaration of sections.
SECTION CSTACK:DATA:NOROOT(3)
SECTION .intvec:CODE:NOROOT(2)
EXTERN __iar_program_start
EXTERN SystemInit
PUBLIC __vector_table
DATA
__vector_table
DCD sfe(CSTACK)
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
DCD RTC_IRQHandler ; RTC through EXTI Line
DCD FLASH_IRQHandler ; FLASH
DCD RCC_CRS_IRQHandler ; RCC_CRS
DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1
DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3
DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15
DCD TSC_IRQHandler ; TSC
DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel 2 and Channel 3
DCD DMA1_Channel4_5_6_7_IRQHandler ; DMA1 Channel 4, Channel 5, Channel 6 and Channel 7
DCD ADC1_COMP_IRQHandler ; ADC1, COMP1 and COMP2
DCD LPTIM1_IRQHandler ; LPTIM1
DCD USART4_5_IRQHandler ; USART4 and USART5
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD TIM6_DAC_IRQHandler ; TIM6 and DAC
DCD TIM7_IRQHandler ; TIM7
DCD 0 ; Reserved
DCD TIM21_IRQHandler ; TIM21
DCD I2C3_IRQHandler ; I2C3
DCD TIM22_IRQHandler ; TIM22
DCD I2C1_IRQHandler ; I2C1
DCD I2C2_IRQHandler ; I2C2
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD RNG_LPUART1_IRQHandler ; RNG and LPUART1
DCD LCD_IRQHandler ; LCD
DCD USB_IRQHandler ; USB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Default interrupt handlers.
;;
THUMB
PUBWEAK Reset_Handler
SECTION .text:CODE:NOROOT:REORDER(2)
Reset_Handler
LDR R0, =SystemInit
BLX R0
LDR R0, =__iar_program_start
BX R0
PUBWEAK NMI_Handler
SECTION .text:CODE:NOROOT:REORDER(1)
NMI_Handler
B NMI_Handler
PUBWEAK HardFault_Handler
SECTION .text:CODE:NOROOT:REORDER(1)
HardFault_Handler
B HardFault_Handler
PUBWEAK SVC_Handler
SECTION .text:CODE:NOROOT:REORDER(1)
SVC_Handler
B SVC_Handler
PUBWEAK PendSV_Handler
SECTION .text:CODE:NOROOT:REORDER(1)
PendSV_Handler
B PendSV_Handler
PUBWEAK SysTick_Handler
SECTION .text:CODE:NOROOT:REORDER(1)
SysTick_Handler
B SysTick_Handler
PUBWEAK WWDG_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
WWDG_IRQHandler
B WWDG_IRQHandler
PUBWEAK PVD_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
PVD_IRQHandler
B PVD_IRQHandler
PUBWEAK RTC_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
RTC_IRQHandler
B RTC_IRQHandler
PUBWEAK FLASH_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
FLASH_IRQHandler
B FLASH_IRQHandler
PUBWEAK RCC_CRS_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
RCC_CRS_IRQHandler
B RCC_CRS_IRQHandler
PUBWEAK EXTI0_1_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
EXTI0_1_IRQHandler
B EXTI0_1_IRQHandler
PUBWEAK EXTI2_3_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
EXTI2_3_IRQHandler
B EXTI2_3_IRQHandler
PUBWEAK EXTI4_15_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
EXTI4_15_IRQHandler
B EXTI4_15_IRQHandler
PUBWEAK TSC_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
TSC_IRQHandler
B TSC_IRQHandler
PUBWEAK DMA1_Channel1_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
DMA1_Channel1_IRQHandler
B DMA1_Channel1_IRQHandler
PUBWEAK DMA1_Channel2_3_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
DMA1_Channel2_3_IRQHandler
B DMA1_Channel2_3_IRQHandler
PUBWEAK DMA1_Channel4_5_6_7_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
DMA1_Channel4_5_6_7_IRQHandler
B DMA1_Channel4_5_6_7_IRQHandler
PUBWEAK ADC1_COMP_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
ADC1_COMP_IRQHandler
B ADC1_COMP_IRQHandler
PUBWEAK LPTIM1_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
LPTIM1_IRQHandler
B LPTIM1_IRQHandler
PUBWEAK USART4_5_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
USART4_5_IRQHandler
B USART4_5_IRQHandler
PUBWEAK TIM2_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
TIM2_IRQHandler
B TIM2_IRQHandler
PUBWEAK TIM3_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
TIM3_IRQHandler
B TIM3_IRQHandler
PUBWEAK TIM6_DAC_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
TIM6_DAC_IRQHandler
B TIM6_DAC_IRQHandler
PUBWEAK TIM7_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
TIM7_IRQHandler
B TIM7_IRQHandler
PUBWEAK TIM21_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
TIM21_IRQHandler
B TIM21_IRQHandler
PUBWEAK I2C3_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
I2C3_IRQHandler
B I2C3_IRQHandler
PUBWEAK TIM22_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
TIM22_IRQHandler
B TIM22_IRQHandler
PUBWEAK I2C1_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
I2C1_IRQHandler
B I2C1_IRQHandler
PUBWEAK I2C2_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
I2C2_IRQHandler
B I2C2_IRQHandler
PUBWEAK SPI1_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
SPI1_IRQHandler
B SPI1_IRQHandler
PUBWEAK SPI2_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
SPI2_IRQHandler
B SPI2_IRQHandler
PUBWEAK USART1_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
USART1_IRQHandler
B USART1_IRQHandler
PUBWEAK USART2_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
USART2_IRQHandler
B USART2_IRQHandler
PUBWEAK RNG_LPUART1_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
RNG_LPUART1_IRQHandler
B RNG_LPUART1_IRQHandler
PUBWEAK LCD_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
LCD_IRQHandler
B LCD_IRQHandler
PUBWEAK USB_IRQHandler
SECTION .text:CODE:NOROOT:REORDER(1)
USB_IRQHandler
B USB_IRQHandler
END
;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****

View File

@@ -70,7 +70,7 @@ typedef enum lora_key_type {
#define RHF76_ATCMD_SET_BAND_CN470 "AT+DR=CN470\r\n"
#define RHF76_ATCMD_REPLY_BAND_CN470 "+DR: CN470"
#define RHF76_ATCMD_SET_CHANNEL "at+ch=num,0-7\r\n"
#define RHF76_ATCMD_SET_CHANNEL "at+ch=num,80-87\r\n"
#define RHF76_ATCMD_SET_ADR_OFF "at+adr=off\r\n"
#define RHF76_ATCMD_JOIN "AT+join\r\n"