This commit is contained in:
Yunhorn 2023-06-02 09:12:16 +08:00
commit 55c468b8e8
17 changed files with 7232 additions and 18 deletions

89
.gitignore vendored
View File

@ -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

169
Inc/main-YUNHORN-MASTER.h Normal file
View File

@ -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>&copy; 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****/

View File

@ -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>&copy; 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

View File

@ -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>&copy; 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

View File

@ -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

View File

@ -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

View File

@ -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)
}
}

View File

@ -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'
*/

View File

@ -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

View File

@ -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

View File

@ -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>&copy; 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

705
Src/usart-YUNHORN-MASTER.c Normal file
View File

@ -0,0 +1,705 @@
/**
******************************************************************************
* File Name : USART.c
* Description : This file provides code for the configuration
* of the USART instances.
******************************************************************************
* @attention
*
* <h2><center>&copy; 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****/

View File

@ -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>&copy; 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