/********************************************************************************
* @file ls_gpio.h
* @author jianqiang.xue
* @version V1.1.0
* @date 2022-12-11
* @brief 业务类--GPIO定义
********************************************************************************/
#ifndef __LS_GPIO_H
#define __LS_GPIO_H
#define LS_IO_VERSION "CX32L003_通用模板"#include "cx32l003_hal.h"
#include "cx32l003_hal_def.h"
#include "ls_syscfg.h"
#include "bsp_gpio.h"
#include "bsp_exti.h"/* GPIO_EXTI_INT_EDGE; // 中断类型 边沿触发GPIO_EXTI_INT_LOWFALL; // 下降沿触发中断GPIO_EXTI_INT_HIGHRISE; // 上升沿触发中断GPIO_EXTI_INT_FALLRISE; // 下降沿上升沿都触发中断
GPIO_EXTI_INT_LEVEL; // 中断类型 电平触发GPIO_EXTI_INT_LOWFALL; // 低电平触发中断GPIO_EXTI_INT_HIGHRISE; // 高电平触发中断 */#define GPIO_CLK(GPIO) (RCC_HCLKEN_##GPIO##CKEN)
#define GPIO_APBx (0)
/************************************GPIO***********************************/
#define LS_IO_NUM (16)
/* Public Struct -------------------------------------------------------------*/union io_support_t {uint64_t val; // 对外值struct {uint64_t swo : 1;uint64_t adc0_ch0 : 1;uint64_t adc0_ch1 : 1;uint64_t adc0_ch2 : 1;uint64_t adc0_ch3 : 1;uint64_t adc0_ch4 : 1;uint64_t adc0_ch5 : 1;uint64_t adc0_ch6 : 1;uint64_t adc1_ch0 : 1;uint64_t adc1_ch1 : 1;uint64_t adc1_ch2 : 1;uint64_t adc1_ch3 : 1;uint64_t adc1_ch4 : 1;uint64_t adc1_ch5 : 1;uint64_t adc1_ch6 : 1;uint64_t tim1_ch1 : 1; // PWM0uint64_t tim1_ch2 : 1; // PWM1uint64_t tim1_ch3 : 1; // PWM2uint64_t tim1_ch4 : 1; // PWM3uint64_t tim2_ch1 : 1; // PWM4uint64_t tim2_ch2 : 1; // PWM5uint64_t tim2_ch3 : 1; // PWM6uint64_t tim2_ch4 : 1; // PWM7uint64_t uart0_tx : 1;uint64_t uart0_rx : 1;uint64_t uart1_tx : 1;uint64_t uart1_rx : 1;uint64_t uart2_tx : 1;uint64_t uart2_rx : 1;uint64_t i2c0_scl : 1; // 硬件IICuint64_t i2c0_sda : 1;uint64_t i2c1_scl : 1;uint64_t i2c1_sda : 1;uint64_t i2c_scl_soft : 1; // 软件IICuint64_t i2c_sda_soft : 1;uint64_t spi0_clk : 1;uint64_t spi0_mosi : 1;uint64_t spi0_miso : 1;uint64_t spi0_nss : 1;uint64_t spi1_clk : 1;uint64_t spi1_mosi : 1;uint64_t spi1_miso : 1;uint64_t spi1_nss : 1;#if !LS_IO_EXTEND_SUPPORTuint64_t reserve : 7;
#endif} bit;
};typedef enum {IO_TYPE_IN_NULL = 0, // 默认输入 无上下拉IO_TYPE_IN_PULLUP, // 输入,上拉IO_TYPE_IN_PULLDOWN, // 输入,下拉IO_TYPE_OUT_PP, // 默认输出 推免输出IO_TYPE_OUT_OD, // 开漏输出// 中断输入IO_TYPE_INIRQ_LEVEL_LOW, // 电平触发-低电平IO_TYPE_INIRQ_LEVEL_HIGH, // 电平触发-高电平IO_TYPE_INIRQ_EDGE_LOWFALL, // 边沿触发-下降沿IO_TYPE_INIRQ_EDGE_HIGHRISE, // 边沿触发-上降沿IO_TYPE_INIRQ_EDGE_FALLRISE, // 边沿触发-任意电平变化IO_TYPE_SWO, // 默认烧录脚IO_TYPE_KEY, // 按键,会注册到软定时器中扫描IO_TYPE_MATRIX_KEY_X, // 矩阵键盘X轴,会注册到软定时器中扫描IO_TYPE_MATRIX_KEY_Y, // 矩阵键盘Y轴,会注册到软定时器中扫描IO_TYPE_W2812X,IO_TYPE_ADC0_CH0,IO_TYPE_ADC0_CH1,IO_TYPE_ADC0_CH2,IO_TYPE_ADC0_CH3,IO_TYPE_ADC0_CH4,IO_TYPE_ADC0_CH5,IO_TYPE_ADC0_CH6,IO_TYPE_ADC1_CH0,IO_TYPE_ADC1_CH1,IO_TYPE_ADC1_CH2,IO_TYPE_ADC1_CH3,IO_TYPE_ADC1_CH4,IO_TYPE_ADC1_CH5,IO_TYPE_ADC1_CH6,IO_TYPE_TIM1_CH1, // PWM0IO_TYPE_TIM1_CH2, // PWM1IO_TYPE_TIM1_CH3, // PWM2IO_TYPE_TIM1_CH4, // PWM3IO_TYPE_TIM2_CH1, // PWM4IO_TYPE_TIM2_CH2, // PWM5IO_TYPE_TIM2_CH3, // PWM6IO_TYPE_TIM2_CH4, // PWM7IO_TYPE_UART0_TX, // 串口,通过命令配置电气特性IO_TYPE_UART0_RX,IO_TYPE_UART1_TX, // 串口,通过命令配置电气特性IO_TYPE_UART1_RX,IO_TYPE_UART2_TX,IO_TYPE_UART2_RX,IO_TYPE_I2C0_SCL, // 硬件IICIO_TYPE_I2C0_SDA, // 硬件IICIO_TYPE_I2C1_SCL,IO_TYPE_I2C1_SDA,IO_TYPE_I2C_SCL_SOFT, // 软件IICIO_TYPE_I2C_SDA_SOFT, // 软件IICIO_TYPE_SPI0_CLK,IO_TYPE_SPI0_MOSI,IO_TYPE_SPI0_MISO,IO_TYPE_SPI0_NSS,IO_TYPE_SPI1_CLK,IO_TYPE_SPI1_MOSI,IO_TYPE_SPI1_MISO,IO_TYPE_SPI1_NSS,IO_TYPE_MAX,
} io_type_t;extern const union io_support_t g_io_support[LS_IO_NUM];
extern const io_type_t g_io_default_type[LS_IO_NUM];
extern const bsp_gpio_t g_io_cfg[LS_IO_NUM];
#ifdef LS_IO
const bsp_gpio_t g_io_cfg[LS_IO_NUM] = {{(GPIOD), (GPIO_PIN_2), GPIO_CLK(GPIOD), (0), (GPIOD_IRQn)},{(GPIOD), (GPIO_PIN_3), GPIO_CLK(GPIOD), (0), (GPIOD_IRQn)},{(GPIOD), (GPIO_PIN_4), GPIO_CLK(GPIOD), (0), (GPIOD_IRQn)},{(GPIOD), (GPIO_PIN_5), GPIO_CLK(GPIOD), (0), (GPIOD_IRQn)},{(GPIOD), (GPIO_PIN_6), GPIO_CLK(GPIOD), (0), (GPIOD_IRQn)},{(GPIOC), (GPIO_PIN_3), GPIO_CLK(GPIOC), (0), (GPIOC_IRQn)},{(GPIOC), (GPIO_PIN_4), GPIO_CLK(GPIOC), (0), (GPIOC_IRQn)},{(GPIOC), (GPIO_PIN_5), GPIO_CLK(GPIOC), (0), (GPIOC_IRQn)},{(GPIOC), (GPIO_PIN_6), GPIO_CLK(GPIOC), (0), (GPIOC_IRQn)},{(GPIOB), (GPIO_PIN_4), GPIO_CLK(GPIOB), (0), (GPIOB_IRQn)},{(GPIOB), (GPIO_PIN_5), GPIO_CLK(GPIOB), (0), (GPIOB_IRQn)},{(GPIOA), (GPIO_PIN_3), GPIO_CLK(GPIOA), (0), (GPIOA_IRQn)},{(GPIOD), (GPIO_PIN_1), GPIO_CLK(GPIOD), (0), (GPIOD_IRQn)},{(GPIOC), (GPIO_PIN_7), GPIO_CLK(GPIOC), (0), (GPIOC_IRQn)},{(GPIOA), (GPIO_PIN_1), GPIO_CLK(GPIOA), (0), (GPIOA_IRQn)},{(GPIOA), (GPIO_PIN_2), GPIO_CLK(GPIOA), (0), (GPIOA_IRQn)},
};const union io_support_t g_io_support[LS_IO_NUM] = {{0x808010010}, {0x1100020}, {0x888000}, {0x2022C00040}, {0x1045110080},{0x42220004}, {0x24440008}, {0x808000000}, {0x1010408002}, {0x4020800000},{0x841080000}, {0x4010200000}, {0x2000001}, {0x4100001}, {0x45000000},{0x4022920000},
};const io_type_t g_io_default_type[LS_IO_NUM] = {IO_TYPE_TIM1_CH2, IO_TYPE_TIM2_CH2, IO_TYPE_TIM1_CH1, IO_TYPE_TIM2_CH4, IO_TYPE_ADC0_CH6,IO_TYPE_TIM1_CH3, IO_TYPE_TIM1_CH4, IO_TYPE_TIM2_CH1, IO_TYPE_ADC0_CH0, IO_TYPE_IN_NULL,IO_TYPE_IN_NULL, IO_TYPE_TIM2_CH3, IO_TYPE_SWO, IO_TYPE_SWO, IO_TYPE_UART0_RX,IO_TYPE_UART0_TX,
};
#else
#endif#endif
/********************************************************************************
* @file ls_syscfg.h
* @author jianqiang.xue
* @version V1.1.0
* @date 2023-03-04
* @brief 业务类--功能宏定义
********************************************************************************/#ifndef __LS_SYSCFG_H
#define __LS_SYSCFG_H//-------- <<< Use Configuration Wizard in Context Menu >>> -----------------/**************************************LOG**************************************/
// Log Switch
// =======================
#define LS_LOG_SWITCH (0x1)// Log Grade
// Default: 0
// <0=> ALL
// <1=> TRACE
// <2=> DEBUG
// <3=> INFO
// <4=> WARN
// <5=> ERROR
// <6=> FATAL
// <7=> OFF
#define LS_LOG_GRADE (0x2)// Log Out
// Default: 0
// <0=> RTT
// <1=> UART
#define LS_LOG_OUT (0x1)
// MAX LEN
// Default: 128 Min Data Len 128
#define LS_LOG_MAX_LEN (128)
//
/************************************FLASH**************************************/
// FLASH
// =======================
//
// Page Size
// Default: 0x200 (512 byte)
#define LS_FLASH_PAGE_SIZE (0x200U)// Flash Max Size
// Default: 0x10000 (64K byte)
#define LS_FLASH_MAX_SIZE (0x10000U)// Boot Loader Starting Address
// Default: 0
#define LS_FLASH_START_ADDR (0x0000000)// Boot Loader Size
// Default: 0x1400 (5K byte), use dfu 0x2000
#define LS_FLASH_BOOT_SIZE (0x2000)// Kv Flash Page
// Default: 3
#define LS_FLASH_KV_PAGE (3)// Flash Write Byte Ability
// The ability to write is also byte to it.
// Default: 4
#define LS_FLASH_WRITE_BYTE_ABILITY (1)// FLASH_INFO_TYPE(MCU user Kv_Sys / NRF user FDS)
// <0=> KV_SYS
// <1=> FDS
#define LS_FLASH_INFO_TYPE (0)// /*************************************APP_IO************************************/
// APP_IO
// =======================
// Save Flash Support
#define LS_APP_IO_SAVE_SUPPORT (0)// Active Report Support (ATCMD enevt)
#define LS_APP_IO_ACTIVE_REPORT_SUPPORT (0)// Key Scan Support
#define LS_APP_IO_KEY_SCAN_SUPPORT (1)// Matrix Key Support
#define LS_APP_IO_MATRIX_KEY_SUPPORT (0)// Tiemr Support (IO Operation)
#define LS_APP_IO_TIMER_SUPPORT (1)
// Task Number
#define LS_APP_IO_TIMER_NUM (2)
// Timer Time (ms)
#define LS_APP_IO_TIMER_TIME_MS (1000)
// // Sys Vcc Support
#define LS_APP_IO_SYS_VCC_SUPPORT (0)// Swo Off
#define LS_APP_IO_SWO_OFF (0)
// Extend Support
#define LS_IO_EXTEND_SUPPORT (0)
//
/**************************************KEY**************************************/
// KEY
// =======================
// Button scan cycle (ms) <10-65535>
// Default: 10
#define LS_BUTTON_SCAN_CYCLE_MS (10)// Single click time(ms) <0-65535>
// 1 timec of one click
// Default: 100
#define LS_BUTTON_SINGLE_CLICK_TIME (50)// Release time(ms) <0-65535>
// press -> release
// Default: 100
#define LS_BUTTON_RELEASE_TIME (140)// Double click time(ms) <0-65535>
// 1 timec of double click interval time
// Default: 150
#define LS_BUTTON_DOUBLE_CLICK_TIME (200)// Long press time(ms) <100-65535>
// Long press
// Default: 1000
#define LS_BUTTON_LONG_PRESS_TIME (800)// Long long press time(ms) <1000-65535>
// Long long press
// Default: 1000
#define LS_BUTTON_LONG_LONG_PRESS_TIME (10000)// Automatic Scanning(Idle Sop, Interrupt Activation)
// Whether to automatically disable scanning
// <0=> DISABLE
// <1=> ENABLE
#define LS_BUTTON_AUTOMATIC_SCANNING (0)//
/**************************************ADC**************************************/
// ADC
// =======================
//
// ADC0
#define LS_ADC0_EN (1)// Clk Divider
// 0-PCLK/1, 1-PCLK/2, 2-PCLK/4, 3-PCLK/8, 4-PCLK/16, ..., 7-PCLK/128
#define LS_ADC0_CLK_DIV (5)// Sampling Number
// Default: 10
#define LS_ADC0_SAMPLING_NUM (10)// ADC0 IRQ
#define LS_ADC0_IRQ_SEL (1)// ADC0_CH
// ADC0_CH0
// ADC0_CH1
// ADC0_CH2
// ADC0_CH3
// ADC0_CH4
// ADC0_CH5
// ADC0_CH6
// ADC0_CH7 (sys_vcc)
#define LS_ADC0_CH (255)
//
// Timer Cycle
// Default: 100ms
#define LS_ADC0_TIMER_CYCLE_MS (228)
// // Resistance Information
// Thermistor// Pull Up Resistance Value
// Default: 100
// Unit: KOhm
#define LS_THERMISTOR_PULL_UP_VAL (100)// Coefficient corresponding to NTC resistance
// Default: 0 (x*1000)
#define LS_THERMISTOR_NTC_K (4250)// Reference voltage
// Default: 3300 (x*1000)
#define LS_THERMISTOR_REFERENCE_VOLTAGE (2700)
// // LDR
// Photosensitive resistance
// Pull Up Resistance Value
// Default: 680
// Unit: KOhm
#define LS_LDR_PULL_UP_VAL (680)// Reference voltage
// Default: 3300 (x*1000)
#define LS_LDR_REFERENCE_VOLTAGE (2700)
// // Power resistance
// Power supply resistance
// Pull Up Resistance Value
// Default: 300000
// Unit: KOhm
#define LS_POWER_PULL_UP_VAL (300)// Pull Down Resistance Value
// Default: 100
// Unit: KOhm
#define LS_POWER_PULL_DOWN_VAL (300)// Reference voltage
// Default: 3300 (x*1000)
#define LS_POWER_REFERENCE_VOLTAGE (2700)
//
//
// /**************************************I2C**************************************/
// I2C
// =======================
// I2C0
#define LS_I2C0_EN (0)// I2C0 SPEED uint khz
// Default: 100 khz
#define LS_I2C0_SPEED_RATE (400)
// // I2C1
#define LS_I2C1_EN (0)// I2C1 SPEED uint khz
// Default: 100 khz
#define LS_I2C1_SPEED_RATE (100)
// // I2C2
#define LS_I2C2_EN (0)// I2C2 SPEED uint khz
// Default: 100 khz
#define LS_I2C2_SPEED_RATE (100)
//
// /**************************************UART*************************************/
// UART
// =======================
// UART0
#define LS_UART0_EN (1)// UART0 Baud Rate
// Default: 115200
// <9600 => 9600
// <19200 => 19200
// <57600 => 57600
// <115200 => 115200
#define LS_UART0_BAUD_RATE (115200)// UART0 Working mode
// Default: full duplex
// <0 => Full Duplex
// <1 => Half Duplex
#define LS_UART0_WORK_MODE (0)// UART0 RX cache size
// Default: 256
#define LS_UART0_CACHE_SIZE (64)
// // UART1
#define LS_UART1_EN (0)// UART1 Baud rate
// Default: 115200
// <9600 => 9600
// <19200 => 19200
// <57600 => 57600
// <115200 => 115200
#define LS_UART1_BAUD_RATE (115200)// UART1 Working mode
// Default: full duplex
// <0 => Full Duplex
// <1 => Half Duplex
#define LS_UART1_WORK_MODE (0)// UART1 RX cache size
// Default: 256
#define LS_UART1_CACHE_SIZE (256)
// // UART2
#define LS_UART2_EN (0)// UART2 Baud Rate
// Default: 115200
// <9600 => 9600
// <19200 => 19200
// <57600 => 57600
// <115200 => 115200
#define LS_UART2_BAUD_RATE (115200)// UART2 Working Mode
// Default: full duplex
// <0 => Full Duplex
// <1 => Half Duplex
#define LS_UART2_WORK_MODE (0)// UART2 RX Cache Size
// Default: 256
#define LS_UART2_CACHE_SIZE (256)
// // Printf
// Default: UART0
// <0=> UART0
// <1=> UART1
// <2=> UART2
#define LS_FUART_PRINT (0)// /**************************************PWM**************************************/
// PWM
// =======================
// TIM1
// pwm hz = sys_clock / (Prescaler+1) / (Period+1)
// 3125 hz = 24000000 / (63+1) / (119+1)
#define LS_TIM1_EN (1)// Prescaler
// Default: 63
#define LS_TIM1_PRESCALER (63)// Period
// Default: 119
#define LS_TIM1_PERIOD (119)// Level logic
// Reverse --> low level light up
// Forward --> high level light up
// <0=> Reverse
// <1=> Forward
#define LS_TIM1_LEVEL_LOGIC (1)// TIM1_CH1 (PWM0)
// Default: DISABLE
// <0=> DISABLE
// <1=> ENABLE
#define LS_PWM0_EN (1)// TIM1_CH2 (PWM1)
// Default: DISABLE
// <0=> DISABLE
// <1=> ENABLE
#define LS_PWM1_EN (1)// TIM1_CH3 (PWM2)
// Default: DISABLE
// <0=> DISABLE
// <1=> ENABLE
#define LS_PWM2_EN (1)// TIM1_CH4 (PWM3)
// Default: DISABLE
// <0=> DISABLE
// <1=> ENABLE
#define LS_PWM3_EN (1)
//
// TIM2
// pwm hz = sys_clock / (Prescaler+1) / (Period+1)
// 3125 hz = 24000000 / (63+1) / (119+1)
#define LS_TIM2_EN (1)// Prescaler
// Default: 63
#define LS_TIM2_PRESCALER (63)// Period
// Default: 119
#define LS_TIM2_PERIOD (119)// Level logic
// Reverse --> low level light up
// Forward --> high level light up
// <0=> Reverse
// <1=> Forward
#define LS_TIM2_LEVEL_LOGIC (1)// TIM2_CH1 (PWM4)
// Default: DISABLE
// <0=> DISABLE
// <1=> ENABLE
#define LS_PWM4_EN (1)// TIM2_CH2 (PWM5)
// Default: DISABLE
// <0=> DISABLE
// <1=> ENABLE
#define LS_PWM5_EN (1)// TIM2_CH3 (PWM6)
// Default: DISABLE
// <0=> DISABLE
// <1=> ENABLE
#define LS_PWM6_EN (1)// TIM2_CH4 (PWM7)
// Default: DISABLE
// <0=> DISABLE
// <1=> ENABLE
#define LS_PWM7_EN (1)
//
// /*************************************Memory************************************/
// Memory
// =======================
// Memory SIZE
#define LS_MEMORY_SIZE (512+128)
//
/*************************************BOOT************************************/
// BootLoader
// =======================
// BOOT_SUPPORT
#define BOOT_SUPPORT (1)
// chip ic
#define CHIP_IC "CX32L003"
// version info
#define VERSION_INFO "0.9"
//
//------------- <<< end of configuration section >>> -----------------------/*********************************[业务引脚命令]*******************************/
#define LS_IO_LED_IND_ID (11)/********************************[FLASH INFO]*********************************/
#define LS_FLASH_APP_ADDR (LS_FLASH_START_ADDR + LS_FLASH_BOOT_SIZE)
#define LS_FLASH_APP_SIZE (LS_FLASH_MAX_SIZE - LS_FLASH_BOOT_SIZE - (LS_FLASH_KV_PAGE * LS_FLASH_PAGE_SIZE))
#define LS_FLASH_OTA_ADDR (LS_FLASH_APP_ADDR + LS_FLASH_APP_SIZE / 2)
#define LS_FLASH_END_ADDR (LS_FLASH_START_ADDR + LS_FLASH_MAX_SIZE)#define LS_KV_BASE_ADDR (LS_FLASH_END_ADDR - (LS_FLASH_KV_PAGE * LS_FLASH_PAGE_SIZE))
#define LS_KV_BACK_ADDR (LS_KV_BASE_ADDR + (LS_FLASH_KV_PAGE - 1) * LS_FLASH_PAGE_SIZE)
#define LS_OPTION_BYTES_ADDR (0x08000000)#define LS_KV_KEY_BOOT_INFO 0x01
#define LS_KV_KEY_POWER_INFO 0x02
#define LS_KV_KEY_USER_INFO 0x03
#define LS_KV_KEY_UID 0x04#define LS_KV_KEY_IO_INFO 0x05
#endif
static int atcmd_get_io_info(atcmd_pack_t *pack) {uint8_t buff[60] = {0};snprintf((char*)buff, 60, "io_ver:%s,save_support:%d,io_num:%d",IO_VERSION, g_io.flag.save_support, LS_IO_NUM);strcat((char*)buff, AT_OK);pack->reply(buff, strlen((char*)buff));return 0;
}
ATCMD_INIT("AT+IOINFO?", atcmd_get_io_info);
static int atcmd_get_mem_info(atcmd_pack_t *pack) {uint8_t buff[60] = {0};mem_info_t* temp = os_get_memory_info();if (temp != NULL) {snprintf((char*)buff, 60, "%d,%d", temp->used, temp->size);}strcat((char*)buff, AT_OK);pack->reply(buff, strlen((char*)buff));return 0;
}
ATCMD_INIT("AT+MEMINFO?", atcmd_get_mem_info);
typedef enum {IO_EVENT_NULL = 0,IO_EVENT_IO_LOW, // 中断事件IO_EVENT_IO_HIGH,IO_EVENT_IO_KEY_SINGLE_CLICK, // 按键事件IO_EVENT_IO_KEY_TWO_CLICK, // 双击IO_EVENT_IO_KEY_LONG_PRESS, // 长按3秒IO_EVENT_IO_KEY_LONG_LONG_PRESS, // 长按10秒
} io_event_t;
static int atcmd_get_event(atcmd_pack_t *pack) {uint8_t buff[LS_IO_NUM * 2 + 10] = {0};for (uint8_t i = 0; i < LS_IO_NUM; i++) {char temp = g_io.func[i].io_event + '0';strncat((char*)buff, &temp, 1);if (i != LS_IO_NUM - 1)strncat((char*)buff, ",", 1);}strcat((char*)buff, AT_OK);pack->reply(buff, strlen((char*)buff));clean_signal_irq();return 0;
}
ATCMD_INIT("AT+IOEVENT?", atcmd_get_event);
static int atcmd_io_cfg_get_all(atcmd_pack_t *pack) {char buff[LS_IO_NUM*2 + 10] = {0};char temp[5] = {0};uint8_t len = 0;for (uint8_t i = 0; i < LS_IO_NUM; i++) {len = snprintf(temp, 5, "%d", g_io.type[i]);strncat(buff, temp, len);if (i != LS_IO_NUM - 1)strncat(buff, ",", 1);}strcat(buff, AT_OK);pack->reply((uint8_t*)buff, strlen(buff));return 0;
}
ATCMD_INIT("AT+IOCFGALL?", atcmd_io_cfg_get_all);
static int atcmd_set_io_all(atcmd_pack_t *pack) {uint8_t argc[LS_IO_NUM] = {0};char *arg; // 临时存放值uint8_t cnt = 0;uint8_t buff[20] = {0};arg = strtok((char*)(pack->data), ",");while (arg != NULL) {argc[cnt++] = (uint8_t)atoi(arg);arg = strtok(NULL, ",");}pack->argc = cnt;if (pack->argc != LS_IO_NUM) {strcat((char*)buff, AT_ARGCERR);pack->reply(buff, strlen((char*)buff));return -1;}for (uint8_t i = 0; i < LS_IO_NUM; i++) {if (g_io.type[i] == IO_TYPE_OUT_PP)bsp_gpio_set_pin(g_io.cfg[i].port, g_io.cfg[i].pin, argc[i]);}strcat((char*)buff, AT_OK);pack->reply(buff, strlen((char*)buff));return 0;
}
ATCMD_INIT("AT+IOALL=", atcmd_set_io_all);
static int atcmd_get_io(atcmd_pack_t *pack) {uint8_t buff[LS_IO_NUM * 2 + 20] = {0};for (uint8_t i = 0; i < LS_IO_NUM; i++) {char temp = (uint8_t)bsp_gpio_get_state(g_io.cfg[i].port, g_io.cfg[i].pin) + '0';strncat((char*)buff, &temp, 1);if (i != LS_IO_NUM - 1)strncat((char*)buff, ",", 1);}strcat((char*)buff, AT_OK);pack->reply(buff, strlen((char*)buff));return 0;
}
ATCMD_INIT("AT+IO?", atcmd_get_io);
extern os_timer_id OS_TIMER_ID(app_io);// 设置周期任务的基准时间 =,
static int atcmd_set_io_timer_ms(atcmd_pack_t *pack) {uint32_t argc[1] = {0};uint8_t buff[40] = {0};pack->argc = sscanf((char*)(pack->data), "%d", &argc[1]);if (pack->argc != 1) return -1;// 先停止周期任务,并将任务全部取消。OS_TIMER_STOP(app_io);for (uint8_t i = 0; i < LS_APP_IO_TIMER_NUM; i++) {g_io.task[i].is_valid = 0;}if (argc[0]) {if (os_timer_restart(OS_TIMER_ID(app_io), argc[0]) != OS_OK)strcat((char*)buff, "io timer restart fail");g_io.timer_io_time_ms = argc[0];} else {if (os_timer_stop(OS_TIMER_ID(app_io)) != OS_OK)strcat((char*)buff, "io timer stop fail");}strcat((char*)buff, AT_OK);pack->reply(buff, strlen((char*)buff));return 0;
}// 设置周期任务 =,,,,,,,
static int atcmd_set_task_func(atcmd_pack_t *pack) {uint8_t buff[30] = {0};if (!g_io.flag.timer_support) {strcat((char*)buff, AT_NONSUPPORT);pack->reply(buff, strlen((char*)buff));return -1;}uint32_t argc[16] = {0};pack->argc = sscanf((char*)(pack->data), "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",&argc[0], &argc[1], &argc[2], &argc[3],&argc[4], &argc[5], &argc[6], &argc[7],&argc[8], &argc[9], &argc[10], &argc[11],&argc[12], &argc[13], &argc[14], &argc[15]);if (pack->argc / 8 > 2 || pack->argc / 8 < 1) {strcat((char*)buff, AT_ARGCERR);pack->reply(buff, strlen((char*)buff));return -1;}OS_TIMER_STOP(app_io);for (uint8_t i = 0; i < pack->argc / 8; i++) {g_io.task[argc[0 + i * 8]].is_valid = argc[1 + i * 8];g_io.task[argc[0 + i * 8]].is_repeat = argc[2 + i * 8];g_io.task[argc[0 + i * 8]].start_time = argc[3 + i * 8];g_io.task[argc[0 + i * 8]].start_task_event = argc[4 + i * 8];g_io.task[argc[0 + i * 8]].stop_time = argc[5 + i * 8];g_io.task[argc[0 + i * 8]].stop_task_event = argc[6 + i * 8];g_io.task[argc[0 + i * 8]].id = argc[7 + i * 8];if (g_io.type[argc[7 + i * 8]] != IO_TYPE_OUT_PP) { // 周期任务目标,会被强制设置为输出uint8_t temp = IO_TYPE_OUT_PP;io_cfg(argc[7 + i * 8], (io_type_t *)&temp, NULL);g_io.type[argc[7 + i * 8]] = temp;g_io.flag.write_in = 1;}g_io.task[argc[0 + i*8]].countdown = 0;}if (os_timer_restart(OS_TIMER_ID(app_io), g_io.timer_io_time_ms) != OS_OK) {strcat((char*)buff, "io timer restart fail");} elsestrcat((char*)buff, AT_OK);pack->reply(buff, strlen((char*)buff));return 0;
}
// 得到周期任务 =,,,,,,,
static int atcmd_get_task_func(atcmd_pack_t *pack) {uint8_t buff[30] = {0};for (uint8_t i = 0; i < LS_APP_IO_TIMER_NUM; i++) {snprintf((char *)buff, 30, "%d,%d,%d,%d,%d,%d,%d,%d\r\n",i, g_io.task[i].is_valid, g_io.task[i].is_repeat,g_io.task[i].start_time, g_io.task[i].start_task_event,g_io.task[i].stop_time, g_io.task[i].stop_task_event, g_io.task[i].id);pack->reply(buff, strlen((char*)buff));}pack->reply((uint8_t *)AT_OK, strlen(AT_OK));return 0;
}ATCMD_INIT("AT+IO_TIMER_MS=", atcmd_set_io_timer_ms);
ATCMD_INIT("AT+IO_TASK=", atcmd_set_task_func);
ATCMD_INIT("AT+IO_TASK?", atcmd_get_task_func);
#include "bsp_adc.h"
extern bsp_adc_cfg_t g_adc0_cfg;
extern os_timer_id OS_TIMER_ID(adc0_collection);
extern uint32_t g_adc0_timer_ms;static int atcmd_adc0_cfg_help(atcmd_pack_t *pack) {char buff[60] = {0};snprintf(buff, 60, "AT+ADC0_CFG=,\r\n");strcat(buff, AT_OK);pack->reply((uint8_t*)buff, strlen(buff));return 0;
}static int atcmd_get_adc0_cfg(atcmd_pack_t *pack) {char buff[30] = {0};snprintf(buff, 30, "%d,%d\r\n", g_adc0_cfg.clk_sel, g_adc0_cfg.sample_num);strcat(buff, AT_OK);pack->reply((uint8_t*)buff, strlen(buff));return 0;
}static int atcmd_set_adc0_cfg(atcmd_pack_t *pack) {uint32_t argc[2] = {0};char buff[20] = {0};pack->argc = sscanf((char*)(pack->data), "%d,%d", &argc[0], &argc[1]);if (pack->argc != 2) {strcat(buff, AT_ARGCERR);pack->reply((uint8_t*)buff, strlen(buff));return -2;}bsp_adc0_deinit();g_adc0_cfg.clk_sel = (uint8_t)argc[0];g_adc0_cfg.sample_num = argc[1];if (bsp_adc0_init(&g_adc0_cfg)) {strcat(buff, AT_ERROR);} else {strcat(buff, AT_OK);}pack->reply((uint8_t*)buff, strlen(buff));return 0;
}static int atcmd_set_adc0_timer_ms(atcmd_pack_t *pack) {uint32_t argc[1] = {0};uint8_t buff[40] = {0};pack->argc = sscanf((char*)(pack->data), "%d", &argc[0]);if (pack->argc != 1) return -1;// 先停止周期任务,并将任务全部取消。OS_TIMER_STOP(adc0_collection);if (argc[0]) {if (os_timer_restart(OS_TIMER_ID(adc0_collection), argc[0]) != OS_OK)strcat((char*)buff, "adc0 timer restart fail");g_adc0_timer_ms = argc[0];} else {if (os_timer_stop(OS_TIMER_ID(adc0_collection)) != OS_OK)strcat((char*)buff, "adc0 timer stop fail");}strcat((char*)buff, AT_OK);pack->reply(buff, strlen((char*)buff));return 0;
}static int atcmd_adc0_start(atcmd_pack_t *pack) {uint8_t buff[40] = {0};if (os_timer_restart(OS_TIMER_ID(adc0_collection), g_adc0_timer_ms) != OS_OK)strcat((char*)buff, "adc0 timer restart fail");strcat((char*)buff, AT_OK);pack->reply(buff, strlen((char*)buff));return 0;
}static int atcmd_adc0_stop(atcmd_pack_t *pack) {uint8_t buff[40] = {0};if (os_timer_stop(OS_TIMER_ID(adc0_collection)) != OS_OK)strcat((char*)buff, "adc0 timer stop fail");strcat((char*)buff, AT_OK);pack->reply(buff, strlen((char*)buff));return 0;
}static int atcmd_get_adc0_val(atcmd_pack_t *pack) {uint8_t buff[60] = {0};snprintf((char *)buff, 60, "%d,%d,%d,%d,%d,%d,%d,%d\r\n",bsp_adc0_get_ch_val(0), bsp_adc0_get_ch_val(1), bsp_adc0_get_ch_val(2), bsp_adc0_get_ch_val(3),bsp_adc0_get_ch_val(4), bsp_adc0_get_ch_val(5), bsp_adc0_get_ch_val(6), bsp_adc0_get_ch_val(7));strcat((char*)buff, AT_OK);pack->reply(buff, strlen((char*)buff));return 0;
}static int atcmd_get_adc0_designated_val(atcmd_pack_t *pack) {uint32_t argc[1];uint8_t buff[30] = {0};pack->argc = sscanf((char*)(pack->data), "%d", &argc[0]);if (pack->argc != 1) return -1;snprintf((char *)buff, 30, "%d", bsp_adc0_get_ch_val(argc[0]));strcat((char*)buff, AT_OK);pack->reply(buff, strlen((char*)buff));return 0;
}ATCMD_INIT("AT+ADC0_TIMER_MS=", atcmd_set_adc0_timer_ms);
ATCMD_INIT("AT+ADC0_START", atcmd_adc0_start);
ATCMD_INIT("AT+ADC0_STOP", atcmd_adc0_stop);
ATCMD_INIT("AT+GET_ADC0_VAL=", atcmd_get_adc0_designated_val);
ATCMD_INIT("AT+GET_ADC0_VAL?", atcmd_get_adc0_val);ATCMD_INIT("AT+ADC0_CFG=?", atcmd_adc0_cfg_help);
ATCMD_INIT("AT+ADC0_CFG=", atcmd_set_adc0_cfg);
ATCMD_INIT("AT+ADC0_CFG?", atcmd_get_adc0_cfg);
#include "bsp_pwm.h"
#include "bsp_tim.h"
#if LS_TIM1_EN
extern bsp_tim_cfg_t g_tim1_cfg;
static int atcmd_set_tim1_cfg_help(atcmd_pack_t *pack) {char buff[85] = {0};snprintf(buff, 60, "AT+TIM1_CFG=,,\r\n");strcat(buff, AT_OK);pack->reply((uint8_t*)buff, strlen(buff));return 0;
}
static int atcmd_set_tim1_cfg(atcmd_pack_t *pack) {uint32_t argc[3] = {0};char buff[10] = {0};pack->argc = sscanf((char*)(pack->data), "%d,%d,%d", &argc[0], &argc[1], &argc[2]);if (pack->argc != 3) {strcat(buff, AT_ARGCERR);pack->reply((uint8_t*)buff, strlen(buff));return -2;}bsp_tim1_pwm_deinit();g_tim1_cfg.prescaler = (uint16_t)argc[0];g_tim1_cfg.period = (uint16_t)argc[1];g_tim1_cfg.level_logic = (uint8_t)argc[2];if (bsp_tim1_pwm_init(&g_tim1_cfg)) {strcat(buff, AT_ERROR);} else {strcat(buff, AT_OK);}pack->reply((uint8_t*)buff, strlen(buff));return 0;
}
ATCMD_INIT("AT+TIM1_CFG=?", atcmd_set_tim1_cfg_help);
ATCMD_INIT("AT+TIM1_CFG=", atcmd_set_tim1_cfg);
#endif
#if LS_TIM2_EN
extern bsp_tim_cfg_t g_tim2_cfg;
static int atcmd_set_tim2_cfg_help(atcmd_pack_t *pack) {char buff[85] = {0};snprintf(buff, 60, "AT+TIM2_CFG=,,\r\n");strcat(buff, AT_OK);pack->reply((uint8_t*)buff, strlen(buff));return 0;
}
static int atcmd_set_tim2_cfg(atcmd_pack_t *pack) {uint32_t argc[3] = {0};char buff[10] = {0};pack->argc = sscanf((char*)(pack->data), "%d,%d,%d", &argc[0], &argc[1], &argc[2]);if (pack->argc != 3) {strcat(buff, AT_ARGCERR);pack->reply((uint8_t*)buff, strlen(buff));return -2;}bsp_tim2_pwm_deinit();g_tim2_cfg.prescaler = (uint16_t)argc[0];g_tim2_cfg.period = (uint16_t)argc[1];g_tim2_cfg.level_logic = (uint8_t)argc[2];if (bsp_tim2_pwm_init(&g_tim2_cfg)) {strcat(buff, AT_ERROR);} else {strcat(buff, AT_OK);}pack->reply((uint8_t*)buff, strlen(buff));return 0;
}
ATCMD_INIT("AT+TIM2_CFG=?", atcmd_set_tim2_cfg_help);
ATCMD_INIT("AT+TIM2_CFG=", atcmd_set_tim2_cfg);
#endifstatic int atcmd_set_pwm_val_help(atcmd_pack_t *pack) {char buff[60] = {0};snprintf(buff, 60, "AT+PWM=,\r\n");strcat(buff, AT_OK);pack->reply((uint8_t*)buff, strlen(buff));return 0;
}static int atcmd_set_pwm_val(atcmd_pack_t *pack) {uint32_t argc[2] = {0};uint8_t buff[10] = {0};pack->argc = sscanf((char*)(pack->data), "%d,%d", &argc[0], &argc[1]);if (pack->argc != 2) {strcat((char*)buff, AT_ARGCERR);pack->reply(buff, strlen((char*)buff));return -2;}if (bsp_pwm_set_pulse(argc[0], argc[1])) {strcat((char*)buff, AT_ERROR);} else {strcat((char*)buff, AT_OK);}pack->reply(buff, strlen((char*)buff));return 0;
}ATCMD_INIT("AT+PWM=?", atcmd_set_pwm_val_help);
ATCMD_INIT("AT+PWM=", atcmd_set_pwm_val);
gitee地址:LiSunSDK开源地址
上一篇:Linux的目录结构