update stm32wl project

This commit is contained in:
supowang
2021-11-18 13:14:20 +08:00
parent 5d10e64fff
commit feeb23a203
14 changed files with 1088 additions and 548 deletions

View File

@@ -50,9 +50,11 @@ extern "C" {
extern UART_HandleTypeDef huart1;
extern UART_HandleTypeDef huart2;
extern UART_HandleTypeDef hlpuart1;
void MX_USART1_UART_Init(void);
void MX_USART2_UART_Init(void);
void MX_LPUART1_UART_Init(void);
#ifdef __cplusplus
}

View File

@@ -30,6 +30,7 @@ void board_init(void)
HAL_Init();
SystemClock_Config();
MX_USART1_UART_Init();
//MX_LPUART1_UART_Init();
}
/**

View File

@@ -25,8 +25,10 @@
/* External variables --------------------------------------------------------*/
/* Private typedef -----------------------------------------------------------*/
uint8_t msg;
uint8_t pm2d5_byte_data;
uint8_t data;
UART_HandleTypeDef hlpuart1;
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
@@ -35,6 +37,27 @@ UART_HandleTypeDef huart2;
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Functions Definition ------------------------------------------------------*/
void MX_LPUART1_UART_Init(void)
{
hlpuart1.Instance = LPUART1;
hlpuart1.Init.BaudRate = 115200;
hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
hlpuart1.Init.StopBits = UART_STOPBITS_1;
hlpuart1.Init.Parity = UART_PARITY_NONE;
hlpuart1.Init.Mode = UART_MODE_TX_RX;
hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&hlpuart1) != HAL_OK)
{
Error_Handler();
}
HAL_UART_Receive_IT(&hlpuart1, &data, 1);
/* USER CODE BEGIN LPUART1_Init 2 */
/* USER CODE END LPUART1_Init 2 */
}
void MX_USART1_UART_Init(void)
{
@@ -71,15 +94,36 @@ void MX_USART2_UART_Init(void)
Error_Handler();
}
HAL_UART_Receive_IT(&huart2, &msg, 1);
HAL_UART_Receive_IT(&huart2, &pm2d5_byte_data, 1);
}
void HAL_UART_MspInit(UART_HandleTypeDef *uartHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
if(uartHandle->Instance==LPUART1)
{
__HAL_RCC_LPUART1_CLK_ENABLE();
if(uartHandle->Instance==USART2)
__HAL_RCC_GPIOC_CLK_ENABLE();
/**LPUART1 GPIO Configuration
PC0 ------> LPUART1_RX
PC1 ------> LPUART1_TX
*/
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/* LPUART1 interrupt Init */
HAL_NVIC_SetPriority(LPUART1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(LPUART1_IRQn);
/* USER CODE BEGIN LPUART1_MspInit 1 */
/* USER CODE END LPUART1_MspInit 1 */
}
else if(uartHandle->Instance==USART2)
{
/* USER CODE BEGIN USART2_MspInit 0 */

View File

@@ -16,7 +16,7 @@
<TargetCommonOption>
<Device>STM32WLE5JCIx</Device>
<Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32WLxx_DFP.1.0.2.OEM</PackID>
<PackID>Keil.STM32WLxx_DFP.1.0.7</PackID>
<PackURL>http://www.keil.com/pack</PackURL>
<Cpu>IRAM(0x20000000,0x10000) IROM(0x08000000,0x40000) CPUTYPE("Cortex-M4") CLOCK(12000000) ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec>

View File

@@ -1,30 +1,194 @@
/* Includes ------------------------------------------------------------------*/
#include "timer.h"
#include "app_system.h"
#include "app_lorawan.h"
#include "stm32_lpm.h"
#include "adc_if.h"
#include "lorawan_version.h"
#include <tos_k.h>
#include "sensor_parser.h"
#include "pm2d5_parser.h"
#include "tos_k.h"
#include "esp8266_tencent_firmware.h"
#include "tencent_firmware_module_wrapper.h"
#include "math.h"
//#define USE_WIFI
#define APP_TX_DUTYCYCLE 30000 //ms
#define LORAWAN_DOWNLINK_PORT 2
#define LORAWAN_UPLINK_PORT 10
#define WIFI_SSID "TencentOS"
#define WIFI_PASSWD "tencentostiny"
#define PRODUCT_ID "ZLC54JVTAH"
#define DEVICE_NAME "node_20DEBC0A0000"
#define DEVICE_KEY "QXiswx4I1T+bZyHOrHvaqg=="
#define REPORT_DATA_TEMPLATE "{\"method\":\"report\",\"clientToken\":\"%s\"," \
"\"params\":{\"a\":%d," \
"\"b\":%d," \
"\"c\":%d," \
"\"d\":%d," \
"\"e\":%d," \
"\"f\":%d," \
"\"g\":%d," \
"\"h\":%d," \
"\"i\":%d," \
"\"j\":%d," \
"\"k\":%d," \
"\"l\":%d," \
"\"v\":%d," \
"\"ec\":%d" \
"}}"
void default_message_handler(mqtt_message_t* msg)
{
printf("callback:\r\n");
printf("---------------------------------------------------------\r\n");
printf("\ttopic:%s\r\n", msg->topic);
printf("\tpayload:%s\r\n", msg->payload);
printf("---------------------------------------------------------\r\n");
}
char payload[1024] = {0};
static char report_topic_name[TOPIC_NAME_MAX_SIZE] = {0};
static char report_reply_topic_name[TOPIC_NAME_MAX_SIZE] = {0};
k_mail_q_t mail_q;
#define DATA_CNT 26
uint8_t mail_buf[DATA_CNT];
pm2d5_data_u pm2d5_value;
uint8_t pm2d5_value_pool[3 * sizeof(pm2d5_data_u)];
void generate_client_token(char* buffer, size_t size)
{
long client_token_value;
memset(buffer, 0, size);
client_token_value = ((long)tos_systick_get()) % (long)(pow(10, size));
snprintf(buffer, size, "%ld", client_token_value);
}
void mqtt_demo_task(void)
{
int ret = 0;
int size = 0;
int i = 0;
char *product_id = PRODUCT_ID;
char *device_name = DEVICE_NAME;
char *key = DEVICE_KEY;
device_info_t dev_info;
memset(&dev_info, 0, sizeof(device_info_t));
char str[16];
size_t mail_size;
uint8_t report_error_count = 0;
char client_token[10];
/**
* Please Choose your AT Port first, default is HAL_UART_2(USART2)
*/
ret = esp8266_tencent_firmware_sal_init(HAL_UART_PORT_0);
if (ret < 0) {
printf("esp8266 tencent firmware sal init fail, ret is %d\r\n", ret);
return;
}
while (1) {
if ( esp8266_tencent_firmware_join_ap(WIFI_SSID, WIFI_PASSWD) == 0) {
printf("module WIFI connect success\n");
break;
}
printf("module WIFI connect fail\n");
tos_sleep_ms(2000);
}
strncpy(dev_info.product_id, product_id, PRODUCT_ID_MAX_SIZE);
strncpy(dev_info.device_name, device_name, DEVICE_NAME_MAX_SIZE);
strncpy(dev_info.device_serc, key, DEVICE_SERC_MAX_SIZE);
tos_tf_module_info_set(&dev_info, TLS_MODE_PSK);
mqtt_param_t init_params = DEFAULT_MQTT_PARAMS;
while (1) {
if (tos_tf_module_mqtt_conn(init_params) == 0) {
printf("module mqtt connect success\n");
break;
}
printf("module mqtt connect fail\n");
tos_sleep_ms(5000);
}
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>topic */
size = snprintf(report_reply_topic_name, TOPIC_NAME_MAX_SIZE, "$thing/down/property/%s/%s", product_id, device_name);
if (size < 0 || size > sizeof(report_reply_topic_name) - 1) {
printf("sub topic content length not enough! content size:%d buf size:%d", size, (int)sizeof(report_reply_topic_name));
}
if (tos_tf_module_mqtt_sub(report_reply_topic_name, QOS0, default_message_handler) != 0) {
printf("module mqtt sub fail\n");
} else {
printf("module mqtt sub success\n");
}
memset(report_topic_name, 0, sizeof(report_topic_name));
size = snprintf(report_topic_name, TOPIC_NAME_MAX_SIZE, "$thing/up/property/%s/%s", product_id, device_name);
if (size < 0 || size > sizeof(report_topic_name) - 1) {
printf("pub topic content length not enough! content size:%d buf size:%d", size, (int)sizeof(report_topic_name));
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
tos_mail_q_create(&mail_q, pm2d5_value_pool, 3, sizeof(pm2d5_data_u));
HAL_NVIC_DisableIRQ(USART2_IRQn);
if (pm2d5_parser_init() == -1) {
printf("pm2d5 parser init fail\r\n");
return;
}
while (1) {
/* ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> */
HAL_NVIC_EnableIRQ(USART2_IRQn);
tos_mail_q_pend(&mail_q, (uint8_t*)&pm2d5_value, &mail_size, TOS_TIME_FOREVER);
HAL_NVIC_DisableIRQ(USART2_IRQn);
//<2F>յ<EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>ӡ<EFBFBD><D3A1>Ϣ
printf("\r\n\r\n\r\n");
for (i = 0; i < 13; i++) {
printf("data[%d]:%d ug/m3\r\n", i+1, pm2d5_value.data[i]);
}
typedef struct device_data_st {
uint8_t data[DATA_CNT];
} __PACKED__ dev_data_t;
/* <20>ϱ<EFBFBD>ֵ */
generate_client_token(client_token, sizeof(client_token));
memset(payload, 0, 1024);
snprintf(payload, 1024, REPORT_DATA_TEMPLATE, client_token,
pm2d5_value.pm2d5_data.data1, pm2d5_value.pm2d5_data.data2,
pm2d5_value.pm2d5_data.data3, pm2d5_value.pm2d5_data.data4,
pm2d5_value.pm2d5_data.data5, pm2d5_value.pm2d5_data.data6,
pm2d5_value.pm2d5_data.data7, pm2d5_value.pm2d5_data.data8,
pm2d5_value.pm2d5_data.data9, pm2d5_value.pm2d5_data.data10,
pm2d5_value.pm2d5_data.data11, pm2d5_value.pm2d5_data.data12,
2, pm2d5_value.pm2d5_data.err_code);
if (tos_tf_module_mqtt_publ(report_topic_name, QOS0, payload) != 0) {
report_error_count++;
printf("module mqtt publ fail, count: %d\n", report_error_count);
sprintf(str, "# report fail");
} else {
report_error_count = 0;
printf("module mqtt publ success\n");
sprintf(str, "# report ok");
}
if (report_error_count >= 6) {
HAL_NVIC_SystemReset();
}
tos_sleep_ms(5000);
}
}
/*!
* user main_callback function declare , you need to implement them
@@ -110,10 +274,6 @@ void MX_LoRaWAN_Init(void)
printf("lorawan init ok.\r\n");
}
uint8_t pool[DATA_CNT];
#define CMD_LEN_MAX 50
char cmd_buf[CMD_LEN_MAX];
dev_data_t dev_data;
uint16_t report_period = 10;
@@ -143,13 +303,25 @@ void recv_callback(uint8_t *data, uint8_t len)
void application_entry(void *arg)
{
#ifdef USE_WIFI
mqtt_demo_task();
while (1) {
printf("This is a mqtt demo!\r\n");
tos_task_delay(1000);
}
#else
int i = 0;
int ret = 0;
int send_failed_count = 0;
size_t mail_size;
tos_mail_q_create(&mail_q, pm2d5_value_pool, 3, sizeof(pm2d5_data_u));
tos_mail_q_create(&mail_q, pool, DATA_CNT, sizeof(uint8_t));
tos_shell_init(cmd_buf, sizeof(cmd_buf), uart_output);
HAL_NVIC_DisableIRQ(USART2_IRQn);
if (pm2d5_parser_init() == -1) {
printf("pm2d5 parser init fail\r\n");
return;
}
//create task to process loramac
tos_sem_create_max(&lora_mac_process_sem, 0, 1);
@@ -164,17 +336,21 @@ void application_entry(void *arg)
//report pm2.5 data
while (1) {
size_t mail_size;
tos_mail_q_pend(&mail_q, &dev_data.data, &mail_size, TOS_TIME_FOREVER);
HAL_NVIC_EnableIRQ(USART2_IRQn);
tos_mail_q_pend(&mail_q, (uint8_t*)&pm2d5_value, &mail_size, TOS_TIME_FOREVER);
HAL_NVIC_DisableIRQ(USART2_IRQn);
//<2F>յ<EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>ӡ<EFBFBD><D3A1>Ϣ
printf("\r\n\r\n\r\n");
for (i = 0; i < 13; i++) {
printf("data[%d]:%d ug/m3\r\n", i+1, pm2d5_value.data[i]);
}
/*fill the data*/
i = 0;
app_data.port = LORAWAN_UPLINK_PORT;
for (i = 0; i < mail_size; i++) {
app_data.buff[i] = dev_data.data[i];
printf("[%d] %x\n", i, dev_data.data[i]);
app_data.buff[i] = pm2d5_value.data[i];
}
printf("\n\n");
app_data.size = i;
@@ -209,6 +385,7 @@ void application_entry(void *arg)
}
//Lora_start_send();
#endif
}
void Lora_start_send(void)

View File

@@ -0,0 +1,193 @@
#include "tos_k.h"
#include "esp8266_tencent_firmware.h"
#include "tencent_firmware_module_wrapper.h"
#include "pm2d5_parser.h"
#include "math.h"
#define WIFI_SSID "Tencent-GuestWiFi"
#define WIFI_PASSWD ""
#define PRODUCT_ID "ZLC54JVTAH"
#define DEVICE_NAME "node_20DEBC0A0000"
#define DEVICE_KEY "QXiswx4I1T+bZyHOrHvaqg=="
#define REPORT_DATA_TEMPLATE "{\"method\":\"report\",\"clientToken\":\"%s\"," \
"\"params\":{\"a\":%d," \
"\"b\":%d," \
"\"c\":%d," \
"\"d\":%d," \
"\"e\":%d," \
"\"f\":%d," \
"\"g\":%d," \
"\"h\":%d," \
"\"i\":%d," \
"\"j\":%d," \
"\"k\":%d," \
"\"l\":%d," \
"\"v\":%d," \
"\"ec\":%d" \
"}}"
void default_message_handler(mqtt_message_t* msg)
{
printf("callback:\r\n");
printf("---------------------------------------------------------\r\n");
printf("\ttopic:%s\r\n", msg->topic);
printf("\tpayload:%s\r\n", msg->payload);
printf("---------------------------------------------------------\r\n");
}
char payload[1024] = {0};
static char report_topic_name[TOPIC_NAME_MAX_SIZE] = {0};
static char report_reply_topic_name[TOPIC_NAME_MAX_SIZE] = {0};
k_mail_q_t mail_q;
pm2d5_data_u pm2d5_value;
uint8_t pm2d5_value_pool[3 * sizeof(pm2d5_data_u)];
void generate_client_token(char* buffer, size_t size)
{
long client_token_value;
memset(buffer, 0, size);
client_token_value = ((long)tos_systick_get()) % (long)(pow(10, size));
snprintf(buffer, size, "%ld", client_token_value);
}
void mqtt_demo_task(void)
{
int ret = 0;
int size = 0;
int i = 0;
char *product_id = PRODUCT_ID;
char *device_name = DEVICE_NAME;
char *key = DEVICE_KEY;
device_info_t dev_info;
memset(&dev_info, 0, sizeof(device_info_t));
char str[16];
size_t mail_size;
uint8_t report_error_count = 0;
char client_token[10];
/**
* Please Choose your AT Port first, default is HAL_UART_2(USART2)
*/
ret = esp8266_tencent_firmware_sal_init(HAL_UART_PORT_2);
if (ret < 0) {
printf("esp8266 tencent firmware sal init fail, ret is %d\r\n", ret);
return;
}
while (1) {
if ( esp8266_tencent_firmware_join_ap(WIFI_SSID, WIFI_PASSWD) == 0) {
printf("module WIFI connect success\n");
break;
}
printf("module WIFI connect fail\n");
tos_sleep_ms(2000);
}
strncpy(dev_info.product_id, product_id, PRODUCT_ID_MAX_SIZE);
strncpy(dev_info.device_name, device_name, DEVICE_NAME_MAX_SIZE);
strncpy(dev_info.device_serc, key, DEVICE_SERC_MAX_SIZE);
tos_tf_module_info_set(&dev_info, TLS_MODE_PSK);
mqtt_param_t init_params = DEFAULT_MQTT_PARAMS;
while (1) {
if (tos_tf_module_mqtt_conn(init_params) == 0) {
printf("module mqtt connect success\n");
break;
}
printf("module mqtt connect fail\n");
tos_sleep_ms(5000);
}
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>topic */
size = snprintf(report_reply_topic_name, TOPIC_NAME_MAX_SIZE, "$thing/down/property/%s/%s", product_id, device_name);
if (size < 0 || size > sizeof(report_reply_topic_name) - 1) {
printf("sub topic content length not enough! content size:%d buf size:%d", size, (int)sizeof(report_reply_topic_name));
}
if (tos_tf_module_mqtt_sub(report_reply_topic_name, QOS0, default_message_handler) != 0) {
printf("module mqtt sub fail\n");
} else {
printf("module mqtt sub success\n");
}
memset(report_topic_name, 0, sizeof(report_topic_name));
size = snprintf(report_topic_name, TOPIC_NAME_MAX_SIZE, "$thing/up/property/%s/%s", product_id, device_name);
if (size < 0 || size > sizeof(report_topic_name) - 1) {
printf("pub topic content length not enough! content size:%d buf size:%d", size, (int)sizeof(report_topic_name));
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
tos_mail_q_create(&mail_q, pm2d5_value_pool, 3, sizeof(pm2d5_data_u));
HAL_NVIC_DisableIRQ(USART2_IRQn);
if (pm2d5_parser_init() == -1) {
printf("pm2d5 parser init fail\r\n");
return;
}
while (1) {
/* ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> */
HAL_NVIC_EnableIRQ(USART2_IRQn);
tos_mail_q_pend(&mail_q, (uint8_t*)&pm2d5_value, &mail_size, TOS_TIME_FOREVER);
HAL_NVIC_DisableIRQ(USART2_IRQn);
//<2F>յ<EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>ӡ<EFBFBD><D3A1>Ϣ
printf("\r\n\r\n\r\n");
for (i = 0; i < 13; i++) {
printf("data[%d]:%d ug/m3\r\n", i+1, pm2d5_value.data[i]);
}
/* <20><>ʾPM2.5<EFBFBD><EFBFBD>ֵ */
sprintf(str, "PM2.5:%4d ug/m3", pm2d5_value.pm2d5_data.data2);
OLED_ShowString(0,0,(uint8_t*)str,16);
/* <20>ϱ<EFBFBD>ֵ */
generate_client_token(client_token, sizeof(client_token));
memset(payload, 0, 1024);
snprintf(payload, 1024, REPORT_DATA_TEMPLATE, client_token,
pm2d5_value.pm2d5_data.data1, pm2d5_value.pm2d5_data.data2,
pm2d5_value.pm2d5_data.data3, pm2d5_value.pm2d5_data.data4,
pm2d5_value.pm2d5_data.data5, pm2d5_value.pm2d5_data.data6,
pm2d5_value.pm2d5_data.data7, pm2d5_value.pm2d5_data.data8,
pm2d5_value.pm2d5_data.data9, pm2d5_value.pm2d5_data.data10,
pm2d5_value.pm2d5_data.data11, pm2d5_value.pm2d5_data.data12,
2, pm2d5_value.pm2d5_data.err_code);
if (tos_tf_module_mqtt_publ(report_topic_name, QOS0, payload) != 0) {
report_error_count++;
printf("module mqtt publ fail, count: %d\n", report_error_count);
sprintf(str, "# report fail");
} else {
report_error_count = 0;
printf("module mqtt publ success\n");
sprintf(str, "# report ok");
}
if (report_error_count >= 6) {
HAL_NVIC_SystemReset();
}
tos_sleep_ms(5000);
}
}
void application_entry(void *arg)
{
char *str = "TencentOS-Tiny";
/* <20><>ʼ<EFBFBD><CABC>OLED */
mqtt_demo_task();
while (1) {
printf("This is a mqtt demo!\r\n");
tos_task_delay(1000);
}
}

View File

@@ -0,0 +1,231 @@
/*----------------------------------------------------------------------------
* Tencent is pleased to support the open source community by making TencentOS
* available.
*
* Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
* If you have downloaded a copy of the TencentOS binary from Tencent, please
* note that the TencentOS binary is licensed under the BSD 3-Clause License.
*
* If you have downloaded a copy of the TencentOS source code from Tencent,
* please note that TencentOS source code is licensed under the BSD 3-Clause
* License, except for the third-party components listed below which are
* subject to different license terms. Your integration of TencentOS into your
* own projects may require compliance with the BSD 3-Clause License, as well
* as the other licenses applicable to the third-party components included
* within TencentOS.
*---------------------------------------------------------------------------*/
#include "pm2d5_parser.h"
static pm2d5_parser_ctrl_t pm2d5_parser_ctrl;
static k_stack_t pm2d5_parser_task_stack[PM2D5_PARSER_TASK_STACK_SIZE];
static uint8_t pm2d5_parser_buffer[PM2D5_PARSER_BUFFER_SIZE];
/**
* @brief PM2D5<44><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<D4AD><CABC><EFBFBD><EFBFBD>
* @note <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ϱ<EFBFBD>32<33>ֽڣ<D6BD>ͷ<EFBFBD><CDB7>0x42<34><32>0x4d<34>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>28<32>ֽ<EFBFBD>
*/
typedef struct pm2d5_raw_data_st {
uint8_t data1_h;
uint8_t data1_l;
uint8_t data2_h;
uint8_t data2_l;
uint8_t data3_h;
uint8_t data3_l;
uint8_t data4_h;
uint8_t data4_l;
uint8_t data5_h;
uint8_t data5_l;
uint8_t data6_h;
uint8_t data6_l;
uint8_t data7_h;
uint8_t data7_l;
uint8_t data8_h;
uint8_t data8_l;
uint8_t data9_h;
uint8_t data9_l;
uint8_t data10_h;
uint8_t data10_l;
uint8_t data11_h;
uint8_t data11_l;
uint8_t data12_h;
uint8_t data12_l;
uint8_t data13_h; //<2F><EFBFBD><E6B1BE>
uint8_t data13_l; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t chk_sum_h; //<2F><>У<EFBFBD><D0A3><EFBFBD><EFBFBD>
uint8_t chk_sum_l; //<2F><>У<EFBFBD><D0A3><EFBFBD><EFBFBD>
} pm2d5_raw_data_t;
typedef union pm2d5_raw_data_un {
uint8_t data[30];
pm2d5_raw_data_t pm2d5_raw_data;
}pm2d5_raw_data_u;
/**
* @brief <20><>PM2D5<44><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
* @param data <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval none
* @note <20><>Ҫ<EFBFBD>û<EFBFBD><C3BB>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>жϺ<D0B6><CFBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>
*/
void pm2d5_parser_input_byte(uint8_t data)
{
if (tos_chr_fifo_push(&pm2d5_parser_ctrl.parser_rx_fifo, data) == K_ERR_NONE) {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳɹ<DDB3><C9B9><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
tos_sem_post(&pm2d5_parser_ctrl.parser_rx_sem);
}
}
/**
* @brief PM2D5<44><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>chr fifo<66><6F>ȡ<EFBFBD><C8A1>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
* @param none
* @retval <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>󷵻<EFBFBD>-1
*/
static int pm2d5_parser_getchar(void)
{
uint8_t chr;
k_err_t err;
/* <20><><EFBFBD>õȴ<C3B5><C8B4>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD>Ϊ<EFBFBD>ձ<EFBFBD>ʾchr fifo<66><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if (tos_sem_pend(&pm2d5_parser_ctrl.parser_rx_sem, TOS_TIME_FOREVER) != K_ERR_NONE) {
return -1;
}
/* <20><>chr fifo<66><6F>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
err = tos_chr_fifo_pop(&pm2d5_parser_ctrl.parser_rx_fifo, &chr);
return err == K_ERR_NONE ? chr : -1;
}
/**
* @brief PM2D5<44><35>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<D4AD><CABC><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD>
* @param void
* @retval <20><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD>-1
*/
static int pm2d5_parser_read_raw_data(pm2d5_raw_data_u *pm2d5_raw_data, pm2d5_data_u *pm2d5_data)
{
int i;
uint8_t len_h,len_l;
uint16_t len;
uint16_t check_sum;
uint16_t check_sum_cal = 0x42 + 0x4d;
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD> */
len_h = pm2d5_parser_getchar();
len_l = pm2d5_parser_getchar();
len = (len_h << 8) | len_l;
if ( len != 0x001C) {
//<2F>Ǵ<EFBFBD><C7B4><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
for (i = 0; i < len; i++) {
pm2d5_parser_getchar();
}
return -1;
}
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<D4AD><CABC><EFBFBD><EFBFBD> */
for (i = 0; i < len; i++) {
pm2d5_raw_data->data[i] = pm2d5_parser_getchar();
}
/* <20><>У<EFBFBD><D0A3> */
//ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
check_sum_cal = check_sum_cal + len_h + len_l;
for (i = 0; i < len -2; i++) {
check_sum_cal += pm2d5_raw_data->data[i];
}
//Э<><D0AD><EFBFBD>и<EFBFBD><D0B8><EFBFBD><EFBFBD>ĺ<EFBFBD>У<EFBFBD><D0A3>ֵ
check_sum = (pm2d5_raw_data->pm2d5_raw_data.chk_sum_h << 8) + pm2d5_raw_data->pm2d5_raw_data.chk_sum_l;
if (check_sum_cal != check_sum) {
return -1;
}
/* <20><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ */
for (i = 0; i < sizeof(pm2d5_data_t); i++) {
pm2d5_data->data[i] = (pm2d5_raw_data->data[i*2] << 8) | pm2d5_raw_data->data[i*2 + 1];
}
return 0;
}
extern k_mail_q_t mail_q;
pm2d5_raw_data_u pm2d5_raw_data;
pm2d5_data_u pm2d5_data;
/**
* @brief PM2D5<44><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
static void pm2d5_parser_task_entry(void *arg)
{
int chr, last_chr = 0;
while (1) {
chr = pm2d5_parser_getchar();
if (chr < 0) {
printf("parser task get char fail!\r\n");
continue;
}
if (chr == 0x4d && last_chr == 0x42) {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ */
if (0 == pm2d5_parser_read_raw_data(&pm2d5_raw_data, &pm2d5_data)) {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4B7A2> */
tos_mail_q_post(&mail_q, &pm2d5_data, sizeof(pm2d5_data_t));
}
}
last_chr = chr;
}
}
/**
* @brief <20><>ʼ<EFBFBD><CABC>PM2D5<44><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param none
* @retval ȫ<><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD>κ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7><EFBFBD>򷵻<EFBFBD>-1
*/
int pm2d5_parser_init(void)
{
k_err_t ret;
memset((pm2d5_parser_ctrl_t*)&pm2d5_parser_ctrl, 0, sizeof(pm2d5_parser_ctrl));
/* <20><><EFBFBD><EFBFBD> chr fifo */
ret = tos_chr_fifo_create(&pm2d5_parser_ctrl.parser_rx_fifo, pm2d5_parser_buffer, sizeof(pm2d5_parser_buffer));
if (ret != K_ERR_NONE) {
printf("pm2d5 parser chr fifo create fail, ret = %d\r\n", ret);
return -1;
}
/* <20><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD> */
ret = tos_sem_create(&pm2d5_parser_ctrl.parser_rx_sem, 0);
if (ret != K_ERR_NONE) {
printf("pm2d5 parser_rx_sem create fail, ret = %d\r\n", ret);
return -1;
}
/* <20><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD> */
ret = tos_task_create(&pm2d5_parser_ctrl.parser_task, "pm2d5_parser_task",
pm2d5_parser_task_entry, NULL, PM2D5_PARSER_TASK_PRIO,
pm2d5_parser_task_stack,PM2D5_PARSER_TASK_STACK_SIZE,0);
if (ret != K_ERR_NONE) {
printf("pm2d5 parser task create fail, ret = %d\r\n", ret);
return -1;
}
return 0;
}

View File

@@ -0,0 +1,67 @@
/*----------------------------------------------------------------------------
* Tencent is pleased to support the open source community by making TencentOS
* available.
*
* Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
* If you have downloaded a copy of the TencentOS binary from Tencent, please
* note that the TencentOS binary is licensed under the BSD 3-Clause License.
*
* If you have downloaded a copy of the TencentOS source code from Tencent,
* please note that TencentOS source code is licensed under the BSD 3-Clause
* License, except for the third-party components listed below which are
* subject to different license terms. Your integration of TencentOS into your
* own projects may require compliance with the BSD 3-Clause License, as well
* as the other licenses applicable to the third-party components included
* within TencentOS.
*---------------------------------------------------------------------------*/
#ifndef _PM2D5_PARSER_H_
#define _PM2D5_PARSER_H_
#include "tos_k.h"
/* pm2d5 parser config */
#define PM2D5_PARSER_TASK_STACK_SIZE 512
#define PM2D5_PARSER_TASK_PRIO 5
#define PM2D5_PARSER_BUFFER_SIZE 64
/* PM2.5 数据解析器控制块 */
typedef struct pm2d5_parser_control_st {
k_task_t parser_task; //解析器任务控制块
k_sem_t parser_rx_sem; //表示解析器从串口接收到数据
k_chr_fifo_t parser_rx_fifo; //存放解析器接收到的数据
} pm2d5_parser_ctrl_t;
/**
* @brief 解析出的PM2D5数据值
* @note 可以作为邮件发送给其他任务进行进一步处理
*/
typedef struct pm2d5_data_st {
uint16_t data1;
uint16_t data2;
uint16_t data3;
uint16_t data4;
uint16_t data5;
uint16_t data6;
uint16_t data7;
uint16_t data8;
uint16_t data9;
uint16_t data10;
uint16_t data11;
uint16_t data12;
uint8_t version;
uint8_t err_code;
}pm2d5_data_t;
typedef union pm2d5_data_un {
uint16_t data[13];
pm2d5_data_t pm2d5_data;
} pm2d5_data_u;
void pm2d5_parser_input_byte(uint8_t byte);
int pm2d5_send_read_cmd(void);
int pm2d5_parser_init(void);
#endif /* _PM2D5_PARSER_H_ */

View File

@@ -1,337 +0,0 @@
/*----------------------------------------------------------------------------
* Tencent is pleased to support the open source community by making TencentOS
* available.
*
* Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
* If you have downloaded a copy of the TencentOS binary from Tencent, please
* note that the TencentOS binary is licensed under the BSD 3-Clause License.
*
* If you have downloaded a copy of the TencentOS source code from Tencent,
* please note that TencentOS source code is licensed under the BSD 3-Clause
* License, except for the third-party components listed below which are
* subject to different license terms. Your integration of TencentOS into your
* own projects may require compliance with the BSD 3-Clause License, as well
* as the other licenses applicable to the third-party components included
* within TencentOS.
*---------------------------------------------------------------------------*/
#include "sensor_parser.h"
__STATIC__ shell_ctl_t shell_ctl;
__STATIC__ k_stack_t shell_parser_task_stack[SHELL_PARSER_TASK_STACK_SIZE];
__STATIC__ int shell_getchar(void)
{
uint8_t chr;
k_err_t err;
if (tos_sem_pend(&SHELL_CTL->shell_rx_sem, TOS_TIME_FOREVER) != K_ERR_NONE) {
return -1;
}
err = tos_chr_fifo_pop(&SHELL_CTL->shell_rx_fifo, &chr);
return err == K_ERR_NONE ? chr : -1;
}
typedef struct sensor_frame_st {
uint16_t len;
uint16_t data1;
uint16_t data2;
uint16_t data3;
uint16_t data4;
uint16_t data5;
uint16_t data6;
uint16_t data7;
uint16_t data8;
uint16_t data9;
uint16_t data10;
uint16_t data11;
uint16_t data12;
uint16_t data13;
uint16_t chk_sum;
uint8_t len_h;
uint8_t len_l;
uint8_t data1_h;
uint8_t data1_l;
uint8_t data2_h;
uint8_t data2_l;
uint8_t data3_h;
uint8_t data3_l;
uint8_t data4_h;
uint8_t data4_l;
uint8_t data5_h;
uint8_t data5_l;
uint8_t data6_h;
uint8_t data6_l;
uint8_t data7_h;
uint8_t data7_l;
uint8_t data8_h;
uint8_t data8_l;
uint8_t data9_h;
uint8_t data9_l;
uint8_t data10_h;
uint8_t data10_l;
uint8_t data11_h;
uint8_t data11_l;
uint8_t data12_h;
uint8_t data12_l;
uint8_t data13_h;
uint8_t data13_l;
uint8_t chk_sum_h;
uint8_t chk_sum_l;
} __PACKED__ sensor_frame_t;
extern k_mail_q_t mail_q;
k_tick_t last_report = 0;
int read_frame(sensor_frame_t *frame)
{
frame->len_h = shell_getchar();
frame->len_l = shell_getchar();
frame->data1_h = shell_getchar();
frame->data1_l = shell_getchar();
frame->data2_h = shell_getchar();
frame->data2_l = shell_getchar();
frame->data3_h = shell_getchar();
frame->data3_l = shell_getchar();
frame->data4_h = shell_getchar();
frame->data4_l = shell_getchar();
frame->data5_h = shell_getchar();
frame->data5_l = shell_getchar();
frame->data6_h = shell_getchar();
frame->data6_l = shell_getchar();
frame->data7_h = shell_getchar();
frame->data7_l = shell_getchar();
frame->data8_h = shell_getchar();
frame->data8_l = shell_getchar();
frame->data9_h = shell_getchar();
frame->data9_l = shell_getchar();
frame->data10_h = shell_getchar();
frame->data10_l = shell_getchar();
frame->data11_h = shell_getchar();
frame->data11_l = shell_getchar();
frame->data12_h = shell_getchar();
frame->data12_l = shell_getchar();
frame->data13_h = shell_getchar();
frame->data13_l = shell_getchar();
frame->chk_sum_h = shell_getchar();
frame->chk_sum_l = shell_getchar();
frame->len = (frame->len_h << 8) | frame->len_l;
frame->data1 = (frame->data1_h << 8) | frame->data1_l;
frame->data2 = (frame->data2_h << 8) | frame->data2_l;
frame->data3 = (frame->data3_h << 8) | frame->data3_l;
frame->data4 = (frame->data4_h << 8) | frame->data4_l;
frame->data5 = (frame->data5_h << 8) | frame->data5_l;
frame->data6 = (frame->data6_h << 8) | frame->data6_l;
frame->data7 = (frame->data7_h << 8) | frame->data7_l;
frame->data8 = (frame->data8_h << 8) | frame->data8_l;
frame->data9 = (frame->data9_h << 8) | frame->data9_l;
frame->data10 = (frame->data10_h << 8) | frame->data10_l;
frame->data11 = (frame->data11_h << 8) | frame->data11_l;
frame->data12 = (frame->data12_h << 8) | frame->data12_l;
frame->data13 = (frame->data13_h << 8) | frame->data13_l;
frame->chk_sum = (frame->chk_sum_h << 8) | frame->chk_sum_l;
uint16_t chsum;
chsum = frame->len_h +
frame->len_l +
frame->data1_h +
frame->data1_l +
frame->data2_h +
frame->data2_l +
frame->data3_h +
frame->data3_l +
frame->data4_h +
frame->data4_l +
frame->data5_h +
frame->data5_l +
frame->data6_h +
frame->data6_l +
frame->data7_h +
frame->data7_l +
frame->data8_h +
frame->data8_l +
frame->data9_h +
frame->data9_l +
frame->data10_h +
frame->data10_l +
frame->data11_h +
frame->data11_l +
frame->data12_h +
frame->data12_l +
frame->data13_h +
frame->data13_l;
if (chsum + 0x42 + 0x4d != frame->chk_sum) {
return -1;
}
k_tick_t now = tos_systick_get();
if (last_report == 0 || now - last_report >= 15000) {
last_report = now;
printf("data1: %d\n", frame->data1);
printf("data2: %d\n", frame->data2);
printf("data3: %d\n", frame->data3);
printf("data4: %d\n", frame->data4);
printf("data5: %d\n", frame->data5);
printf("data6: %d\n", frame->data6);
printf("data7: %d\n", frame->data7);
printf("data8: %d\n", frame->data8);
printf("data9: %d\n", frame->data9);
printf("data10: %d\n", frame->data10);
printf("data11: %d\n", frame->data11);
printf("data12: %d\n", frame->data12);
printf("data13: %d\n", frame->data13);
printf("\n\n");
return 0;
}
return -1;
}
sensor_frame_t frame;
__STATIC__ int shell_readline(void)
{
int chr, last_chr = 0;
char *buf = SHELL_CTL->cmd_buffer;
while (K_TRUE) {
if (buf - SHELL_CTL->cmd_buffer >= (SHELL_CTL->cmd_buffer_size - 1)) {
return -1;
}
chr = shell_getchar();
if (chr < 0) {
return -1;
}
if (chr == 0x4d && last_chr == 0x42) {
if (read_frame(&frame) == 0) {
tos_mail_q_post(&mail_q, &frame.data1_h, 13 * 2);
}
}
*buf++ = chr;
last_chr = chr;
}
}
__STATIC__ void shell_parser(void *arg)
{
while (K_TRUE) {
shell_readline();
}
}
__API__ int tos_shell_init(char *cmd_buf, int cmd_buf_size, shell_output_t output)
{
void *buffer = K_NULL;
TOS_PTR_SANITY_CHECK_RC(cmd_buf, -1);
TOS_PTR_SANITY_CHECK_RC(output, -1);
memset(SHELL_CTL, 0, sizeof(shell_ctl_t));
SHELL_CTL->cmd_buffer = cmd_buf;
SHELL_CTL->cmd_buffer_size = cmd_buf_size;
SHELL_CTL->output = output;
buffer = tos_mmheap_alloc(cmd_buf_size * 2);
if (!buffer) {
return -1;
}
SHELL_CTL->shell_rx_fifo_buffer = (uint8_t *)buffer;
tos_chr_fifo_create(&SHELL_CTL->shell_rx_fifo, buffer, cmd_buf_size * 2);
if (tos_sem_create(&SHELL_CTL->shell_rx_sem, (k_sem_cnt_t)0u) != K_ERR_NONE) {
goto errout0;
}
if (tos_task_create(&SHELL_CTL->parser, "shell_parser", shell_parser,
K_NULL, SHELL_PARSER_TASK_PRIO, shell_parser_task_stack,
SHELL_PARSER_TASK_STACK_SIZE, 0) != K_ERR_NONE) {
goto errout1;
}
return 0;
errout1:
tos_sem_destroy(&SHELL_CTL->shell_rx_sem);
errout0:
tos_mmheap_free(SHELL_CTL->shell_rx_fifo_buffer);
SHELL_CTL->shell_rx_fifo_buffer = K_NULL;
tos_chr_fifo_destroy(&SHELL_CTL->shell_rx_fifo);
return -1;
}
__API__ void tos_shell_deinit(void)
{
tos_task_destroy(&SHELL_CTL->parser);
tos_sem_destroy(&SHELL_CTL->shell_rx_sem);
tos_mmheap_free(SHELL_CTL->shell_rx_fifo_buffer);
SHELL_CTL->shell_rx_fifo_buffer = K_NULL;
tos_chr_fifo_destroy(&SHELL_CTL->shell_rx_fifo);
}
__API__ void tos_shell_printf(const char *format, ...)
{
va_list args;
static char buffer[SHELL_OUTPUT_MAX];
va_start(args, format);
vsnprintf(buffer, sizeof(buffer), format, args);
va_end(args);
(SHELL_CTL->output)(buffer);
}
__API__ void tos_shell_input_byte(uint8_t data)
{
if (tos_chr_fifo_push(&SHELL_CTL->shell_rx_fifo, data) == K_ERR_NONE) {
tos_sem_post(&SHELL_CTL->shell_rx_sem);
}
}

View File

@@ -1,54 +0,0 @@
/*----------------------------------------------------------------------------
* Tencent is pleased to support the open source community by making TencentOS
* available.
*
* Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
* If you have downloaded a copy of the TencentOS binary from Tencent, please
* note that the TencentOS binary is licensed under the BSD 3-Clause License.
*
* If you have downloaded a copy of the TencentOS source code from Tencent,
* please note that TencentOS source code is licensed under the BSD 3-Clause
* License, except for the third-party components listed below which are
* subject to different license terms. Your integration of TencentOS into your
* own projects may require compliance with the BSD 3-Clause License, as well
* as the other licenses applicable to the third-party components included
* within TencentOS.
*---------------------------------------------------------------------------*/
#ifndef _TOS_SHELL_H_
#define _TOS_SHELL_H_
#include "tos_k.h"
#define SHELL_CMD_ARGV_MAX 16
#define SHELL_OUTPUT_MAX 256
#define SHELL_PARSER_TASK_STACK_SIZE 1024
#define SHELL_PARSER_TASK_PRIO 5
typedef void (*shell_output_t)(const char *str);
typedef struct shell_control_st {
k_task_t parser;
shell_output_t output;
char *cmd_buffer;
int cmd_buffer_size;
k_sem_t shell_rx_sem;
k_chr_fifo_t shell_rx_fifo;
uint8_t *shell_rx_fifo_buffer;
} shell_ctl_t;
#define SHELL_CTL ((shell_ctl_t *)(&shell_ctl))
__API__ int tos_shell_init(char *cmd_buf, int cmd_buf_size, shell_output_t output);
__API__ void tos_shell_deinit(void);
__API__ void tos_shell_printf(const char *format, ...);
__API__ void tos_shell_input_byte(uint8_t data);
#endif /* _TOS_SHELL_H_ */

View File

@@ -25,7 +25,8 @@
#include "main.h"
#include "stm32wlxx_it.h"
#include "tos_k.h"
#include "sensor_parser.h"
#include "pm2d5_parser.h"
#include "tos_at.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
@@ -63,6 +64,7 @@
/* External variables --------------------------------------------------------*/
extern UART_HandleTypeDef huart1;
extern UART_HandleTypeDef huart2;
extern UART_HandleTypeDef hlpuart1;
extern SUBGHZ_HandleTypeDef hsubghz;
/* USER CODE BEGIN EV */
@@ -209,7 +211,18 @@ void SysTick_Handler(void)
/* For the available peripheral interrupt handler names, */
/* please refer to the startup file (startup_stm32wlxx.s). */
/******************************************************************************/
void LPUART1_IRQHandler(void)
{
/* USER CODE BEGIN LPUART1_IRQn 0 */
/* USER CODE END LPUART1_IRQn 0 */
tos_knl_irq_enter();
HAL_UART_IRQHandler(&hlpuart1);
tos_knl_irq_leave();
/* USER CODE BEGIN LPUART1_IRQn 1 */
/* USER CODE END LPUART1_IRQn 1 */
}
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
@@ -242,13 +255,16 @@ void Radio_IRQHandler(void)
/* USER CODE BEGIN 1 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
extern uint8_t msg;
extern uint8_t pm2d5_byte_data;
extern uint8_t data;
if(huart ->Instance == USART2)
{
tos_shell_input_byte(msg);
HAL_UART_Receive_IT(&huart2, (uint8_t*)&msg, 1);
HAL_UART_Receive_IT(&huart2, (uint8_t*)&pm2d5_byte_data, 1);
pm2d5_parser_input_byte(pm2d5_byte_data);
}
else if (huart->Instance == LPUART1) {
HAL_UART_Receive_IT(&hlpuart1, &data, 1);
tos_at_uart_input_byte(data);
}
}
/* USER CODE END 1 */

View File

@@ -152,9 +152,25 @@
<Bp>
<Number>0</Number>
<Type>0</Type>
<LineNumber>153</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134218060</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>.\startup_stm32wle5xx.s</Filename>
<ExecCommand></ExecCommand>
<Expression>\\TencentOS_Tiny\startup_stm32wle5xx.s\153</Expression>
</Bp>
<Bp>
<Number>1</Number>
<Type>0</Type>
<LineNumber>122</LineNumber>
<EnabledFlag>0</EnabledFlag>
<Address>134244104</Address>
<Address>134279228</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
@@ -165,38 +181,6 @@
<ExecCommand></ExecCommand>
<Expression>\\TencentOS_Tiny\../../../../kernel/core/tos_task.c\122</Expression>
</Bp>
<Bp>
<Number>1</Number>
<Type>0</Type>
<LineNumber>105</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134218200</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc\port_s.S</Filename>
<ExecCommand></ExecCommand>
<Expression>\\TencentOS_Tiny\../../../../arch/arm/arm-v7m/cortex-m4/armcc/port_s.S\105</Expression>
</Bp>
<Bp>
<Number>2</Number>
<Type>0</Type>
<LineNumber>97</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134218196</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc\port_s.S</Filename>
<ExecCommand></ExecCommand>
<Expression>\\TencentOS_Tiny\../../../../arch/arm/arm-v7m/cortex-m4/armcc/port_s.S\97</Expression>
</Bp>
</Breakpoint>
<WatchWindow1>
<Ww>
@@ -283,6 +267,18 @@
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\..\BSP\Src\main.c</PathWithFileName>
<FilenameWithoutPath>main.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>3</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\..\BSP\Src\adc.c</PathWithFileName>
<FilenameWithoutPath>adc.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
@@ -290,7 +286,7 @@
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>3</FileNumber>
<FileNumber>4</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -302,7 +298,7 @@
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>4</FileNumber>
<FileNumber>5</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -314,7 +310,7 @@
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>5</FileNumber>
<FileNumber>6</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -326,7 +322,7 @@
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>6</FileNumber>
<FileNumber>7</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -338,7 +334,7 @@
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>7</FileNumber>
<FileNumber>8</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -350,7 +346,7 @@
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>8</FileNumber>
<FileNumber>9</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -362,7 +358,7 @@
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>9</FileNumber>
<FileNumber>10</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -374,7 +370,7 @@
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>10</FileNumber>
<FileNumber>11</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -386,7 +382,7 @@
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>11</FileNumber>
<FileNumber>12</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -398,7 +394,7 @@
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>12</FileNumber>
<FileNumber>13</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -410,7 +406,7 @@
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>13</FileNumber>
<FileNumber>14</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -430,7 +426,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>14</FileNumber>
<FileNumber>15</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -442,7 +438,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>15</FileNumber>
<FileNumber>16</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -454,7 +450,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>16</FileNumber>
<FileNumber>17</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -466,7 +462,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>17</FileNumber>
<FileNumber>18</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -478,7 +474,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>18</FileNumber>
<FileNumber>19</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -490,7 +486,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>19</FileNumber>
<FileNumber>20</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -502,7 +498,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>20</FileNumber>
<FileNumber>21</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -514,7 +510,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>21</FileNumber>
<FileNumber>22</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -526,7 +522,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>22</FileNumber>
<FileNumber>23</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -538,7 +534,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>23</FileNumber>
<FileNumber>24</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -550,7 +546,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>24</FileNumber>
<FileNumber>25</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -562,7 +558,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>25</FileNumber>
<FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -574,7 +570,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>26</FileNumber>
<FileNumber>27</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -586,7 +582,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>27</FileNumber>
<FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -598,7 +594,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>28</FileNumber>
<FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -610,7 +606,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>29</FileNumber>
<FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -622,7 +618,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>30</FileNumber>
<FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -634,7 +630,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>31</FileNumber>
<FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -646,7 +642,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>32</FileNumber>
<FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -658,7 +654,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>33</FileNumber>
<FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -670,7 +666,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>34</FileNumber>
<FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -690,7 +686,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>35</FileNumber>
<FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -710,7 +706,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>36</FileNumber>
<FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -722,7 +718,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>37</FileNumber>
<FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -734,7 +730,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>38</FileNumber>
<FileNumber>39</FileNumber>
<FileType>2</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -754,7 +750,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>39</FileNumber>
<FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -766,7 +762,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>40</FileNumber>
<FileNumber>41</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -778,7 +774,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>41</FileNumber>
<FileNumber>42</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -790,7 +786,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>42</FileNumber>
<FileNumber>43</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -802,7 +798,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>43</FileNumber>
<FileNumber>44</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -814,7 +810,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>44</FileNumber>
<FileNumber>45</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -826,7 +822,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>45</FileNumber>
<FileNumber>46</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -838,7 +834,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>46</FileNumber>
<FileNumber>47</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -850,7 +846,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>47</FileNumber>
<FileNumber>48</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -862,7 +858,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>48</FileNumber>
<FileNumber>49</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -874,7 +870,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>49</FileNumber>
<FileNumber>50</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -886,7 +882,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>50</FileNumber>
<FileNumber>51</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -898,7 +894,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>51</FileNumber>
<FileNumber>52</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -910,7 +906,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>52</FileNumber>
<FileNumber>53</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -922,7 +918,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>53</FileNumber>
<FileNumber>54</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -934,7 +930,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>54</FileNumber>
<FileNumber>55</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -946,7 +942,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>55</FileNumber>
<FileNumber>56</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -958,7 +954,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>56</FileNumber>
<FileNumber>57</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -970,7 +966,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>57</FileNumber>
<FileNumber>58</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -982,7 +978,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>58</FileNumber>
<FileNumber>59</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -994,7 +990,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>59</FileNumber>
<FileNumber>60</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1006,7 +1002,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>60</FileNumber>
<FileNumber>61</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1018,7 +1014,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>61</FileNumber>
<FileNumber>62</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1030,7 +1026,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>62</FileNumber>
<FileNumber>63</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1042,7 +1038,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>63</FileNumber>
<FileNumber>64</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1054,7 +1050,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>64</FileNumber>
<FileNumber>65</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1066,7 +1062,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>65</FileNumber>
<FileNumber>66</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1078,7 +1074,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>66</FileNumber>
<FileNumber>67</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1098,7 +1094,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>67</FileNumber>
<FileNumber>68</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1116,18 +1112,6 @@
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>68</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\..\BSP\Src\main.c</PathWithFileName>
<FilenameWithoutPath>main.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>69</FileNumber>
@@ -1212,7 +1196,7 @@
<Group>
<GroupName>Hardware</GroupName>
<tvExp>1</tvExp>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
@@ -1223,8 +1207,8 @@
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\App\sensor_parser.c</PathWithFileName>
<FilenameWithoutPath>sensor_parser.c</FilenameWithoutPath>
<PathWithFileName>.\App\pm2d5_parser.c</PathWithFileName>
<FilenameWithoutPath>pm2d5_parser.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
@@ -1662,6 +1646,78 @@
</File>
</Group>
<Group>
<GroupName>at</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>17</GroupNumber>
<FileNumber>108</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\..\..\..\net\at\src\tos_at.c</PathWithFileName>
<FilenameWithoutPath>tos_at.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>17</GroupNumber>
<FileNumber>109</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\..\..\..\net\tencent_firmware_module_wrapper\tencent_firmware_module_wrapper.c</PathWithFileName>
<FilenameWithoutPath>tencent_firmware_module_wrapper.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>hal</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>18</GroupNumber>
<FileNumber>110</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\..\..\..\platform\hal\st\stm32wl\src\tos_hal_uart.c</PathWithFileName>
<FilenameWithoutPath>tos_hal_uart.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>devices</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>19</GroupNumber>
<FileNumber>111</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\..\..\..\devices\esp8266_tencent_firmware\esp8266_tencent_firmware.c</PathWithFileName>
<FilenameWithoutPath>esp8266_tencent_firmware.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>::CMSIS</GroupName>
<tvExp>0</tvExp>

View File

@@ -10,13 +10,13 @@
<TargetName>TencentOS_Tiny</TargetName>
<ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName>
<pCCUsed>6100001::V6.10.1::.\ARMCLANG</pCCUsed>
<pCCUsed>6140000::V6.14::ARMCLANG</pCCUsed>
<uAC6>1</uAC6>
<TargetOption>
<TargetCommonOption>
<Device>STM32WLE5JCIx</Device>
<Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32WLxx_DFP.1.0.2.OEM</PackID>
<PackID>Keil.STM32WLxx_DFP.1.0.7</PackID>
<PackURL>http://www.keil.com/pack</PackURL>
<Cpu>IRAM(0x20000000,0x10000) IROM(0x08000000,0x40000) CPUTYPE("Cortex-M4") CLOCK(12000000) ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec>
@@ -185,6 +185,7 @@
<uocXRam>0</uocXRam>
<RvdsVP>0</RvdsVP>
<RvdsMve>0</RvdsMve>
<RvdsCdeCp>0</RvdsCdeCp>
<hadIRAM2>0</hadIRAM2>
<hadIROM2>0</hadIROM2>
<StupSel>8</StupSel>
@@ -338,7 +339,7 @@
<MiscControls></MiscControls>
<Define>USE_HAL_DRIVER,STM32WLE5xx,CORE_CM4</Define>
<Undefine></Undefine>
<IncludePath>..\..\..\..\platform\vendor_bsp\st\STM32WLxx_HAL_Driver\Inc;..\..\..\..\platform\vendor_bsp\st\STM32WLxx_HAL_Driver\Inc\Legacy;..\..\..\..\platform\vendor_bsp\st\CMSIS\Device\ST\STM32WLxx\Include;..\..\..\..\platform\vendor_bsp\st\CMSIS\Include;..\..\..\..\arch\arm\arm-v7m\common\include;..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc;..\..\..\..\kernel\core\include;..\..\..\..\kernel\pm\include;..\..\..\..\osal\cmsis_os;..\..\TOS_CONFIG;..\..\BSP\Middlewares\LoRaWAN\Conf;..\..\BSP\Middlewares\LoRaWAN\Crypto;..\..\BSP\Middlewares\LoRaWAN\Mac;..\..\BSP\Middlewares\LoRaWAN\Patterns\Basic;..\..\BSP\Middlewares\LoRaWAN\Utilities;..\..\BSP\Middlewares\SubGHz_Phy;..\..\BSP\Middlewares\SubGHz_Phy\stm32_radio_driver;..\..\BSP\Inc;.\App;.\Target;..\..\BSP\Utilities\lpm\tiny_lpm;..\..\BSP\Utilities\misc</IncludePath>
<IncludePath>..\..\..\..\platform\vendor_bsp\st\STM32WLxx_HAL_Driver\Inc;..\..\..\..\platform\vendor_bsp\st\STM32WLxx_HAL_Driver\Inc\Legacy;..\..\..\..\platform\vendor_bsp\st\CMSIS\Device\ST\STM32WLxx\Include;..\..\..\..\platform\vendor_bsp\st\CMSIS\Include;..\..\..\..\arch\arm\arm-v7m\common\include;..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc;..\..\..\..\kernel\core\include;..\..\..\..\kernel\pm\include;..\..\..\..\kernel\hal\include;..\..\..\..\osal\cmsis_os;..\..\TOS_CONFIG;..\..\BSP\Middlewares\LoRaWAN\Conf;..\..\BSP\Middlewares\LoRaWAN\Crypto;..\..\BSP\Middlewares\LoRaWAN\Mac;..\..\BSP\Middlewares\LoRaWAN\Patterns\Basic;..\..\BSP\Middlewares\LoRaWAN\Utilities;..\..\BSP\Middlewares\SubGHz_Phy;..\..\BSP\Middlewares\SubGHz_Phy\stm32_radio_driver;..\..\BSP\Inc;.\App;.\Target;..\..\BSP\Utilities\lpm\tiny_lpm;..\..\BSP\Utilities\misc;..\..\..\..\net\at\include;..\..\..\..\net\tencent_firmware_module_wrapper;..\..\..\..\devices\esp8266_tencent_firmware</IncludePath>
</VariousControls>
</Cads>
<Aads>
@@ -351,7 +352,7 @@
<NoWarn>0</NoWarn>
<uSurpInc>0</uSurpInc>
<useXO>0</useXO>
<uClangAs>0</uClangAs>
<ClangAsOpt>4</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -392,6 +393,11 @@
<Group>
<GroupName>Application/User</GroupName>
<Files>
<File>
<FileName>main.c</FileName>
<FileType>1</FileType>
<FilePath>..\..\BSP\Src\main.c</FilePath>
</File>
<File>
<FileName>adc.c</FileName>
<FileType>1</FileType>
@@ -752,11 +758,6 @@
<Group>
<GroupName>TOS-CONFIG</GroupName>
<Files>
<File>
<FileName>main.c</FileName>
<FileType>1</FileType>
<FilePath>..\..\BSP\Src\main.c</FilePath>
</File>
<File>
<FileName>tos_config.h</FileName>
<FileType>5</FileType>
@@ -798,9 +799,9 @@
<GroupName>Hardware</GroupName>
<Files>
<File>
<FileName>sensor_parser.c</FileName>
<FileName>pm2d5_parser.c</FileName>
<FileType>1</FileType>
<FilePath>.\App\sensor_parser.c</FilePath>
<FilePath>.\App\pm2d5_parser.c</FilePath>
</File>
</Files>
</Group>
@@ -994,6 +995,41 @@
</File>
</Files>
</Group>
<Group>
<GroupName>at</GroupName>
<Files>
<File>
<FileName>tos_at.c</FileName>
<FileType>1</FileType>
<FilePath>..\..\..\..\net\at\src\tos_at.c</FilePath>
</File>
<File>
<FileName>tencent_firmware_module_wrapper.c</FileName>
<FileType>1</FileType>
<FilePath>..\..\..\..\net\tencent_firmware_module_wrapper\tencent_firmware_module_wrapper.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>hal</GroupName>
<Files>
<File>
<FileName>tos_hal_uart.c</FileName>
<FileType>1</FileType>
<FilePath>..\..\..\..\platform\hal\st\stm32wl\src\tos_hal_uart.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>devices</GroupName>
<Files>
<File>
<FileName>esp8266_tencent_firmware.c</FileName>
<FileType>1</FileType>
<FilePath>..\..\..\..\devices\esp8266_tencent_firmware\esp8266_tencent_firmware.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>::CMSIS</GroupName>
</Group>
@@ -1014,4 +1050,19 @@
<files/>
</RTE>
<LayerInfo>
<Layers>
<Layer>
<LayName>&lt;Project Info&gt;</LayName>
<LayDesc></LayDesc>
<LayUrl></LayUrl>
<LayKeys></LayKeys>
<LayCat></LayCat>
<LayLic></LayLic>
<LayTarg>0</LayTarg>
<LayPrjMark>1</LayPrjMark>
</Layer>
</Layers>
</LayerInfo>
</Project>

View File

@@ -0,0 +1,93 @@
#include "tos_k.h"
#include "tos_hal.h"
#include "stm32wlxx_hal.h"
#include "usart.h"
__API__ int tos_hal_uart_init(hal_uart_t *uart, hal_uart_port_t port)
{
if (!uart) {
return -1;
}
if (port == HAL_UART_PORT_0) {
uart->private_uart = &hlpuart1;
MX_LPUART1_UART_Init();
} else if (port == HAL_UART_PORT_1) {
uart->private_uart = &huart1;
MX_USART1_UART_Init();
} else if (port == HAL_UART_PORT_2) {
uart->private_uart = &huart2;
MX_USART2_UART_Init();
}
return 0;
}
__API__ int tos_hal_uart_write(hal_uart_t *uart, const uint8_t *buf, size_t size, uint32_t timeout)
{
HAL_StatusTypeDef hal_status;
UART_HandleTypeDef *uart_handle;
if (!uart || !buf) {
return -1;
}
if (!uart->private_uart) {
return -1;
}
uart_handle = (UART_HandleTypeDef *)uart->private_uart;
hal_status = HAL_UART_Transmit(uart_handle, (uint8_t *)buf, size, timeout);
if (hal_status != HAL_OK) {
return -1;
}
return 0;
}
__API__ int tos_hal_uart_read(hal_uart_t *uart, const uint8_t *buf, size_t size, uint32_t timeout)
{
HAL_StatusTypeDef hal_status;
UART_HandleTypeDef *uart_handle;
if (!uart || !buf) {
return -1;
}
if (!uart->private_uart) {
return -1;
}
uart_handle = (UART_HandleTypeDef *)uart->private_uart;
hal_status = HAL_UART_Receive(uart_handle, (uint8_t *)buf, size, timeout);
if (hal_status != HAL_OK) {
return -1;
}
return 0;
}
__API__ int tos_hal_uart_deinit(hal_uart_t *uart)
{
HAL_StatusTypeDef hal_status;
UART_HandleTypeDef *uart_handle;
if (!uart) {
return -1;
}
if (!uart->private_uart) {
return -1;
}
uart_handle = (UART_HandleTypeDef *)uart->private_uart;
hal_status = HAL_UART_DeInit(uart_handle);
HAL_UART_MspDeInit(uart_handle);
if (hal_status != HAL_OK) {
return -1;
}
return 0;
}