merge Merge branch 'master' of http://gitea.yunhorn.com/sundp/Yunhorn_STS_OO
This commit is contained in:
commit
55c468b8e8
|
@ -1,3 +1,4 @@
|
|||
<<<<<<< HEAD
|
||||
# ---> C
|
||||
# Prerequisites
|
||||
*.d
|
||||
|
@ -65,3 +66,91 @@ Module.symvers
|
|||
Mkfile.old
|
||||
dkms.conf
|
||||
|
||||
=======
|
||||
# ---> C
|
||||
# Prerequisites
|
||||
*.d
|
||||
|
||||
# Object files
|
||||
*.o
|
||||
*.ko
|
||||
*.obj
|
||||
*.elf
|
||||
*.e1f
|
||||
*.axf
|
||||
*.de
|
||||
*.cyclo
|
||||
*.list
|
||||
*.mk
|
||||
|
||||
# Linker output
|
||||
*.ilk
|
||||
*.map
|
||||
*.exp
|
||||
*.list
|
||||
*.su
|
||||
|
||||
# Precompiled Headers
|
||||
*.gch
|
||||
*.pch
|
||||
|
||||
# Libraries
|
||||
*.lib
|
||||
*.a
|
||||
*.la
|
||||
*.lo
|
||||
|
||||
# Shared objects (inc. Windows DLLs)
|
||||
*.dll
|
||||
*.so
|
||||
*.so.*
|
||||
*.dylib
|
||||
|
||||
|
||||
# Executables
|
||||
*.exe
|
||||
*.out
|
||||
*.app
|
||||
*.i*86
|
||||
*.x86_64
|
||||
*.hex
|
||||
*.axf
|
||||
*.dep
|
||||
*.d
|
||||
*.o
|
||||
*.dp
|
||||
*.lst
|
||||
*.build_log
|
||||
*.build_log.htm
|
||||
|
||||
|
||||
# Debug files
|
||||
*.dSYM/
|
||||
*.su
|
||||
*.idb
|
||||
*.pdb
|
||||
*.dbgconf
|
||||
*.uvguix.lenovo
|
||||
*.uvoptx
|
||||
*.uvprojx
|
||||
*.build_log.htm
|
||||
*.htm
|
||||
*.map
|
||||
*.lnp
|
||||
*.sct
|
||||
*.crf
|
||||
*.lst
|
||||
|
||||
|
||||
# Kernel Module Compile Results
|
||||
*.mod*
|
||||
*.cmd
|
||||
*.htm
|
||||
*.html
|
||||
.tmp_versions/
|
||||
modules.order
|
||||
Module.symvers
|
||||
Mkfile.old
|
||||
dkms.conf
|
||||
|
||||
>>>>>>> 4e9be3f977eb8162ae244444b34521c9d34e5e01
|
||||
|
|
|
@ -0,0 +1,169 @@
|
|||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file : main.h
|
||||
* @brief : Header for main.c file.
|
||||
* This file contains the common defines of the application.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* <h2><center>© Copyright (c) 2019 STMicroelectronics.
|
||||
* All rights reserved.</center></h2>
|
||||
*
|
||||
* This software component is licensed by ST under BSD 3-Clause license,
|
||||
* the "License"; You may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at:
|
||||
* opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __MAIN_H
|
||||
#define __MAIN_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32f1xx_ll_dma.h"
|
||||
#include "stm32f1xx_ll_iwdg.h"
|
||||
#include "stm32f1xx_ll_rcc.h"
|
||||
#include "stm32f1xx_ll_bus.h"
|
||||
#include "stm32f1xx_ll_system.h"
|
||||
#include "stm32f1xx_ll_exti.h"
|
||||
#include "stm32f1xx_ll_cortex.h"
|
||||
#include "stm32f1xx_ll_utils.h"
|
||||
#include "stm32f1xx_ll_pwr.h"
|
||||
#include "stm32f1xx_ll_tim.h"
|
||||
#include "stm32f1xx_ll_usart.h"
|
||||
#include "stm32f1xx.h"
|
||||
#include "stm32f1xx_ll_gpio.h"
|
||||
|
||||
#if defined(USE_FULL_ASSERT)
|
||||
#include "stm32_assert.h"
|
||||
#endif /* USE_FULL_ASSERT */
|
||||
|
||||
/* Private includes ----------------------------------------------------------*/
|
||||
/* USER CODE BEGIN Includes */
|
||||
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
/* USER CODE BEGIN ET */
|
||||
|
||||
/* USER CODE END ET */
|
||||
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
/* USER CODE BEGIN EC */
|
||||
|
||||
/* USER CODE END EC */
|
||||
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
/* USER CODE BEGIN EM */
|
||||
|
||||
/* USER CODE END EM */
|
||||
|
||||
/* Exported functions prototypes ---------------------------------------------*/
|
||||
void Error_Handler(void);
|
||||
|
||||
/* USER CODE BEGIN EFP */
|
||||
void Offline_Working(void);
|
||||
void Reed_Working(void);
|
||||
uint32_t MCU_UID(void);
|
||||
/* USER CODE END EFP */
|
||||
|
||||
/* Private defines -----------------------------------------------------------*/
|
||||
#define Reed_Switch_Pin LL_GPIO_PIN_4
|
||||
#define Reed_Switch_GPIO_Port GPIOA
|
||||
#define Reed_Switch_EXTI_IRQn EXTI4_IRQn
|
||||
#ifndef NVIC_PRIORITYGROUP_0
|
||||
#define NVIC_PRIORITYGROUP_0 ((uint32_t)0x00000007) /*!< 0 bit for pre-emption priority,
|
||||
4 bits for subpriority */
|
||||
#define NVIC_PRIORITYGROUP_1 ((uint32_t)0x00000006) /*!< 1 bit for pre-emption priority,
|
||||
3 bits for subpriority */
|
||||
#define NVIC_PRIORITYGROUP_2 ((uint32_t)0x00000005) /*!< 2 bits for pre-emption priority,
|
||||
2 bits for subpriority */
|
||||
#define NVIC_PRIORITYGROUP_3 ((uint32_t)0x00000004) /*!< 3 bits for pre-emption priority,
|
||||
1 bit for subpriority */
|
||||
#define NVIC_PRIORITYGROUP_4 ((uint32_t)0x00000003) /*!< 4 bits for pre-emption priority,
|
||||
0 bit for subpriority */
|
||||
#endif
|
||||
/* USER CODE BEGIN Private defines */
|
||||
//µ¥Î»Ãë
|
||||
#define Minimum_Period 60
|
||||
//#define Max_Period 120
|
||||
#define Max_Period 20
|
||||
#define Radar_frame_len 36
|
||||
#define MajorVer 23U
|
||||
#define MinorVer 06U
|
||||
#define SubMinorVer 01U
|
||||
|
||||
#define senddataport 10U //STS_O1 SEND DATA PORT
|
||||
#define sendhtbtport 5U //STS_O2 send heart beat port
|
||||
#define cmdreplyport 13U // presence sensor parameter change feedback data port
|
||||
#define userappctrlport 3U
|
||||
|
||||
typedef enum {
|
||||
Network_Mode =0,// Mode = 0, Network/Cloud control mode
|
||||
Wired_Mode, // Mode = 1, Not used now
|
||||
Reed_Mode, // Mode = 2, Reed Switch Mode or Hall Element
|
||||
Radar_Mode, // Mode = 3, USART Radar mode
|
||||
Reed_Radar_Dual_Mode // Mode = 4, Dual Mode of Reed and Radar
|
||||
} Work_Mode_t;
|
||||
|
||||
enum ReedSwitch_Status {
|
||||
ReedSwitch_Open = 0, // Door/ReedSwitch/Holl Element Open
|
||||
ReedSwitch_Close = 1 // Close Status
|
||||
};
|
||||
|
||||
enum Presence_Status {
|
||||
No_Occupancy = 0, // Not Occupancy, or Not presence
|
||||
Occupancy = 1 // Occupancy or Presence
|
||||
};
|
||||
|
||||
|
||||
#define KeYong 0
|
||||
#define ZhanYong 1
|
||||
#define Close 0
|
||||
#define Open 1
|
||||
|
||||
enum End_Node_Status {
|
||||
Door_Open_No_Presence = 0, //Door Open, No Occupancy
|
||||
Door_Open_Presence = 1, //Door Open, Occupancy
|
||||
Door_Close_No_Presence =1, //Door Close, No Occupancy
|
||||
Door_Close_Presence =1, //Door close, Occupancy
|
||||
Door_Open = 0, // Door_open status Only
|
||||
Door_Close =1, // Door_close Status only
|
||||
No_Presence = 0, // Not Presence Only, no door status
|
||||
Presence =1 // Presence Only, no door status
|
||||
};
|
||||
|
||||
enum senddataconfirmation {
|
||||
UnConfirmed = 0, // LoRa unconfirmed data upload
|
||||
Confirmed // LoRa Confirmed data upload
|
||||
};
|
||||
|
||||
enum puColor_define {
|
||||
Dark = 0, // 000 = Dark Mode
|
||||
Green, // = 1, Green
|
||||
Red, // = 2, Red
|
||||
Blue, // = 3, Blue
|
||||
Yellow, // = 4, Yellow
|
||||
Pink, // = 5, Pink
|
||||
Cyan, // = 6, Cyan
|
||||
White, // = 7, White
|
||||
Red_Blue // = 8, Red/Blue Flashing
|
||||
|
||||
};
|
||||
/* USER CODE END Private defines */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __MAIN_H */
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
172
Inc/main.h
172
Inc/main.h
|
@ -1,3 +1,4 @@
|
|||
<<<<<<< HEAD
|
||||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
|
@ -167,3 +168,174 @@ enum puColor_define {
|
|||
#endif /* __MAIN_H */
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
=======
|
||||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file : main.h
|
||||
* @brief : Header for main.c file.
|
||||
* This file contains the common defines of the application.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* <h2><center>© Copyright (c) 2019 STMicroelectronics.
|
||||
* All rights reserved.</center></h2>
|
||||
*
|
||||
* This software component is licensed by ST under BSD 3-Clause license,
|
||||
* the "License"; You may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at:
|
||||
* opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __MAIN_H
|
||||
#define __MAIN_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32f1xx_ll_dma.h"
|
||||
#include "stm32f1xx_ll_iwdg.h"
|
||||
#include "stm32f1xx_ll_rcc.h"
|
||||
#include "stm32f1xx_ll_bus.h"
|
||||
#include "stm32f1xx_ll_system.h"
|
||||
#include "stm32f1xx_ll_exti.h"
|
||||
#include "stm32f1xx_ll_cortex.h"
|
||||
#include "stm32f1xx_ll_utils.h"
|
||||
#include "stm32f1xx_ll_pwr.h"
|
||||
#include "stm32f1xx_ll_tim.h"
|
||||
#include "stm32f1xx_ll_usart.h"
|
||||
#include "stm32f1xx.h"
|
||||
#include "stm32f1xx_ll_gpio.h"
|
||||
|
||||
#if defined(USE_FULL_ASSERT)
|
||||
#include "stm32_assert.h"
|
||||
#endif /* USE_FULL_ASSERT */
|
||||
|
||||
/* Private includes ----------------------------------------------------------*/
|
||||
/* USER CODE BEGIN Includes */
|
||||
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
/* USER CODE BEGIN ET */
|
||||
|
||||
/* USER CODE END ET */
|
||||
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
/* USER CODE BEGIN EC */
|
||||
|
||||
/* USER CODE END EC */
|
||||
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
/* USER CODE BEGIN EM */
|
||||
|
||||
/* USER CODE END EM */
|
||||
|
||||
/* Exported functions prototypes ---------------------------------------------*/
|
||||
void Error_Handler(void);
|
||||
|
||||
/* USER CODE BEGIN EFP */
|
||||
void Offline_Working(void);
|
||||
void Reed_Working(void);
|
||||
uint32_t MCU_UID(void);
|
||||
/* USER CODE END EFP */
|
||||
|
||||
/* Private defines -----------------------------------------------------------*/
|
||||
#define Reed_Switch_Pin LL_GPIO_PIN_4
|
||||
#define Reed_Switch_GPIO_Port GPIOA
|
||||
#define Reed_Switch_EXTI_IRQn EXTI4_IRQn
|
||||
#ifndef NVIC_PRIORITYGROUP_0
|
||||
#define NVIC_PRIORITYGROUP_0 ((uint32_t)0x00000007) /*!< 0 bit for pre-emption priority,
|
||||
4 bits for subpriority */
|
||||
#define NVIC_PRIORITYGROUP_1 ((uint32_t)0x00000006) /*!< 1 bit for pre-emption priority,
|
||||
3 bits for subpriority */
|
||||
#define NVIC_PRIORITYGROUP_2 ((uint32_t)0x00000005) /*!< 2 bits for pre-emption priority,
|
||||
2 bits for subpriority */
|
||||
#define NVIC_PRIORITYGROUP_3 ((uint32_t)0x00000004) /*!< 3 bits for pre-emption priority,
|
||||
1 bit for subpriority */
|
||||
#define NVIC_PRIORITYGROUP_4 ((uint32_t)0x00000003) /*!< 4 bits for pre-emption priority,
|
||||
0 bit for subpriority */
|
||||
#endif
|
||||
/* USER CODE BEGIN Private defines */
|
||||
//µ¥Î»Ãë
|
||||
#define Minimum_Period 60
|
||||
//#define Max_Period 120
|
||||
#define Max_Period 20
|
||||
#define Radar_frame_len 36
|
||||
#define MajorVer 23U
|
||||
#define MinorVer 06U
|
||||
#define SubMinorVer 01U
|
||||
|
||||
#define senddataport 10U //STS_O1 SEND DATA PORT
|
||||
#define sendhtbtport 5U //STS_O2 send heart beat port
|
||||
#define cmdreplyport 13U // presence sensor parameter change feedback data port
|
||||
#define userappctrlport 3U
|
||||
|
||||
typedef enum {
|
||||
Network_Mode =0,// Mode = 0, Network/Cloud control mode
|
||||
Wired_Mode, // Mode = 1, Not used now
|
||||
Reed_Mode, // Mode = 2, Reed Switch Mode or Hall Element
|
||||
Radar_Mode, // Mode = 3, USART Radar mode
|
||||
Reed_Radar_Dual_Mode // Mode = 4, Dual Mode of Reed and Radar
|
||||
} Work_Mode_t;
|
||||
|
||||
enum ReedSwitch_Status {
|
||||
ReedSwitch_Open = 0, // Door/ReedSwitch/Holl Element Open
|
||||
ReedSwitch_Close = 1 // Close Status
|
||||
};
|
||||
|
||||
enum Presence_Status {
|
||||
No_Occupancy = 0, // Not Occupancy, or Not presence
|
||||
Occupancy = 1 // Occupancy or Presence
|
||||
};
|
||||
|
||||
|
||||
#define KeYong 0
|
||||
#define ZhanYong 1
|
||||
#define Close 0
|
||||
#define Open 1
|
||||
|
||||
enum End_Node_Status {
|
||||
Door_Open_No_Presence = 0, //Door Open, No Occupancy
|
||||
Door_Open_Presence = 1, //Door Open, Occupancy
|
||||
Door_Close_No_Presence =1, //Door Close, No Occupancy
|
||||
Door_Close_Presence =1, //Door close, Occupancy
|
||||
Door_Open = 0, // Door_open status Only
|
||||
Door_Close =1, // Door_close Status only
|
||||
No_Presence = 0, // Not Presence Only, no door status
|
||||
Presence =1 // Presence Only, no door status
|
||||
};
|
||||
|
||||
enum senddataconfirmation {
|
||||
UnConfirmed = 0, // LoRa unconfirmed data upload
|
||||
Confirmed // LoRa Confirmed data upload
|
||||
};
|
||||
|
||||
enum puColor_define {
|
||||
Dark = 0, // 000 = Dark Mode
|
||||
Green, // = 1, Green
|
||||
Red, // = 2, Red
|
||||
Blue, // = 3, Blue
|
||||
Yellow, // = 4, Yellow
|
||||
Pink, // = 5, Pink
|
||||
Cyan, // = 6, Cyan
|
||||
White, // = 7, White
|
||||
Red_Blue // = 8, Red/Blue Flashing
|
||||
|
||||
};
|
||||
/* USER CODE END Private defines */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __MAIN_H */
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
>>>>>>> 4e9be3f977eb8162ae244444b34521c9d34e5e01
|
||||
|
|
103
Inc/usart.h
103
Inc/usart.h
|
@ -1,3 +1,4 @@
|
|||
<<<<<<< HEAD
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : USART.h
|
||||
|
@ -98,3 +99,105 @@ void Node_Config_LoRa_ADR(uint8_t adr_en);
|
|||
*/
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
=======
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : USART.h
|
||||
* Description : This file provides code for the configuration
|
||||
* of the USART instances.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* <h2><center>© Copyright (c) 2020 STMicroelectronics.
|
||||
* All rights reserved.</center></h2>
|
||||
*
|
||||
* This software component is licensed by ST under BSD 3-Clause license,
|
||||
* the "License"; You may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at:
|
||||
* opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __usart_H
|
||||
#define __usart_H
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "main.h"
|
||||
|
||||
/* USER CODE BEGIN Includes */
|
||||
#include "stdio.h"
|
||||
#include "string.h"
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* USER CODE BEGIN Private defines */
|
||||
#define max_size 255
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define Preset_denominator 15
|
||||
#define Preset_numerator Preset_denominator-5
|
||||
|
||||
//#define Preset_denominator 8
|
||||
//#define Preset_numerator Preset_denominator-5
|
||||
|
||||
|
||||
//#define Preset_denominator 1
|
||||
//#define Preset_numerator 1
|
||||
|
||||
|
||||
typedef struct{
|
||||
uint16_t Start;
|
||||
uint16_t End;
|
||||
uint16_t Threshold;
|
||||
uint8_t Gain;
|
||||
}PCR;
|
||||
|
||||
|
||||
|
||||
/* USER CODE END Private defines */
|
||||
|
||||
void MX_USART1_UART_Init(void); // STS_O1 LoRa_WAN USART1
|
||||
void MX_USART2_UART_Init(void);
|
||||
void MX_USART3_UART_Init(void); // STS_O1 For Radar USART_RADAR
|
||||
|
||||
/* USER CODE BEGIN Prototypes */
|
||||
void DMA_USART1_RX_Config(void); // STS_O1 LoRa_WAN USART1
|
||||
void DMA_USART3_RX_Config(void); // STS_O1 For Radar USART_RADAR
|
||||
void Usart_SendArray( USART_TypeDef * pUSARTx, uint8_t *array, uint16_t num);
|
||||
void Usart_SendString( USART_TypeDef * pUSARTx, char *str);
|
||||
uint8_t Check_Status(void);
|
||||
void Online_Data_Analysis(volatile uint8_t *Color);
|
||||
void hex2str(char* hex , char* str );
|
||||
void Set_PCR_Parameter(char *str,uint8_t len); // STS_O1 For Radar
|
||||
uint8_t Radar_Data_Analysis(void);
|
||||
void Radar_Filtering_clutter(volatile uint8_t *color);
|
||||
void M100C_Send_Data(uint8_t port,uint8_t confirm,uint8_t type); //send to USART1 LoRaWAN USART1 defined in fputc
|
||||
void M100C_Send_HeartBeat(uint8_t color,uint8_t Mode); //send to USART1 LoRaWAN USART1 defined in fputc
|
||||
|
||||
void Node_Send_Data(uint8_t dataport, uint8_t confirm, uint8_t color, uint8_t workmode,uint8_t doorstatus, uint8_t presence_sensor_status);
|
||||
void Reply_Version_Info(void);
|
||||
void Node_Config_LoRa_ADR(uint8_t adr_en);
|
||||
/* USER CODE END Prototypes */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /*__ usart_H */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
>>>>>>> 4e9be3f977eb8162ae244444b34521c9d34e5e01
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -49,12 +49,16 @@
|
|||
<InvalidFlash>1</InvalidFlash>
|
||||
</TargetStatus>
|
||||
<OutputDirectory>LED_M100C_WS2812\</OutputDirectory>
|
||||
<<<<<<< HEAD
|
||||
<OutputName>STS_OO_F103_O1O2O3O5O6_V2_2023</OutputName>
|
||||
=======
|
||||
<OutputName>STS_OO_F103_O1O2O3O5O6_V2_2023R6</OutputName>
|
||||
>>>>>>> 4e9be3f977eb8162ae244444b34521c9d34e5e01
|
||||
<CreateExecutable>1</CreateExecutable>
|
||||
<CreateLib>0</CreateLib>
|
||||
<CreateHexFile>1</CreateHexFile>
|
||||
<DebugInformation>1</DebugInformation>
|
||||
<BrowseInformation>1</BrowseInformation>
|
||||
<DebugInformation>0</DebugInformation>
|
||||
<BrowseInformation>0</BrowseInformation>
|
||||
<ListingPath></ListingPath>
|
||||
<HexFormatSelection>1</HexFormatSelection>
|
||||
<Merge32K>0</Merge32K>
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,23 @@
|
|||
--cpu Cortex-M3
|
||||
"led_m100c_ws2812\startup_stm32f103xb.o"
|
||||
"led_m100c_ws2812\main.o"
|
||||
"led_m100c_ws2812\gpio.o"
|
||||
"led_m100c_ws2812\dma.o"
|
||||
"led_m100c_ws2812\iwdg.o"
|
||||
"led_m100c_ws2812\tim.o"
|
||||
"led_m100c_ws2812\usart.o"
|
||||
"led_m100c_ws2812\stm32f1xx_it.o"
|
||||
"led_m100c_ws2812\sys.o"
|
||||
"led_m100c_ws2812\stm32f1xx_ll_gpio.o"
|
||||
"led_m100c_ws2812\stm32f1xx_ll_dma.o"
|
||||
"led_m100c_ws2812\stm32f1xx_ll_rcc.o"
|
||||
"led_m100c_ws2812\stm32f1xx_ll_utils.o"
|
||||
"led_m100c_ws2812\stm32f1xx_ll_exti.o"
|
||||
"led_m100c_ws2812\stm32f1xx_ll_pwr.o"
|
||||
"led_m100c_ws2812\stm32f1xx_ll_tim.o"
|
||||
"led_m100c_ws2812\stm32f1xx_ll_usart.o"
|
||||
"led_m100c_ws2812\system_stm32f1xx.o"
|
||||
--library_type=microlib --strict --scatter "LED_M100C_WS2812\STS_OO_F103_O1O2O3O5O6_V2_2023.sct"
|
||||
--summary_stderr --info summarysizes --map --load_addr_map_info --xref --callgraph --symbols
|
||||
--info sizes --info totals --info unused --info veneers
|
||||
--list "STS_OO_F103_O1O2O3O5O6_V2_2023.map" -o LED_M100C_WS2812\STS_OO_F103_O1O2O3O5O6_V2_2023.axf
|
|
@ -0,0 +1,16 @@
|
|||
; *************************************************************
|
||||
; *** Scatter-Loading Description File generated by uVision ***
|
||||
; *************************************************************
|
||||
|
||||
LR_IROM1 0x08000000 0x00010000 { ; load region size_region
|
||||
ER_IROM1 0x08000000 0x00010000 { ; load address = execution address
|
||||
*.o (RESET, +First)
|
||||
*(InRoot$$Sections)
|
||||
.ANY (+RO)
|
||||
.ANY (+XO)
|
||||
}
|
||||
RW_IRAM1 0x20000000 0x00005000 { ; RW data
|
||||
.ANY (+RW +ZI)
|
||||
}
|
||||
}
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
* Auto generated Run-Time-Environment Configuration File
|
||||
* *** Do not modify ! ***
|
||||
*
|
||||
* Project: 'LED_M100C_WS2812'
|
||||
* Project: 'LED_M100C_WS2812-YUNHORN-MASTER'
|
||||
* Target: 'LED_M100C_WS2812'
|
||||
*/
|
||||
|
||||
|
|
|
@ -461,14 +461,14 @@ ARM Macro Assembler Page 8
|
|||
|
||||
00000000
|
||||
00000000
|
||||
Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interw
|
||||
ork --depend=led_m100c_ws2812\startup_stm32f103xb.d -oled_m100c_ws2812\startup_
|
||||
stm32f103xb.o -I.\RTE\_LED_M100C_WS2812 -ID:\Users\wsadz\AppData\Local\Arm\Pack
|
||||
s\ARM\CMSIS\5.7.0\CMSIS\Core\Include -ID:\Users\wsadz\AppData\Local\Arm\Packs\K
|
||||
eil\STM32F1xx_DFP\2.4.0\Device\Include --predefine="__MICROLIB SETA 1" --predef
|
||||
ine="__UVISION_VERSION SETA 533" --predefine="_RTE_ SETA 1" --predefine="STM32F
|
||||
10X_MD SETA 1" --predefine="_RTE_ SETA 1" --list=startup_stm32f103xb.lst startu
|
||||
p_stm32f103xb.s
|
||||
Command Line: --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interwork --de
|
||||
pend=led_m100c_ws2812\startup_stm32f103xb.d -oled_m100c_ws2812\startup_stm32f10
|
||||
3xb.o -I.\RTE\_LED_M100C_WS2812 -ID:\Users\lenovo\AppData\Local\Arm\Packs\ARM\C
|
||||
MSIS\5.9.0\CMSIS\Core\Include -ID:\Users\lenovo\AppData\Local\Arm\Packs\Keil\ST
|
||||
M32F1xx_DFP\2.3.0\Device\Include --predefine="__MICROLIB SETA 1" --predefine="_
|
||||
_UVISION_VERSION SETA 533" --predefine="_RTE_ SETA 1" --predefine="STM32F10X_MD
|
||||
SETA 1" --predefine="_RTE_ SETA 1" --list=startup_stm32f103xb.lst startup_stm3
|
||||
2f103xb.s
|
||||
|
||||
|
||||
|
||||
|
|
10
README.md
10
README.md
|
@ -1,3 +1,4 @@
|
|||
<<<<<<< HEAD
|
||||
# STS_OO
|
||||
|
||||
STS_OO occupancy sensor
|
||||
|
@ -5,3 +6,12 @@ STS_OO occupancy sensor
|
|||
2023-02-21 ADD lora-wan ADR_EN
|
||||
2023-02-21 main.c line 134, change Heart_Beat_Period = Minimum_Period + (MCU_UID()%60);
|
||||
// STS_O1 For Radar 2023-02-21 SUNDP
|
||||
=======
|
||||
# STS_OO
|
||||
|
||||
STS_OO occupancy sensor
|
||||
|
||||
2023-02-21 ADD lora-wan ADR_EN
|
||||
2023-02-21 main.c line 134, change Heart_Beat_Period = Minimum_Period + (MCU_UID()%60);
|
||||
// STS_O1 For Radar 2023-02-21 SUNDP
|
||||
>>>>>>> 4e9be3f977eb8162ae244444b34521c9d34e5e01
|
||||
|
|
409
Src/main.c
409
Src/main.c
|
@ -1,3 +1,4 @@
|
|||
<<<<<<< HEAD
|
||||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
|
@ -404,3 +405,411 @@ void assert_failed(uint8_t *file, uint32_t line)
|
|||
#endif /* USE_FULL_ASSERT */
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
=======
|
||||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file : main.c
|
||||
* @brief : Main program body
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* <h2><center>© Copyright (c) 2019 STMicroelectronics.
|
||||
* All rights reserved.</center></h2>
|
||||
*
|
||||
* This software component is licensed by ST under BSD 3-Clause license,
|
||||
* the "License"; You may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at:
|
||||
* opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "main.h"
|
||||
#include "dma.h"
|
||||
#include "iwdg.h"
|
||||
#include "tim.h"
|
||||
#include "usart.h"
|
||||
#include "gpio.h"
|
||||
|
||||
/* Private includes ----------------------------------------------------------*/
|
||||
/* USER CODE BEGIN Includes */
|
||||
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
/* USER CODE BEGIN PTD */
|
||||
|
||||
/* USER CODE END PTD */
|
||||
|
||||
/* Private define ------------------------------------------------------------*/
|
||||
/* USER CODE BEGIN PD */
|
||||
/* USER CODE END PD */
|
||||
|
||||
/* Private macro -------------------------------------------------------------*/
|
||||
/* USER CODE BEGIN PM */
|
||||
|
||||
/* USER CODE END PM */
|
||||
|
||||
/* Private variables ---------------------------------------------------------*/
|
||||
|
||||
/* USER CODE BEGIN PV */
|
||||
extern uint8_t USART1_RX_Buffer[];
|
||||
|
||||
volatile uint8_t Work_Mode = Reed_Radar_Dual_Mode; // STS_O1 Work_Mode
|
||||
volatile uint8_t Joined_Mode = 0;
|
||||
|
||||
volatile uint8_t puColor = 0;
|
||||
volatile uint8_t netColor = 0; //Cloud instructed color change 2022-09-21 sundp
|
||||
volatile uint8_t Door_Changed_Flag = 1;
|
||||
volatile uint8_t Heart_Beat_Flag = 0;
|
||||
volatile uint8_t Radar_Data_Flag = 0; // STS_O1 radar data flag
|
||||
|
||||
volatile uint16_t Heart_Beat_Period = 0;
|
||||
volatile uint8_t Occupancy_Status;
|
||||
|
||||
|
||||
/* USER CODE END PV */
|
||||
|
||||
/* Private function prototypes -----------------------------------------------*/
|
||||
void SystemClock_Config(void);
|
||||
/* USER CODE BEGIN PFP */
|
||||
|
||||
/* USER CODE END PFP */
|
||||
|
||||
/* Private user code ---------------------------------------------------------*/
|
||||
/* USER CODE BEGIN 0 */
|
||||
|
||||
/* 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. */
|
||||
|
||||
|
||||
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_AFIO);
|
||||
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);
|
||||
|
||||
NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
|
||||
|
||||
/* System interrupt init*/
|
||||
|
||||
/** NOJTAG: JTAG-DP Disabled and SW-DP Enabled
|
||||
*/
|
||||
LL_GPIO_AF_Remap_SWJ_NOJTAG();
|
||||
|
||||
/* USER CODE BEGIN Init */
|
||||
|
||||
/* USER CODE END Init */
|
||||
|
||||
/* Configure the system clock */
|
||||
SystemClock_Config();
|
||||
|
||||
/* USER CODE BEGIN SysInit */
|
||||
//while(1);
|
||||
/* USER CODE END SysInit */
|
||||
|
||||
/* Initialize all configured peripherals */
|
||||
MX_GPIO_Init();
|
||||
MX_TIM2_Init();
|
||||
MX_USART1_UART_Init(); // LoRaWAN USART1
|
||||
MX_DMA_Init();
|
||||
MX_USART2_UART_Init(); // ?
|
||||
MX_TIM3_Init();
|
||||
MX_IWDG_Init();
|
||||
MX_USART3_UART_Init(); // STS_O1 For Radar USART3
|
||||
/* USER CODE BEGIN 2 */
|
||||
|
||||
DMA_USART1_RX_Config(); // LoRaWAN USART1
|
||||
DMA_USART3_RX_Config(); // STS_O1 For Radar USART3
|
||||
TIM2_DMA_Config();
|
||||
|
||||
//LL_mDelay(500);
|
||||
LL_mDelay(500);
|
||||
Heart_Beat_Period = Minimum_Period + (MCU_UID()%60); // STS_O1 For Radar 2023-02-21 SUNDP
|
||||
//Heart_Beat_Period = Max_Period; // STS_O1 For Radar *******************
|
||||
/* USER CODE END 2 */
|
||||
|
||||
/* Infinite loop */
|
||||
/* USER CODE BEGIN WHILE */
|
||||
|
||||
/* send firmware version ### 2022-09-22 for version control */
|
||||
//Node_Config_LoRa_ADR(1); //enable LORA-WAN ADR
|
||||
|
||||
while (1)
|
||||
{
|
||||
LL_IWDG_ReloadCounter(IWDG);
|
||||
|
||||
if(Joined_Mode != 1) //LoRaWAN Not Joined Yet
|
||||
{
|
||||
Offline_Working();
|
||||
}
|
||||
|
||||
if(Joined_Mode == 1)
|
||||
{
|
||||
Online_Data_Analysis(&netColor); // received puColor and work mode from cloud
|
||||
|
||||
if(Work_Mode == Network_Mode) //Network_Mode, cloud control
|
||||
{
|
||||
puColor = netColor; // color code from cloud "OR" logic with secondary presence sensor
|
||||
WS2812_Light_All(puColor);
|
||||
|
||||
// ************** change for TWSC Dual occupancy sensor 2022-05-24 ********************
|
||||
if (Radar_Data_Flag == 1) // STS_O1 if any of status changed, door or presence sensor
|
||||
{
|
||||
Radar_Filtering_clutter(&puColor); // STS_O1 For Radar
|
||||
// puColor = Red;
|
||||
if (puColor == Red)
|
||||
WS2812_Light_All(puColor); // STS_O1 For Radar
|
||||
|
||||
Radar_Data_Flag = 0; // STS_O1 For Radar
|
||||
}
|
||||
// } else if (Door_Changed_Flag == 1)
|
||||
// {
|
||||
// puColor = (Door_Status==1? Red:Green);
|
||||
// WS2812_Light_All(puColor);
|
||||
// Door_Changed_Flag = 0;
|
||||
// }
|
||||
// ************** change for TWSC Dual occupancy sensor 2022-05-24 ********************
|
||||
|
||||
}
|
||||
|
||||
|
||||
// if(Work_Mode == Reed_Mode && Door_Changed_Flag == 1) //Reedswitch or Hall Element mode
|
||||
// {
|
||||
// Door_Changed_Flag = 0;
|
||||
// WS2812_Light_All(puColor);
|
||||
// Reed_Working();
|
||||
// }
|
||||
|
||||
if(Work_Mode == Reed_Mode) //Reedswitch or Hall Element mode
|
||||
{
|
||||
if(Door_Changed_Flag == 1)
|
||||
{
|
||||
// WS2812_Light_All(puColor);
|
||||
//Reed_Working();
|
||||
WS2812_Light_Custom( Light_Level,0,0 );
|
||||
puColor = Red;
|
||||
// Door_Changed_Flag = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if(Work_Mode == Radar_Mode) // STS_O1 For Radar
|
||||
{
|
||||
if(Radar_Data_Flag == 1) // STS_O1 For Radar
|
||||
{
|
||||
Radar_Filtering_clutter(&puColor); // STS_O1 For Radar
|
||||
WS2812_Light_All(puColor); // STS_O1 For Radar
|
||||
Radar_Data_Flag = 0; // STS_O1 For Radar
|
||||
}
|
||||
}
|
||||
|
||||
if (Work_Mode == Reed_Radar_Dual_Mode) // Dual mode of Reed & Radar
|
||||
{
|
||||
|
||||
if (Radar_Data_Flag == 1) // STS_O1 if any of status changed, door or presence sensor
|
||||
{
|
||||
Radar_Filtering_clutter(&puColor); // STS_O1 For Radar
|
||||
// puColor = Red;
|
||||
WS2812_Light_All(puColor); // STS_O1 For Radar
|
||||
|
||||
Radar_Data_Flag = 0; // STS_O1 For Radar
|
||||
} else if (Door_Changed_Flag == 1)
|
||||
{
|
||||
puColor = (Door_Status==1? Red:Green);
|
||||
WS2812_Light_All(puColor);
|
||||
Door_Changed_Flag = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if(Heart_Beat_Flag == 1)
|
||||
{
|
||||
Heart_Beat_Flag = 0;
|
||||
if (Work_Mode != Network_Mode)
|
||||
{
|
||||
if ((Occupancy_Status == 0) && (Door_Status) )
|
||||
{
|
||||
puColor = 1; // green
|
||||
Node_Send_Data(sendhtbtport,UnConfirmed, puColor, Work_Mode, Door_Status, Occupancy_Status);
|
||||
|
||||
} else
|
||||
if ((Occupancy_Status == 1) || (Door_Status == 0))
|
||||
{
|
||||
puColor = 2; // red
|
||||
Node_Send_Data(sendhtbtport,UnConfirmed, puColor, Work_Mode, Door_Status, Occupancy_Status);
|
||||
|
||||
}
|
||||
|
||||
// WS2812_Light_All(puColor);
|
||||
|
||||
// M100C_Send_HeartBeat(puColor,Work_Mode); // STS_O1 upload current color LED and Work_Mode
|
||||
// Node_Send_Data(senddataport,UnConfirmed, puColor, Work_Mode, Door_Status, Radar_Data_Flag);
|
||||
// Node_Send_Data(sendhtbtport,UnConfirmed, puColor, Work_Mode, Door_Status, Occupancy_Status);
|
||||
|
||||
} else
|
||||
{
|
||||
//if (Occupancy_Status == 1) {puColor = Red; } else {puColor = Green;}
|
||||
puColor = netColor;
|
||||
Node_Send_Data(sendhtbtport,UnConfirmed, puColor, Work_Mode, Door_Status, Occupancy_Status);
|
||||
}
|
||||
}
|
||||
} /* if joined_mode */
|
||||
/* USER CODE END WHILE */
|
||||
|
||||
/* USER CODE BEGIN 3 */
|
||||
} /* while (1) */
|
||||
|
||||
/* USER CODE END 3 */
|
||||
} /* main */
|
||||
|
||||
/**
|
||||
* @brief System Clock Configuration
|
||||
* @retval None
|
||||
*/
|
||||
void SystemClock_Config(void)
|
||||
{
|
||||
LL_FLASH_SetLatency(LL_FLASH_LATENCY_2);
|
||||
|
||||
if(LL_FLASH_GetLatency() != LL_FLASH_LATENCY_2)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
LL_RCC_HSI_SetCalibTrimming(16);
|
||||
LL_RCC_HSI_Enable();
|
||||
|
||||
/* Wait till HSI is ready */
|
||||
while(LL_RCC_HSI_IsReady() != 1)
|
||||
{
|
||||
|
||||
}
|
||||
LL_RCC_LSI_Enable();
|
||||
|
||||
/* Wait till LSI is ready */
|
||||
while(LL_RCC_LSI_IsReady() != 1)
|
||||
{
|
||||
|
||||
}
|
||||
LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSI_DIV_2, LL_RCC_PLL_MUL_16);
|
||||
LL_RCC_PLL_Enable();
|
||||
|
||||
/* Wait till PLL is ready */
|
||||
while(LL_RCC_PLL_IsReady() != 1)
|
||||
{
|
||||
|
||||
}
|
||||
LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
|
||||
LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_2);
|
||||
LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
|
||||
LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);
|
||||
|
||||
/* Wait till System clock is ready */
|
||||
while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
|
||||
{
|
||||
|
||||
}
|
||||
LL_Init1msTick(64000000);
|
||||
LL_SYSTICK_SetClkSource(LL_SYSTICK_CLKSOURCE_HCLK);
|
||||
LL_SetSystemCoreClock(64000000);
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 4 */
|
||||
void Offline_Working(void)
|
||||
{
|
||||
for(uint8_t i = 0;i<3;i++){
|
||||
if(Door_Status == Open){
|
||||
WS2812_Light_One_By_One(Green,Light_Level);
|
||||
}
|
||||
else{
|
||||
WS2812_Light_One_By_One(Red,Light_Level);
|
||||
}
|
||||
}
|
||||
Joined_Mode = Check_Status(); // check LoRaWAN Join Status
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Reed_Working(void)
|
||||
{
|
||||
if(Door_Status == Open){
|
||||
WS2812_Light_Custom( 0,Light_Level,0 );
|
||||
puColor = Green; // Green
|
||||
// M100C_Send_Data(4,0,KeYong);
|
||||
Node_Send_Data(senddataport,UnConfirmed, Green, Work_Mode, Door_Status, No_Occupancy);
|
||||
}
|
||||
else{
|
||||
WS2812_Light_Custom( Light_Level,0,0 );
|
||||
puColor = Red; // Red
|
||||
// M100C_Send_Data(4,0,ZhanYong);
|
||||
Node_Send_Data(senddataport,UnConfirmed, Red, Work_Mode, Door_Status, Occupancy);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//void Reed_Working(void)
|
||||
//{
|
||||
// if(Door_Status == Open){
|
||||
// WS2812_Light_Custom( 0,Light_Level,0 );
|
||||
// puColor = 1; // Green
|
||||
// // M100C_Send_Data(4,0,KeYong);
|
||||
// Node_Send_Data(senddataport,UnConfirmed, Green, Work_Mode, Door_Status, No_Occupancy);
|
||||
// }
|
||||
// else{
|
||||
// WS2812_Light_Custom( Light_Level,0,0 );
|
||||
// puColor = 2; // Red
|
||||
// // M100C_Send_Data(4,0,ZhanYong);
|
||||
// Node_Send_Data(senddataport,UnConfirmed, Red, Work_Mode, Door_Status, Occupancy);
|
||||
// }
|
||||
//}
|
||||
|
||||
|
||||
uint32_t MCU_UID(void)
|
||||
{
|
||||
return LL_GetUID_Word0() + LL_GetUID_Word1() + LL_GetUID_Word2();
|
||||
}
|
||||
|
||||
/* USER CODE END 4 */
|
||||
|
||||
/**
|
||||
* @brief This function is executed in case of error occurrence.
|
||||
* @retval None
|
||||
*/
|
||||
void Error_Handler(void)
|
||||
{
|
||||
/* USER CODE BEGIN Error_Handler_Debug */
|
||||
/* User can add his own implementation to report the HAL error return state */
|
||||
|
||||
/* USER CODE END Error_Handler_Debug */
|
||||
}
|
||||
|
||||
#ifdef USE_FULL_ASSERT
|
||||
/**
|
||||
* @brief Reports the name of the source file and the source line number
|
||||
* where the assert_param error has occurred.
|
||||
* @param file: pointer to the source file name
|
||||
* @param line: assert_param error line source number
|
||||
* @retval None
|
||||
*/
|
||||
void assert_failed(uint8_t *file, uint32_t line)
|
||||
{
|
||||
/* USER CODE BEGIN 6 */
|
||||
/* User can add his own implementation to report the file name and line number,
|
||||
tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
|
||||
/* USER CODE END 6 */
|
||||
}
|
||||
#endif /* USE_FULL_ASSERT */
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
>>>>>>> 4e9be3f977eb8162ae244444b34521c9d34e5e01
|
||||
|
|
|
@ -0,0 +1,705 @@
|
|||
/**
|
||||
******************************************************************************
|
||||
* File Name : USART.c
|
||||
* Description : This file provides code for the configuration
|
||||
* of the USART instances.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* <h2><center>© Copyright (c) 2020 STMicroelectronics.
|
||||
* All rights reserved.</center></h2>
|
||||
*
|
||||
* This software component is licensed by ST under BSD 3-Clause license,
|
||||
* the "License"; You may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at:
|
||||
* opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "usart.h"
|
||||
#include "main.h"
|
||||
#include "gpio.h"
|
||||
|
||||
/* USER CODE BEGIN 0 */
|
||||
extern volatile uint8_t Work_Mode;
|
||||
extern volatile uint8_t Radar_Data_Flag; // STS_O1 For Radar
|
||||
extern volatile uint8_t Occupancy_Status;
|
||||
extern volatile uint8_t netColor; //Cloud instructed color change 2022-09-21 sundp
|
||||
volatile uint8_t Accept_Finished_Flag = 0 ;
|
||||
uint8_t USART1_RX_Buffer[max_size] = {0} ; // LoRaWAN USART1
|
||||
uint8_t USART3_RX_Buffer[Radar_frame_len] = {0} ; // STS_O1 For Radar for Radar frame
|
||||
volatile uint16_t Buffer_INDEX = 0;
|
||||
volatile uint16_t Previous_INDEX = 0;
|
||||
|
||||
|
||||
|
||||
_Bool Motion_Flag; // STS_O1 For Radar motion detection
|
||||
|
||||
/* USER CODE END 0 */
|
||||
|
||||
/* USART1 init function */
|
||||
|
||||
void MX_USART1_UART_Init(void)
|
||||
{
|
||||
LL_USART_InitTypeDef USART_InitStruct = {0};
|
||||
|
||||
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
|
||||
/* Peripheral clock enable */
|
||||
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);
|
||||
|
||||
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
|
||||
/**USART1 GPIO Configuration
|
||||
PA9 ------> USART1_TX
|
||||
PA10 ------> USART1_RX
|
||||
*/
|
||||
GPIO_InitStruct.Pin = LL_GPIO_PIN_9;
|
||||
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
|
||||
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
|
||||
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
|
||||
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
GPIO_InitStruct.Pin = LL_GPIO_PIN_10;
|
||||
GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING;
|
||||
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
/* USART1 DMA Init */
|
||||
|
||||
/* USART1_RX Init */
|
||||
LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_5, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);
|
||||
|
||||
LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_5, LL_DMA_PRIORITY_VERYHIGH);
|
||||
|
||||
LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_5, LL_DMA_MODE_CIRCULAR);
|
||||
|
||||
LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_5, LL_DMA_PERIPH_NOINCREMENT);
|
||||
|
||||
LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_5, LL_DMA_MEMORY_INCREMENT);
|
||||
|
||||
LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_5, LL_DMA_PDATAALIGN_BYTE);
|
||||
|
||||
LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_5, LL_DMA_MDATAALIGN_BYTE);
|
||||
|
||||
/* USART1 interrupt Init */
|
||||
NVIC_SetPriority(USART1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
|
||||
NVIC_EnableIRQ(USART1_IRQn);
|
||||
|
||||
USART_InitStruct.BaudRate = 9600;
|
||||
USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
|
||||
USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
|
||||
USART_InitStruct.Parity = LL_USART_PARITY_NONE;
|
||||
USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
|
||||
USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
|
||||
USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
|
||||
LL_USART_Init(USART1, &USART_InitStruct);
|
||||
LL_USART_ConfigAsyncMode(USART1);
|
||||
LL_USART_Enable(USART1);
|
||||
|
||||
}
|
||||
/* USART2 init function */
|
||||
|
||||
void MX_USART2_UART_Init(void)
|
||||
{
|
||||
LL_USART_InitTypeDef USART_InitStruct = {0};
|
||||
|
||||
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
|
||||
/* Peripheral clock enable */
|
||||
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);
|
||||
|
||||
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
|
||||
/**USART2 GPIO Configuration
|
||||
PA2 ------> USART2_TX
|
||||
PA3 ------> USART2_RX
|
||||
*/
|
||||
GPIO_InitStruct.Pin = LL_GPIO_PIN_2;
|
||||
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
|
||||
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
|
||||
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
|
||||
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
GPIO_InitStruct.Pin = LL_GPIO_PIN_3;
|
||||
GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING;
|
||||
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
USART_InitStruct.BaudRate = 115200;
|
||||
USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
|
||||
USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
|
||||
USART_InitStruct.Parity = LL_USART_PARITY_NONE;
|
||||
USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
|
||||
USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
|
||||
USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
|
||||
LL_USART_Init(USART2, &USART_InitStruct);
|
||||
LL_USART_ConfigAsyncMode(USART2);
|
||||
LL_USART_Enable(USART2);
|
||||
|
||||
}
|
||||
/* USART3 init function */
|
||||
|
||||
void MX_USART3_UART_Init(void) // STS_O1 For Radar USART_RADAR
|
||||
{
|
||||
LL_USART_InitTypeDef USART_InitStruct = {0};
|
||||
|
||||
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
|
||||
/* Peripheral clock enable */
|
||||
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART3);
|
||||
|
||||
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB);
|
||||
/**USART3 GPIO Configuration
|
||||
PB10 ------> USART3_TX
|
||||
PB11 ------> USART3_RX
|
||||
*/
|
||||
GPIO_InitStruct.Pin = LL_GPIO_PIN_10;
|
||||
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
|
||||
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
|
||||
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
|
||||
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
|
||||
GPIO_InitStruct.Pin = LL_GPIO_PIN_11;
|
||||
GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING;
|
||||
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
|
||||
/* USART3 DMA Init */
|
||||
|
||||
/* USART3_RX Init */
|
||||
LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_3, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);
|
||||
|
||||
LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_3, LL_DMA_PRIORITY_LOW);
|
||||
|
||||
LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_3, LL_DMA_MODE_CIRCULAR);
|
||||
|
||||
LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_3, LL_DMA_PERIPH_NOINCREMENT);
|
||||
|
||||
LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_3, LL_DMA_MEMORY_INCREMENT);
|
||||
|
||||
LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_3, LL_DMA_PDATAALIGN_BYTE);
|
||||
|
||||
LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_3, LL_DMA_MDATAALIGN_BYTE);
|
||||
|
||||
/* USART3 interrupt Init */
|
||||
NVIC_SetPriority(USART3_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
|
||||
NVIC_EnableIRQ(USART3_IRQn);
|
||||
|
||||
USART_InitStruct.BaudRate = 115200;
|
||||
USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
|
||||
USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
|
||||
USART_InitStruct.Parity = LL_USART_PARITY_NONE;
|
||||
USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
|
||||
USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
|
||||
USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
|
||||
LL_USART_Init(USART3, &USART_InitStruct);
|
||||
LL_USART_ConfigAsyncMode(USART3);
|
||||
LL_USART_Enable(USART3);
|
||||
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 1 */
|
||||
|
||||
uint8_t Check_Status(void)
|
||||
{
|
||||
uint8_t value = 0;
|
||||
const char* buffer="\r\n+STATUS:3" ;
|
||||
LL_USART_ClearFlag_IDLE(USART1);
|
||||
printf("AT+STATUS=?\r\n");
|
||||
while(Accept_Finished_Flag == 0)
|
||||
{
|
||||
}
|
||||
Accept_Finished_Flag = 0;
|
||||
|
||||
Node_Config_LoRa_ADR(1); //enable LORA-WAN ADR
|
||||
|
||||
if(strncmp(buffer, (char*)(USART1_RX_Buffer),11) == 0){
|
||||
value = 1;
|
||||
LL_TIM_EnableIT_UPDATE(TIM3);
|
||||
LL_TIM_EnableCounter(TIM3);
|
||||
}
|
||||
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
/*
|
||||
颜色说明
|
||||
灭:0
|
||||
绿:1
|
||||
红:2
|
||||
蓝:3
|
||||
黄:4
|
||||
紫:5
|
||||
青:6
|
||||
白:7
|
||||
红蓝闪烁:8
|
||||
|
||||
|
||||
*/
|
||||
void Online_Data_Analysis(volatile uint8_t *Color) // Cloud command parsing from LoRa receive buffer
|
||||
{
|
||||
const char* buffer = "\r\n^LRRECV:";
|
||||
uint8_t index1 = 0;
|
||||
uint8_t index2 = 0;
|
||||
uint8_t data_len = 0;
|
||||
|
||||
|
||||
|
||||
char hex_str[255];
|
||||
char char_str[128];
|
||||
|
||||
if(Accept_Finished_Flag == 1) // LoRa receive finished or not
|
||||
{
|
||||
Accept_Finished_Flag = 0;
|
||||
if(strncmp((char*)USART1_RX_Buffer,buffer,strlen(buffer)) == 0)
|
||||
{
|
||||
//Usart_SendArray(USART2,USART1_RX_Buffer,strlen((char *)USART1_RX_Buffer));
|
||||
//找到'<'的位置
|
||||
for(index1 = 0;index1<Buffer_INDEX;index1++)
|
||||
{
|
||||
if(USART1_RX_Buffer[index1] == '<'){
|
||||
break;
|
||||
}
|
||||
}
|
||||
//datalen
|
||||
index2 = index1-1;
|
||||
while(index2--)
|
||||
{
|
||||
if(USART1_RX_Buffer[index2] == ','){
|
||||
break;
|
||||
}
|
||||
}
|
||||
switch (index1-index2)
|
||||
{
|
||||
case 3: data_len = USART1_RX_Buffer[index2+1]-'0';break;
|
||||
case 4: data_len = (USART1_RX_Buffer[index2+1]-'0')*10+USART1_RX_Buffer[index2+2]-'0';break;
|
||||
}
|
||||
|
||||
strncpy(hex_str,(char *)&USART1_RX_Buffer[index1+1],data_len*2);
|
||||
|
||||
hex2str(hex_str , char_str);
|
||||
|
||||
/* 工作模式 */
|
||||
//网络控制 0
|
||||
//有线控制 1
|
||||
//磁铁控制 2
|
||||
//雷达控制 3
|
||||
//Dual Mode 双模式控制 4
|
||||
/* 工作模式 */
|
||||
|
||||
if(char_str[0] == '0') // Config work Mode="0,1,2,3,4" or Config Radar Parameter="P"
|
||||
{
|
||||
Work_Mode = char_str[0] - '0'; // Config work Mode = {0} Network_Mode
|
||||
*Color = char_str[1] - '0'; // Config LED color = {0,1,2,3,4,5,6,8,8} Color code
|
||||
}
|
||||
switch (char_str[0])
|
||||
{
|
||||
case '0' : { // Network_Mode
|
||||
Work_Mode = char_str[0] - '0';
|
||||
*Color = char_str[1] - '0'; // Config LED color = {0,1,2,3,4,5,6,8,8} Color code
|
||||
break;
|
||||
}
|
||||
|
||||
case '2' : { // Reed_Mode
|
||||
Work_Mode = char_str[0] - '0';
|
||||
Reed_Working();
|
||||
break;
|
||||
}
|
||||
|
||||
case '3' : { // Radar_Mode
|
||||
Work_Mode = char_str[0] - '0';
|
||||
memset(USART3_RX_Buffer,0,sizeof(USART3_RX_Buffer)); // Get Radar config Parameters
|
||||
Radar_Data_Flag = 0; //
|
||||
break;
|
||||
}
|
||||
|
||||
case '4' : { // Reed_Radar_Dual_Mode
|
||||
// Work_Mode = char_str[0] - '0';
|
||||
Work_Mode = Reed_Radar_Dual_Mode;
|
||||
memset(USART3_RX_Buffer,0,sizeof(USART3_RX_Buffer)); // Get Radar config Parameters
|
||||
Radar_Data_Flag = 0; //
|
||||
break;
|
||||
}
|
||||
|
||||
case 'P' : { // Config Radar parameters in following code
|
||||
Set_PCR_Parameter(char_str , data_len);
|
||||
}
|
||||
case 'V' : {
|
||||
Reply_Version_Info();
|
||||
}
|
||||
}
|
||||
// if(USART1_RX_Buffer[index1+1] != '5')
|
||||
// {
|
||||
// Work_Mode = USART1_RX_Buffer[index+2]-'0';
|
||||
// if(Work_Mode == 0)
|
||||
// {
|
||||
// *Color = USART1_RX_Buffer[index+4]-'0';
|
||||
// }
|
||||
// else if(Work_Mode == 2)
|
||||
// {
|
||||
// Reed_Working();
|
||||
// }
|
||||
// else if(Work_Mode == 3)
|
||||
// {
|
||||
// memset(USART3_RX_Buffer,0,sizeof(USART3_RX_Buffer));
|
||||
// Radar_Data_Flag = 0;
|
||||
// }
|
||||
// }
|
||||
// else if(USART1_RX_Buffer[index+2] == 'P')
|
||||
// {
|
||||
// Set_PCR_Parameter((char *)&USART1_RX_Buffer[index+3]);
|
||||
// }
|
||||
|
||||
memset(USART1_RX_Buffer,0,sizeof(USART1_RX_Buffer));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static int hex2int(char c)
|
||||
{
|
||||
if(c >= '0' && c <= '9'){
|
||||
return (c-'0');
|
||||
}
|
||||
else if (c >= 'A' && c<= 'Z'){
|
||||
return (c-'A');
|
||||
}
|
||||
else if (c >= 'a' && c <= 'z'){
|
||||
return (c-'a');
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void hex2str(char* hex , char* str )
|
||||
{
|
||||
uint8_t i = 0;
|
||||
size_t j = 0;
|
||||
uint8_t a,b;
|
||||
for (j = 0; j < strlen(hex); j++)
|
||||
{
|
||||
a = hex2int(hex[i++]);
|
||||
b = hex2int(hex[i++]);
|
||||
str[j] = a*16+b;
|
||||
}
|
||||
str[j] = '\0';
|
||||
}
|
||||
|
||||
void Reply_Version_Info()
|
||||
{
|
||||
|
||||
//Node_Send_Data(userappctrlport, UnConfirmed , 0x56, MajorVer, MinorVer, SubMinorVer);
|
||||
printf("AT+LRSEND=%d,0,4,<%02x%02x%02x%02x\r\n",userappctrlport, 0x56, MajorVer, MinorVer, SubMinorVer); //2023-06-01
|
||||
|
||||
|
||||
/* V 2.1.2 {56 23 06 01} */
|
||||
|
||||
}
|
||||
void Set_PCR_Parameter(char *str,uint8_t len)
|
||||
{
|
||||
PCR PCR_parameter;
|
||||
char buffer[128];
|
||||
if(len == 15)
|
||||
{
|
||||
PCR_parameter.Start = hex2int(str[1])*1000+hex2int(str[2])*100+hex2int(str[3])*10+hex2int(str[4]);
|
||||
PCR_parameter.End = hex2int(str[5])*1000+hex2int(str[6])*100+hex2int(str[7])*10+hex2int(str[8]);
|
||||
PCR_parameter.Threshold = hex2int(str[9])*1000+hex2int(str[10])*100+hex2int(str[11])*10+hex2int(str[12]);
|
||||
PCR_parameter.Gain = hex2int(str[13])*10+hex2int(str[14]);
|
||||
|
||||
// PCR_parameter.Start = str[1]*1000+str[2]*100+str[3]*10+str[4];
|
||||
// PCR_parameter.End = str[5]*1000+str[6]*100+str[7]*10+str[8];
|
||||
// PCR_parameter.Threshold = str[9]*1000+str[10]*100+str[11]*10+str[12];
|
||||
// PCR_parameter.Gain = str[13]*10+str[14];
|
||||
|
||||
sprintf(buffer , "Sparse Stop\r\n");
|
||||
Usart_SendString(USART3 , buffer);
|
||||
LL_mDelay(500);
|
||||
|
||||
|
||||
sprintf(buffer , "Set Start=%dmm\r\n",PCR_parameter.Start);
|
||||
Usart_SendString(USART3 , buffer);
|
||||
LL_mDelay(500);
|
||||
|
||||
sprintf(buffer , "Set end=%dmm\r\n",PCR_parameter.End);
|
||||
Usart_SendString(USART3 , buffer);
|
||||
LL_mDelay(500);
|
||||
|
||||
sprintf(buffer , "Set Threshold=%d\r\n",PCR_parameter.Threshold);
|
||||
Usart_SendString(USART3 , buffer);
|
||||
LL_mDelay(500);
|
||||
|
||||
sprintf(buffer , "Set Gain=%d%%\r\n",PCR_parameter.Gain);
|
||||
Usart_SendString(USART3 , buffer);
|
||||
LL_mDelay(500);
|
||||
|
||||
sprintf(buffer , "Sparse Start\r\n");
|
||||
Usart_SendString(USART3 , buffer);
|
||||
LL_mDelay(500);
|
||||
|
||||
// printf("AT+LRSEND=10,0,2,<4F4B\r\n"); "OK" printf("AT+LRSEND=%d,%d,%d,<00\r\n",port,confirm,1); break; }
|
||||
printf("AT+LRSEND=%d,0,16,<%02x%04x%04x%04x%02x\r\n",cmdreplyport,0x50, /* change to port 13= cmdreplyport to align with other config, 2023-06-1 sundp */
|
||||
PCR_parameter.Start,PCR_parameter.End,PCR_parameter.Threshold, PCR_parameter.Gain);
|
||||
//change to port 13= cmdreplyport to align with other config /* 2022-09-21 sundp */
|
||||
PCR PCR_parameter;
|
||||
printf("Set Start=%dmm\r\n",PCR_parameter.Start);
|
||||
printf("Set end=%dmm\r\n",PCR_parameter.End);
|
||||
printf("Set Threshold=%d\r\n",PCR_parameter.Threshold);
|
||||
printf("Set Gain=%d%%\r\n",PCR_parameter.Gain);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
uint8_t Radar_Data_Analysis(void)
|
||||
{
|
||||
uint8_t xReturn = 0;
|
||||
const char* person = "Motion ";
|
||||
const char* noperson = "No motion";
|
||||
|
||||
if(Radar_Data_Flag == 1)
|
||||
{
|
||||
if(strncmp((char *)USART3_RX_Buffer,person,strlen(person)) == 0){
|
||||
xReturn = 1;
|
||||
}
|
||||
else if( strncmp((char *)USART3_RX_Buffer,noperson,strlen(noperson)) == 0){
|
||||
xReturn = 0;
|
||||
}
|
||||
|
||||
LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_3);
|
||||
LL_USART_DisableDMAReq_RX(USART3);
|
||||
LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_3,Radar_frame_len);
|
||||
//LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_3,(uint32_t)USART3_RX_Buffer);
|
||||
LL_USART_ReceiveData8(USART3);
|
||||
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_3);
|
||||
LL_USART_EnableDMAReq_RX(USART3);
|
||||
}
|
||||
return xReturn;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Radar_Filtering_clutter(volatile uint8_t *color)
|
||||
{
|
||||
_Bool pNew_Motion_Flag = 0;
|
||||
static uint8_t Motion_Changed_Flag = 1;
|
||||
static uint8_t numerator = Preset_numerator;
|
||||
static uint8_t denominator = Preset_denominator;
|
||||
|
||||
|
||||
|
||||
pNew_Motion_Flag = Radar_Data_Analysis();
|
||||
|
||||
if(pNew_Motion_Flag != Motion_Flag){
|
||||
Motion_Changed_Flag = 1;
|
||||
}
|
||||
|
||||
if(Motion_Changed_Flag == 1)
|
||||
{
|
||||
denominator++; // num /denom++
|
||||
|
||||
if(pNew_Motion_Flag != Motion_Flag){
|
||||
numerator++; // num ++ /denom
|
||||
}
|
||||
|
||||
if(denominator >= Preset_denominator)
|
||||
{
|
||||
if(numerator >= Preset_numerator) //的确改变
|
||||
{
|
||||
Motion_Flag = !Motion_Flag;
|
||||
Occupancy_Status = Motion_Flag; // for heart-heat signal upload
|
||||
if(Motion_Flag)
|
||||
{
|
||||
// if (Work_Mode == Radar_Mode)
|
||||
// M100C_Send_Data(10,0,ZhanYong);
|
||||
|
||||
// else if (Work_Mode == Reed_Radar_Dual_Mode)
|
||||
// Node_Send_Data(senddataport,UnConfirmed, Red, Work_Mode, Door_Status, Occupancy);
|
||||
if (Work_Mode != Network_Mode)
|
||||
{
|
||||
Node_Send_Data(senddataport,UnConfirmed, Red, Work_Mode, Door_Status, Occupancy_Status);
|
||||
*color = Red;
|
||||
} else
|
||||
{
|
||||
Node_Send_Data(senddataport,UnConfirmed, netColor, Work_Mode, Door_Status, Occupancy_Status);
|
||||
*color = netColor;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// if (Work_Mode == Radar_Mode)
|
||||
// M100C_Send_Data(10,0,KeYong);
|
||||
// else // Not_Presence_status Only
|
||||
// if (Work_Mode == Reed_Radar_Dual_Mode)
|
||||
// Node_Send_Data(senddataport,UnConfirmed, Green, Work_Mode, Door_Status, No_Occupancy);
|
||||
if (Work_Mode != Network_Mode) {
|
||||
Node_Send_Data(senddataport,UnConfirmed, Green, Work_Mode, Door_Status, Occupancy_Status);
|
||||
*color = Green;
|
||||
} else
|
||||
{
|
||||
Node_Send_Data(senddataport,UnConfirmed, netColor, Work_Mode, Door_Status, Occupancy_Status);
|
||||
*color = netColor;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
denominator = 0;
|
||||
numerator = 0;
|
||||
Motion_Changed_Flag = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void M100C_Send_Data(uint8_t port,uint8_t confirm,uint8_t type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case KeYong: { printf("AT+LRSEND=%d,%d,%d,<00\r\n",port,confirm,1); break; }
|
||||
case ZhanYong: { printf("AT+LRSEND=%d,%d,%d,<01\r\n",port,confirm,1); break; }
|
||||
}
|
||||
}
|
||||
|
||||
void M100C_Send_HeartBeat(uint8_t color,uint8_t Mode)
|
||||
{
|
||||
printf("AT+LRSEND=5,0,2,<%02x%02x\r\n",color,Mode);
|
||||
|
||||
PCR PCR_parameter;
|
||||
printf("Start=%dmm\r\n",PCR_parameter.Start);
|
||||
printf("end=%dmm\r\n",PCR_parameter.End);
|
||||
printf("Threshold=%d\r\n",PCR_parameter.Threshold);
|
||||
printf("Gain=%d%%\r\n",PCR_parameter.Gain);
|
||||
|
||||
}
|
||||
|
||||
void Node_Send_Data(uint8_t dataport, uint8_t confirm, uint8_t color, uint8_t workmode,uint8_t doorstatus, uint8_t presence_sensor_status)
|
||||
{
|
||||
// printf("AT+LRSEND=%d,%d,%d,<%02x%02x%02x\r\n",dataport,confirm,3,(uint8_t) color, (uint8_t) workmode, (uint8_t)(doorstatus + presence_sensor_status));
|
||||
|
||||
printf("AT+LRSEND=%d,%d,%d,<%02x%02x%02x%02x\r\n",
|
||||
dataport,confirm,4,
|
||||
(uint8_t) color,
|
||||
(uint8_t) workmode,
|
||||
(uint8_t) !doorstatus,
|
||||
(uint8_t) presence_sensor_status);
|
||||
|
||||
}
|
||||
|
||||
void Node_Config_LoRa_ADR(uint8_t adr_en)
|
||||
{
|
||||
if (adr_en==1)
|
||||
printf("AT+ADREN=1\r\n");
|
||||
else printf("AT+ADREN=0\r\n");
|
||||
|
||||
}
|
||||
|
||||
|
||||
void DMA_USART1_RX_Config(void)
|
||||
{
|
||||
/* 复制USART初始化中DMA的代码,避免CUBE的BUG */
|
||||
LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_5, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);
|
||||
|
||||
LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_5, LL_DMA_PRIORITY_VERYHIGH);
|
||||
|
||||
LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_5, LL_DMA_MODE_CIRCULAR);
|
||||
|
||||
LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_5, LL_DMA_PERIPH_NOINCREMENT);
|
||||
|
||||
LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_5, LL_DMA_MEMORY_INCREMENT);
|
||||
|
||||
LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_5, LL_DMA_PDATAALIGN_BYTE);
|
||||
|
||||
LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_5, LL_DMA_MDATAALIGN_BYTE);
|
||||
/* 复制USART初始化中DMA的代码,避免CUBE的BUG */
|
||||
|
||||
/* 手动配置DMA的外设地址、内存地址并使能DMA */
|
||||
LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_5,(uint32_t)&(USART1->DR));
|
||||
LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_5,(uint32_t)USART1_RX_Buffer);
|
||||
LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_5,max_size);
|
||||
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_5);
|
||||
LL_USART_EnableDMAReq_RX(USART1);
|
||||
|
||||
|
||||
/* 开启串口空闲中断 */
|
||||
LL_USART_ClearFlag_IDLE(USART1);
|
||||
LL_USART_EnableIT_IDLE(USART1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void DMA_USART3_RX_Config(void)
|
||||
{
|
||||
LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_3,(uint32_t)&(USART3->DR));
|
||||
LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_3,(uint32_t)USART3_RX_Buffer);
|
||||
LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_3,Radar_frame_len);
|
||||
LL_USART_ReceiveData8(USART3);
|
||||
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_3);
|
||||
LL_USART_EnableDMAReq_RX(USART3);
|
||||
LL_USART_EnableIT_IDLE(USART3);
|
||||
}
|
||||
|
||||
|
||||
///重定向c库函数printf到串口,重定向后可使用printf函数
|
||||
int fputc(int ch, FILE *f)
|
||||
{
|
||||
/* 发送一个字节数据到串口 */
|
||||
LL_USART_TransmitData8(USART1, (uint8_t) ch); //USART1 LoRaWAN USART1
|
||||
|
||||
/* 等待发送完毕 */
|
||||
while (LL_USART_IsActiveFlag_TXE(USART1) == RESET); //USART1 LoRaWAN USART1
|
||||
|
||||
return (ch);
|
||||
}
|
||||
|
||||
|
||||
/***************** 发送一个字节 **********************/
|
||||
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
|
||||
{
|
||||
/* 发送一个字节数据到USART */
|
||||
LL_USART_TransmitData8(pUSARTx,ch);
|
||||
|
||||
/* 等待发送数据寄存器为空 */
|
||||
while (LL_USART_IsActiveFlag_TXE(pUSARTx) == RESET);
|
||||
}
|
||||
|
||||
/***************** 发送字符串 **********************/
|
||||
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
|
||||
{
|
||||
unsigned int k=0;
|
||||
do
|
||||
{
|
||||
Usart_SendByte( pUSARTx, *(str + k) );
|
||||
k++;
|
||||
} while(*(str + k)!='\0');
|
||||
|
||||
/* 等待发送完成 */
|
||||
while(LL_USART_IsActiveFlag_TC(pUSARTx)==RESET)
|
||||
{}
|
||||
}
|
||||
void Usart_SendArray( USART_TypeDef * pUSARTx, uint8_t *array, uint16_t num)
|
||||
{
|
||||
uint8_t i;
|
||||
|
||||
for(i=0; i<num; i++)
|
||||
{
|
||||
/* 发送一个字节数据到USART */
|
||||
Usart_SendByte(pUSARTx,array[i]);
|
||||
|
||||
}
|
||||
/* 等待发送完成 */
|
||||
while(LL_USART_IsActiveFlag_TC(pUSARTx)==RESET);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* USER CODE END 1 */
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
708
Src/usart.c
708
Src/usart.c
|
@ -1,3 +1,4 @@
|
|||
<<<<<<< HEAD
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : USART.c
|
||||
|
@ -702,3 +703,710 @@ void Usart_SendArray( USART_TypeDef * pUSARTx, uint8_t *array, uint16_t num)
|
|||
/* USER CODE END 1 */
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
=======
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : USART.c
|
||||
* Description : This file provides code for the configuration
|
||||
* of the USART instances.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* <h2><center>© Copyright (c) 2020 STMicroelectronics.
|
||||
* All rights reserved.</center></h2>
|
||||
*
|
||||
* This software component is licensed by ST under BSD 3-Clause license,
|
||||
* the "License"; You may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at:
|
||||
* opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "usart.h"
|
||||
#include "main.h"
|
||||
#include "gpio.h"
|
||||
|
||||
/* USER CODE BEGIN 0 */
|
||||
extern volatile uint8_t Work_Mode;
|
||||
extern volatile uint8_t Radar_Data_Flag; // STS_O1 For Radar
|
||||
extern volatile uint8_t Occupancy_Status;
|
||||
extern volatile uint8_t netColor; //Cloud instructed color change 2022-09-21 sundp
|
||||
volatile uint8_t Accept_Finished_Flag = 0 ;
|
||||
uint8_t USART1_RX_Buffer[max_size] = {0} ; // LoRaWAN USART1
|
||||
uint8_t USART3_RX_Buffer[Radar_frame_len] = {0} ; // STS_O1 For Radar for Radar frame
|
||||
volatile uint16_t Buffer_INDEX = 0;
|
||||
volatile uint16_t Previous_INDEX = 0;
|
||||
|
||||
|
||||
|
||||
_Bool Motion_Flag; // STS_O1 For Radar motion detection
|
||||
|
||||
/* USER CODE END 0 */
|
||||
|
||||
/* USART1 init function */
|
||||
|
||||
void MX_USART1_UART_Init(void)
|
||||
{
|
||||
LL_USART_InitTypeDef USART_InitStruct = {0};
|
||||
|
||||
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
|
||||
/* Peripheral clock enable */
|
||||
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);
|
||||
|
||||
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
|
||||
/**USART1 GPIO Configuration
|
||||
PA9 ------> USART1_TX
|
||||
PA10 ------> USART1_RX
|
||||
*/
|
||||
GPIO_InitStruct.Pin = LL_GPIO_PIN_9;
|
||||
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
|
||||
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
|
||||
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
|
||||
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
GPIO_InitStruct.Pin = LL_GPIO_PIN_10;
|
||||
GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING;
|
||||
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
/* USART1 DMA Init */
|
||||
|
||||
/* USART1_RX Init */
|
||||
LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_5, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);
|
||||
|
||||
LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_5, LL_DMA_PRIORITY_VERYHIGH);
|
||||
|
||||
LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_5, LL_DMA_MODE_CIRCULAR);
|
||||
|
||||
LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_5, LL_DMA_PERIPH_NOINCREMENT);
|
||||
|
||||
LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_5, LL_DMA_MEMORY_INCREMENT);
|
||||
|
||||
LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_5, LL_DMA_PDATAALIGN_BYTE);
|
||||
|
||||
LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_5, LL_DMA_MDATAALIGN_BYTE);
|
||||
|
||||
/* USART1 interrupt Init */
|
||||
NVIC_SetPriority(USART1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
|
||||
NVIC_EnableIRQ(USART1_IRQn);
|
||||
|
||||
USART_InitStruct.BaudRate = 9600;
|
||||
USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
|
||||
USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
|
||||
USART_InitStruct.Parity = LL_USART_PARITY_NONE;
|
||||
USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
|
||||
USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
|
||||
USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
|
||||
LL_USART_Init(USART1, &USART_InitStruct);
|
||||
LL_USART_ConfigAsyncMode(USART1);
|
||||
LL_USART_Enable(USART1);
|
||||
|
||||
}
|
||||
/* USART2 init function */
|
||||
|
||||
void MX_USART2_UART_Init(void)
|
||||
{
|
||||
LL_USART_InitTypeDef USART_InitStruct = {0};
|
||||
|
||||
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
|
||||
/* Peripheral clock enable */
|
||||
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);
|
||||
|
||||
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
|
||||
/**USART2 GPIO Configuration
|
||||
PA2 ------> USART2_TX
|
||||
PA3 ------> USART2_RX
|
||||
*/
|
||||
GPIO_InitStruct.Pin = LL_GPIO_PIN_2;
|
||||
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
|
||||
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
|
||||
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
|
||||
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
GPIO_InitStruct.Pin = LL_GPIO_PIN_3;
|
||||
GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING;
|
||||
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
USART_InitStruct.BaudRate = 115200;
|
||||
USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
|
||||
USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
|
||||
USART_InitStruct.Parity = LL_USART_PARITY_NONE;
|
||||
USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
|
||||
USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
|
||||
USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
|
||||
LL_USART_Init(USART2, &USART_InitStruct);
|
||||
LL_USART_ConfigAsyncMode(USART2);
|
||||
LL_USART_Enable(USART2);
|
||||
|
||||
}
|
||||
/* USART3 init function */
|
||||
|
||||
void MX_USART3_UART_Init(void) // STS_O1 For Radar USART_RADAR
|
||||
{
|
||||
LL_USART_InitTypeDef USART_InitStruct = {0};
|
||||
|
||||
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
|
||||
/* Peripheral clock enable */
|
||||
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART3);
|
||||
|
||||
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB);
|
||||
/**USART3 GPIO Configuration
|
||||
PB10 ------> USART3_TX
|
||||
PB11 ------> USART3_RX
|
||||
*/
|
||||
GPIO_InitStruct.Pin = LL_GPIO_PIN_10;
|
||||
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
|
||||
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
|
||||
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
|
||||
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
|
||||
GPIO_InitStruct.Pin = LL_GPIO_PIN_11;
|
||||
GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING;
|
||||
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
|
||||
/* USART3 DMA Init */
|
||||
|
||||
/* USART3_RX Init */
|
||||
LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_3, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);
|
||||
|
||||
LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_3, LL_DMA_PRIORITY_LOW);
|
||||
|
||||
LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_3, LL_DMA_MODE_CIRCULAR);
|
||||
|
||||
LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_3, LL_DMA_PERIPH_NOINCREMENT);
|
||||
|
||||
LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_3, LL_DMA_MEMORY_INCREMENT);
|
||||
|
||||
LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_3, LL_DMA_PDATAALIGN_BYTE);
|
||||
|
||||
LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_3, LL_DMA_MDATAALIGN_BYTE);
|
||||
|
||||
/* USART3 interrupt Init */
|
||||
NVIC_SetPriority(USART3_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
|
||||
NVIC_EnableIRQ(USART3_IRQn);
|
||||
|
||||
USART_InitStruct.BaudRate = 115200;
|
||||
USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
|
||||
USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
|
||||
USART_InitStruct.Parity = LL_USART_PARITY_NONE;
|
||||
USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
|
||||
USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
|
||||
USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
|
||||
LL_USART_Init(USART3, &USART_InitStruct);
|
||||
LL_USART_ConfigAsyncMode(USART3);
|
||||
LL_USART_Enable(USART3);
|
||||
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 1 */
|
||||
|
||||
uint8_t Check_Status(void)
|
||||
{
|
||||
uint8_t value = 0;
|
||||
const char* buffer="\r\n+STATUS:3" ;
|
||||
LL_USART_ClearFlag_IDLE(USART1);
|
||||
printf("AT+STATUS=?\r\n");
|
||||
while(Accept_Finished_Flag == 0)
|
||||
{
|
||||
}
|
||||
Accept_Finished_Flag = 0;
|
||||
|
||||
Node_Config_LoRa_ADR(1); //enable LORA-WAN ADR
|
||||
|
||||
if(strncmp(buffer, (char*)(USART1_RX_Buffer),11) == 0){
|
||||
value = 1;
|
||||
LL_TIM_EnableIT_UPDATE(TIM3);
|
||||
LL_TIM_EnableCounter(TIM3);
|
||||
}
|
||||
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
/*
|
||||
颜色说明
|
||||
灭:0
|
||||
绿:1
|
||||
红:2
|
||||
蓝:3
|
||||
黄:4
|
||||
紫:5
|
||||
青:6
|
||||
白:7
|
||||
红蓝闪烁:8
|
||||
|
||||
|
||||
*/
|
||||
void Online_Data_Analysis(volatile uint8_t *Color) // Cloud command parsing from LoRa receive buffer
|
||||
{
|
||||
const char* buffer = "\r\n^LRRECV:";
|
||||
uint8_t index1 = 0;
|
||||
uint8_t index2 = 0;
|
||||
uint8_t data_len = 0;
|
||||
|
||||
|
||||
|
||||
char hex_str[255];
|
||||
char char_str[128];
|
||||
|
||||
if(Accept_Finished_Flag == 1) // LoRa receive finished or not
|
||||
{
|
||||
Accept_Finished_Flag = 0;
|
||||
if(strncmp((char*)USART1_RX_Buffer,buffer,strlen(buffer)) == 0)
|
||||
{
|
||||
//Usart_SendArray(USART2,USART1_RX_Buffer,strlen((char *)USART1_RX_Buffer));
|
||||
//找到'<'的位置
|
||||
for(index1 = 0;index1<Buffer_INDEX;index1++)
|
||||
{
|
||||
if(USART1_RX_Buffer[index1] == '<'){
|
||||
break;
|
||||
}
|
||||
}
|
||||
//datalen
|
||||
index2 = index1-1;
|
||||
while(index2--)
|
||||
{
|
||||
if(USART1_RX_Buffer[index2] == ','){
|
||||
break;
|
||||
}
|
||||
}
|
||||
switch (index1-index2)
|
||||
{
|
||||
case 3: data_len = USART1_RX_Buffer[index2+1]-'0';break;
|
||||
case 4: data_len = (USART1_RX_Buffer[index2+1]-'0')*10+USART1_RX_Buffer[index2+2]-'0';break;
|
||||
}
|
||||
|
||||
strncpy(hex_str,(char *)&USART1_RX_Buffer[index1+1],data_len*2);
|
||||
|
||||
hex2str(hex_str , char_str);
|
||||
|
||||
/* 工作模式 */
|
||||
//网络控制 0
|
||||
//有线控制 1
|
||||
//磁铁控制 2
|
||||
//雷达控制 3
|
||||
//Dual Mode 双模式控制 4
|
||||
/* 工作模式 */
|
||||
|
||||
if(char_str[0] == '0') // Config work Mode="0,1,2,3,4" or Config Radar Parameter="P"
|
||||
{
|
||||
Work_Mode = char_str[0] - '0'; // Config work Mode = {0} Network_Mode
|
||||
*Color = char_str[1] - '0'; // Config LED color = {0,1,2,3,4,5,6,8,8} Color code
|
||||
}
|
||||
switch (char_str[0])
|
||||
{
|
||||
case '0' : { // Network_Mode
|
||||
Work_Mode = char_str[0] - '0';
|
||||
*Color = char_str[1] - '0'; // Config LED color = {0,1,2,3,4,5,6,8,8} Color code
|
||||
break;
|
||||
}
|
||||
|
||||
case '2' : { // Reed_Mode
|
||||
Work_Mode = char_str[0] - '0';
|
||||
Reed_Working();
|
||||
break;
|
||||
}
|
||||
|
||||
case '3' : { // Radar_Mode
|
||||
Work_Mode = char_str[0] - '0';
|
||||
memset(USART3_RX_Buffer,0,sizeof(USART3_RX_Buffer)); // Get Radar config Parameters
|
||||
Radar_Data_Flag = 0; //
|
||||
break;
|
||||
}
|
||||
|
||||
case '4' : { // Reed_Radar_Dual_Mode
|
||||
// Work_Mode = char_str[0] - '0';
|
||||
Work_Mode = Reed_Radar_Dual_Mode;
|
||||
memset(USART3_RX_Buffer,0,sizeof(USART3_RX_Buffer)); // Get Radar config Parameters
|
||||
Radar_Data_Flag = 0; //
|
||||
break;
|
||||
}
|
||||
|
||||
case 'P' : { // Config Radar parameters in following code
|
||||
Set_PCR_Parameter(char_str , data_len);
|
||||
}
|
||||
case 'V' : {
|
||||
Reply_Version_Info();
|
||||
}
|
||||
}
|
||||
// if(USART1_RX_Buffer[index1+1] != '5')
|
||||
// {
|
||||
// Work_Mode = USART1_RX_Buffer[index+2]-'0';
|
||||
// if(Work_Mode == 0)
|
||||
// {
|
||||
// *Color = USART1_RX_Buffer[index+4]-'0';
|
||||
// }
|
||||
// else if(Work_Mode == 2)
|
||||
// {
|
||||
// Reed_Working();
|
||||
// }
|
||||
// else if(Work_Mode == 3)
|
||||
// {
|
||||
// memset(USART3_RX_Buffer,0,sizeof(USART3_RX_Buffer));
|
||||
// Radar_Data_Flag = 0;
|
||||
// }
|
||||
// }
|
||||
// else if(USART1_RX_Buffer[index+2] == 'P')
|
||||
// {
|
||||
// Set_PCR_Parameter((char *)&USART1_RX_Buffer[index+3]);
|
||||
// }
|
||||
|
||||
memset(USART1_RX_Buffer,0,sizeof(USART1_RX_Buffer));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static int hex2int(char c)
|
||||
{
|
||||
if(c >= '0' && c <= '9'){
|
||||
return (c-'0');
|
||||
}
|
||||
else if (c >= 'A' && c<= 'Z'){
|
||||
return (c-'A');
|
||||
}
|
||||
else if (c >= 'a' && c <= 'z'){
|
||||
return (c-'a');
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void hex2str(char* hex , char* str )
|
||||
{
|
||||
uint8_t i = 0;
|
||||
size_t j = 0;
|
||||
uint8_t a,b;
|
||||
for (j = 0; j < strlen(hex); j++)
|
||||
{
|
||||
a = hex2int(hex[i++]);
|
||||
b = hex2int(hex[i++]);
|
||||
str[j] = a*16+b;
|
||||
}
|
||||
str[j] = '\0';
|
||||
}
|
||||
|
||||
void Reply_Version_Info()
|
||||
{
|
||||
|
||||
//Node_Send_Data(userappctrlport, UnConfirmed , 0x56, MajorVer, MinorVer, SubMinorVer);
|
||||
printf("AT+LRSEND=%d,0,4,<%02x%02x%02x%02x\r\n",userappctrlport, 0x56, MajorVer, MinorVer, SubMinorVer); //2023-06-01
|
||||
|
||||
|
||||
/* V 2.1.2 {56 23 06 01} */
|
||||
|
||||
}
|
||||
void Set_PCR_Parameter(char *str,uint8_t len)
|
||||
{
|
||||
PCR PCR_parameter;
|
||||
char buffer[128];
|
||||
if(len == 15)
|
||||
{
|
||||
PCR_parameter.Start = hex2int(str[1])*1000+hex2int(str[2])*100+hex2int(str[3])*10+hex2int(str[4]);
|
||||
PCR_parameter.End = hex2int(str[5])*1000+hex2int(str[6])*100+hex2int(str[7])*10+hex2int(str[8]);
|
||||
PCR_parameter.Threshold = hex2int(str[9])*1000+hex2int(str[10])*100+hex2int(str[11])*10+hex2int(str[12]);
|
||||
PCR_parameter.Gain = hex2int(str[13])*10+hex2int(str[14]);
|
||||
|
||||
// PCR_parameter.Start = str[1]*1000+str[2]*100+str[3]*10+str[4];
|
||||
// PCR_parameter.End = str[5]*1000+str[6]*100+str[7]*10+str[8];
|
||||
// PCR_parameter.Threshold = str[9]*1000+str[10]*100+str[11]*10+str[12];
|
||||
// PCR_parameter.Gain = str[13]*10+str[14];
|
||||
|
||||
sprintf(buffer , "Sparse Stop\r\n");
|
||||
Usart_SendString(USART3 , buffer);
|
||||
LL_mDelay(500);
|
||||
|
||||
|
||||
sprintf(buffer , "Set Start=%dmm\r\n",PCR_parameter.Start);
|
||||
Usart_SendString(USART3 , buffer);
|
||||
LL_mDelay(500);
|
||||
|
||||
sprintf(buffer , "Set end=%dmm\r\n",PCR_parameter.End);
|
||||
Usart_SendString(USART3 , buffer);
|
||||
LL_mDelay(500);
|
||||
|
||||
sprintf(buffer , "Set Threshold=%d\r\n",PCR_parameter.Threshold);
|
||||
Usart_SendString(USART3 , buffer);
|
||||
LL_mDelay(500);
|
||||
|
||||
sprintf(buffer , "Set Gain=%d%%\r\n",PCR_parameter.Gain);
|
||||
Usart_SendString(USART3 , buffer);
|
||||
LL_mDelay(500);
|
||||
|
||||
sprintf(buffer , "Sparse Start\r\n");
|
||||
Usart_SendString(USART3 , buffer);
|
||||
LL_mDelay(500);
|
||||
|
||||
// printf("AT+LRSEND=10,0,2,<4F4B\r\n"); "OK" printf("AT+LRSEND=%d,%d,%d,<00\r\n",port,confirm,1); break; }
|
||||
printf("AT+LRSEND=%d,0,16,<%02x%04x%04x%04x%02x\r\n",cmdreplyport,0x50, /* change to port 13= cmdreplyport to align with other config, 2023-06-1 sundp */
|
||||
PCR_parameter.Start,PCR_parameter.End,PCR_parameter.Threshold, PCR_parameter.Gain);
|
||||
//change to port 13= cmdreplyport to align with other config /* 2022-09-21 sundp */
|
||||
PCR PCR_parameter;
|
||||
printf("Set Start=%dmm\r\n",PCR_parameter.Start);
|
||||
printf("Set end=%dmm\r\n",PCR_parameter.End);
|
||||
printf("Set Threshold=%d\r\n",PCR_parameter.Threshold);
|
||||
printf("Set Gain=%d%%\r\n",PCR_parameter.Gain);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
uint8_t Radar_Data_Analysis(void)
|
||||
{
|
||||
uint8_t xReturn = 0;
|
||||
const char* person = "Motion ";
|
||||
const char* noperson = "No motion";
|
||||
|
||||
if(Radar_Data_Flag == 1)
|
||||
{
|
||||
if(strncmp((char *)USART3_RX_Buffer,person,strlen(person)) == 0){
|
||||
xReturn = 1;
|
||||
}
|
||||
else if( strncmp((char *)USART3_RX_Buffer,noperson,strlen(noperson)) == 0){
|
||||
xReturn = 0;
|
||||
}
|
||||
|
||||
LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_3);
|
||||
LL_USART_DisableDMAReq_RX(USART3);
|
||||
LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_3,Radar_frame_len);
|
||||
//LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_3,(uint32_t)USART3_RX_Buffer);
|
||||
LL_USART_ReceiveData8(USART3);
|
||||
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_3);
|
||||
LL_USART_EnableDMAReq_RX(USART3);
|
||||
}
|
||||
return xReturn;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Radar_Filtering_clutter(volatile uint8_t *color)
|
||||
{
|
||||
_Bool pNew_Motion_Flag = 0;
|
||||
static uint8_t Motion_Changed_Flag = 1;
|
||||
static uint8_t numerator = Preset_numerator;
|
||||
static uint8_t denominator = Preset_denominator;
|
||||
|
||||
|
||||
|
||||
pNew_Motion_Flag = Radar_Data_Analysis();
|
||||
|
||||
if(pNew_Motion_Flag != Motion_Flag){
|
||||
Motion_Changed_Flag = 1;
|
||||
}
|
||||
|
||||
if(Motion_Changed_Flag == 1)
|
||||
{
|
||||
denominator++; // num /denom++
|
||||
|
||||
if(pNew_Motion_Flag != Motion_Flag){
|
||||
numerator++; // num ++ /denom
|
||||
}
|
||||
|
||||
if(denominator >= Preset_denominator)
|
||||
{
|
||||
if(numerator >= Preset_numerator) //的确改变
|
||||
{
|
||||
Motion_Flag = !Motion_Flag;
|
||||
Occupancy_Status = Motion_Flag; // for heart-heat signal upload
|
||||
if(Motion_Flag)
|
||||
{
|
||||
// if (Work_Mode == Radar_Mode)
|
||||
// M100C_Send_Data(10,0,ZhanYong);
|
||||
|
||||
// else if (Work_Mode == Reed_Radar_Dual_Mode)
|
||||
// Node_Send_Data(senddataport,UnConfirmed, Red, Work_Mode, Door_Status, Occupancy);
|
||||
if (Work_Mode != Network_Mode)
|
||||
{
|
||||
Node_Send_Data(senddataport,UnConfirmed, Red, Work_Mode, Door_Status, Occupancy_Status);
|
||||
*color = Red;
|
||||
} else
|
||||
{
|
||||
Node_Send_Data(senddataport,UnConfirmed, netColor, Work_Mode, Door_Status, Occupancy_Status);
|
||||
*color = netColor;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// if (Work_Mode == Radar_Mode)
|
||||
// M100C_Send_Data(10,0,KeYong);
|
||||
// else // Not_Presence_status Only
|
||||
// if (Work_Mode == Reed_Radar_Dual_Mode)
|
||||
// Node_Send_Data(senddataport,UnConfirmed, Green, Work_Mode, Door_Status, No_Occupancy);
|
||||
if (Work_Mode != Network_Mode) {
|
||||
Node_Send_Data(senddataport,UnConfirmed, Green, Work_Mode, Door_Status, Occupancy_Status);
|
||||
*color = Green;
|
||||
} else
|
||||
{
|
||||
Node_Send_Data(senddataport,UnConfirmed, netColor, Work_Mode, Door_Status, Occupancy_Status);
|
||||
*color = netColor;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
denominator = 0;
|
||||
numerator = 0;
|
||||
Motion_Changed_Flag = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void M100C_Send_Data(uint8_t port,uint8_t confirm,uint8_t type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case KeYong: { printf("AT+LRSEND=%d,%d,%d,<00\r\n",port,confirm,1); break; }
|
||||
case ZhanYong: { printf("AT+LRSEND=%d,%d,%d,<01\r\n",port,confirm,1); break; }
|
||||
}
|
||||
}
|
||||
|
||||
void M100C_Send_HeartBeat(uint8_t color,uint8_t Mode)
|
||||
{
|
||||
printf("AT+LRSEND=5,0,2,<%02x%02x\r\n",color,Mode);
|
||||
|
||||
PCR PCR_parameter;
|
||||
printf("Start=%dmm\r\n",PCR_parameter.Start);
|
||||
printf("end=%dmm\r\n",PCR_parameter.End);
|
||||
printf("Threshold=%d\r\n",PCR_parameter.Threshold);
|
||||
printf("Gain=%d%%\r\n",PCR_parameter.Gain);
|
||||
|
||||
}
|
||||
|
||||
void Node_Send_Data(uint8_t dataport, uint8_t confirm, uint8_t color, uint8_t workmode,uint8_t doorstatus, uint8_t presence_sensor_status)
|
||||
{
|
||||
// printf("AT+LRSEND=%d,%d,%d,<%02x%02x%02x\r\n",dataport,confirm,3,(uint8_t) color, (uint8_t) workmode, (uint8_t)(doorstatus + presence_sensor_status));
|
||||
|
||||
printf("AT+LRSEND=%d,%d,%d,<%02x%02x%02x%02x\r\n",
|
||||
dataport,confirm,4,
|
||||
(uint8_t) color,
|
||||
(uint8_t) workmode,
|
||||
(uint8_t) !doorstatus,
|
||||
(uint8_t) presence_sensor_status);
|
||||
|
||||
}
|
||||
|
||||
void Node_Config_LoRa_ADR(uint8_t adr_en)
|
||||
{
|
||||
if (adr_en==1)
|
||||
printf("AT+ADREN=1\r\n");
|
||||
else printf("AT+ADREN=0\r\n");
|
||||
|
||||
}
|
||||
|
||||
|
||||
void DMA_USART1_RX_Config(void)
|
||||
{
|
||||
/* 复制USART初始化中DMA的代码,避免CUBE的BUG */
|
||||
LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_5, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);
|
||||
|
||||
LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_5, LL_DMA_PRIORITY_VERYHIGH);
|
||||
|
||||
LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_5, LL_DMA_MODE_CIRCULAR);
|
||||
|
||||
LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_5, LL_DMA_PERIPH_NOINCREMENT);
|
||||
|
||||
LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_5, LL_DMA_MEMORY_INCREMENT);
|
||||
|
||||
LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_5, LL_DMA_PDATAALIGN_BYTE);
|
||||
|
||||
LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_5, LL_DMA_MDATAALIGN_BYTE);
|
||||
/* 复制USART初始化中DMA的代码,避免CUBE的BUG */
|
||||
|
||||
/* 手动配置DMA的外设地址、内存地址并使能DMA */
|
||||
LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_5,(uint32_t)&(USART1->DR));
|
||||
LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_5,(uint32_t)USART1_RX_Buffer);
|
||||
LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_5,max_size);
|
||||
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_5);
|
||||
LL_USART_EnableDMAReq_RX(USART1);
|
||||
|
||||
|
||||
/* 开启串口空闲中断 */
|
||||
LL_USART_ClearFlag_IDLE(USART1);
|
||||
LL_USART_EnableIT_IDLE(USART1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void DMA_USART3_RX_Config(void)
|
||||
{
|
||||
LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_3,(uint32_t)&(USART3->DR));
|
||||
LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_3,(uint32_t)USART3_RX_Buffer);
|
||||
LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_3,Radar_frame_len);
|
||||
LL_USART_ReceiveData8(USART3);
|
||||
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_3);
|
||||
LL_USART_EnableDMAReq_RX(USART3);
|
||||
LL_USART_EnableIT_IDLE(USART3);
|
||||
}
|
||||
|
||||
|
||||
///重定向c库函数printf到串口,重定向后可使用printf函数
|
||||
int fputc(int ch, FILE *f)
|
||||
{
|
||||
/* 发送一个字节数据到串口 */
|
||||
LL_USART_TransmitData8(USART1, (uint8_t) ch); //USART1 LoRaWAN USART1
|
||||
|
||||
/* 等待发送完毕 */
|
||||
while (LL_USART_IsActiveFlag_TXE(USART1) == RESET); //USART1 LoRaWAN USART1
|
||||
|
||||
return (ch);
|
||||
}
|
||||
|
||||
|
||||
/***************** 发送一个字节 **********************/
|
||||
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
|
||||
{
|
||||
/* 发送一个字节数据到USART */
|
||||
LL_USART_TransmitData8(pUSARTx,ch);
|
||||
|
||||
/* 等待发送数据寄存器为空 */
|
||||
while (LL_USART_IsActiveFlag_TXE(pUSARTx) == RESET);
|
||||
}
|
||||
|
||||
/***************** 发送字符串 **********************/
|
||||
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
|
||||
{
|
||||
unsigned int k=0;
|
||||
do
|
||||
{
|
||||
Usart_SendByte( pUSARTx, *(str + k) );
|
||||
k++;
|
||||
} while(*(str + k)!='\0');
|
||||
|
||||
/* 等待发送完成 */
|
||||
while(LL_USART_IsActiveFlag_TC(pUSARTx)==RESET)
|
||||
{}
|
||||
}
|
||||
void Usart_SendArray( USART_TypeDef * pUSARTx, uint8_t *array, uint16_t num)
|
||||
{
|
||||
uint8_t i;
|
||||
|
||||
for(i=0; i<num; i++)
|
||||
{
|
||||
/* 发送一个字节数据到USART */
|
||||
Usart_SendByte(pUSARTx,array[i]);
|
||||
|
||||
}
|
||||
/* 等待发送完成 */
|
||||
while(LL_USART_IsActiveFlag_TC(pUSARTx)==RESET);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* USER CODE END 1 */
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
>>>>>>> 4e9be3f977eb8162ae244444b34521c9d34e5e01
|
||||
|
|
Loading…
Reference in New Issue