diff --git a/app/config/app_config.c b/app/config/app_config.c index c7109b2..acdfee9 100644 --- a/app/config/app_config.c +++ b/app/config/app_config.c @@ -37,8 +37,7 @@ const int *g_sys_log_on = &s_cfg_app.sys_log_on; static os_work_t s_work_hdl_save; /* 默认的程序设置代码文件 */ -#include "app_config/developing.h" -#include "app_config/SBDEMO.h" +#include "app_config/_default_config.h" /* nvs 接口 ------------------------------------------------------------------------------------ */ @@ -258,6 +257,18 @@ void app_cfg_set_rf_mode_change(void) app_cfg_do_save(1000); } +int app_cfg_set_rf_mode(data_bridge_rf_mode_t rf_mode) +{ + if (rf_mode >= DATA_BRIDGE_RF_MODE_MAX) + { + SYS_LOG_WRN("rf_mode: %d", rf_mode); + return -1; + } + s_cfg_app.rf_mode = rf_mode; + app_cfg_do_save(1000); + return 0; +} + int app_cfg_set_psPassword(const void *psPassword, int size) { if (size > sizeof(s_cfg_app.psPassword)) @@ -355,6 +366,75 @@ int app_cfg_set_rf_parameters(const void *wifi_parameters, size_t size) return 0; } +int app_cfg_set_wifi_ap_ssid(const void *ssid) +{ + if (ssid == NULL) + { + SYS_LOG_WRN("ssid is empty"); + return -1; + } + + if (strlen(ssid) >= __ARRAY_SIZE(s_cfg_app.app_config_wifi_para.wifi_ap_ssid)) + { + SYS_LOG_WRN("size: %u > %u", strlen(ssid), __ARRAY_SIZE(s_cfg_app.app_config_wifi_para.wifi_ap_ssid)); + return -1; + } + strncpy(s_cfg_app.app_config_wifi_para.wifi_ap_ssid, ssid, __ARRAY_SIZE(s_cfg_app.app_config_wifi_para.wifi_ap_ssid)); + app_cfg_do_save(1000); + return 0; +} +int app_cfg_set_wifi_ap_password(const void *password) +{ + if (password == NULL) + { + SYS_LOG_WRN("password is empty"); + return -1; + } + + if (strlen(password) >= __ARRAY_SIZE(s_cfg_app.app_config_wifi_para.wifi_ap_password)) + { + SYS_LOG_WRN("size: %u > %u", strlen(password), __ARRAY_SIZE(s_cfg_app.app_config_wifi_para.wifi_ap_password)); + return -1; + } + strncpy(s_cfg_app.app_config_wifi_para.wifi_ap_password, password, __ARRAY_SIZE(s_cfg_app.app_config_wifi_para.wifi_ap_password)); + app_cfg_do_save(1000); + return 0; +} +int app_cfg_set_wifi_sta_ssid(const void *ssid) +{ + if (ssid == NULL) + { + SYS_LOG_WRN("ssid is empty"); + return -1; + } + + if (strlen(ssid) >= __ARRAY_SIZE(s_cfg_app.app_config_wifi_para.wifi_sta_ssid)) + { + SYS_LOG_WRN("size: %u > %u", strlen(ssid), __ARRAY_SIZE(s_cfg_app.app_config_wifi_para.wifi_sta_ssid)); + return -1; + } + strncpy(s_cfg_app.app_config_wifi_para.wifi_sta_ssid, ssid, __ARRAY_SIZE(s_cfg_app.app_config_wifi_para.wifi_sta_ssid)); + app_cfg_do_save(1000); + return 0; +} +int app_cfg_set_wifi_sta_password(const void *password) +{ + if (password == NULL) + { + SYS_LOG_WRN("password is empty"); + return -1; + } + + if (strlen(password) >= __ARRAY_SIZE(s_cfg_app.app_config_wifi_para.wifi_sta_password)) + { + SYS_LOG_WRN("size: %u > %u", strlen(password), __ARRAY_SIZE(s_cfg_app.app_config_wifi_para.wifi_sta_password)); + return -1; + } + strncpy(s_cfg_app.app_config_wifi_para.wifi_sta_password, password, __ARRAY_SIZE(s_cfg_app.app_config_wifi_para.wifi_sta_password)); + app_cfg_do_save(1000); + return 0; +} + int app_cfg_set_drone_data(const void *drone_data, int size) { if (size > sizeof(s_cfg_app.drone_data)) @@ -445,3 +525,30 @@ int app_cfg_set_mac_tab(uint8_t mac[6]) app_cfg_do_save(1000); return 0; } + +int app_cfg_set_temp_log_on(bool sw) +{ + // SYS_LOG_INF("set temp log on: %d", sw); + s_cfg_app.temperature_log.temp_log_on = !!sw; + app_cfg_do_save(100); + return 0; +} + +int app_cfg_set_temp_log_index(uint8_t index) +{ + // SYS_LOG_INF("set temp log index: %d", index); + s_cfg_app.temperature_log.temp_log_index = index; + app_cfg_do_save(100); + return 0; +} + +int app_cfg_set_gyro_heat_value(uint8_t value) +{ + if (value > 60) + { + return -1; + } + s_cfg_app.gyro_heat_value = value; + app_cfg_do_save(100); + return 0; +} diff --git a/app/config/app_config.h b/app/config/app_config.h index 99b9319..43b551c 100644 --- a/app/config/app_config.h +++ b/app/config/app_config.h @@ -100,7 +100,13 @@ typedef struct // 设备配置统一数据结构 bool ble : 1; // 使用 BLE bool ap : 1; // 使用 WIFI AP 模式 bool sta : 1; // 使用 WIFI STA 模式 - uint32_t reserve : 24; + + bool strip_pwrup : 1; // 使用灯带上电效果 + bool strip_show_rf : 1; // 在灯带中用一个灯来显示射频数据接口状态的灯效图层 + bool strip_link_fc : 1; // 开启灯带联动飞控:用于飞控状态监控(MSP) + bool bat_led_startup : 1; // 开启电量灯效 + + uint32_t reserve : 21; // 预留占位(原来是24个uint32) } capacity; struct @@ -114,9 +120,18 @@ typedef struct // 设备配置统一数据结构 uint8_t mac_index; // 记录当前通过 WIFI 连接过的 APP 的 MAC 地址的序号 uint8_t mac_tab[6][6]; // 记录当前通过 WIFI 连接过的 APP 的 MAC 地址, 6 个 MAC 地址,每个 MAC 地址 6 字节,判断是否 APP 设备连接,用于决定是否停止对飞控状态监测 + uint8_t product_id[6]; // 产品 ID - uint32_t reserve[32]; // 预留占位,下次更改时保证参数总长度不变,如超过预留长度后则当作新数据处理 + uint8_t gyro_heat_value; // 陀螺仪加热值,单位温度,0为关闭,最大值为80℃ + + struct + { + bool temp_log_on : 1; // 温度日志开关 + uint8_t temp_log_index : 5; // 温度日志最新索引 + } temperature_log; + + uint32_t reserve[37]; // 预留占位,下次更改时保证参数总长度不变,如超过预留长度后则当作新数据处理,sizeof(cfg_app_t) = 484UL uint32_t crc32; // 校验数据(可放于任何位置) } cfg_app_t; @@ -140,6 +155,8 @@ extern const int *g_sys_log_on; void app_cfg_set_sys_log(bool on); void app_cfg_set_rf_mode_change(void); // 设置 g_cfg_app->rf_mode 的下一个模式 +int app_cfg_set_rf_mode(data_bridge_rf_mode_t rf_mode); + int app_cfg_set_psPassword(const void *psPassword, int size); int app_cfg_set_device_name_ble(const void *device_name_ble, int size); int app_cfg_set_drone_data(const void *drone_data, int size); @@ -157,5 +174,14 @@ int app_cfg_set_led_strip_sw(uint8_t sw); int app_cfg_set_armed2close_rf_sw(bool sw); int app_cfg_set_rf_parameters(const void *wifi_parameters, size_t size); +int app_cfg_set_wifi_ap_ssid(const void *ssid); +int app_cfg_set_wifi_ap_password(const void *password); +int app_cfg_set_wifi_sta_ssid(const void *ssid); +int app_cfg_set_wifi_sta_password(const void *password); int app_cfg_set_mac_tab(uint8_t mac[6]); + +int app_cfg_set_temp_log_on(bool sw); +int app_cfg_set_temp_log_index(uint8_t index); + +int app_cfg_set_gyro_heat_value(uint8_t value); diff --git a/app/config/app_config/_default_config.h b/app/config/app_config/_default_config.h new file mode 100644 index 0000000..909650e --- /dev/null +++ b/app/config/app_config/_default_config.h @@ -0,0 +1,4 @@ +#pragma once + +#include "./developing.h" +#include "./SBDEMO.h" diff --git a/app/config/board_config.c b/app/config/board_config.c index 659ae63..3cc0f4f 100644 --- a/app/config/board_config.c +++ b/app/config/board_config.c @@ -12,9 +12,7 @@ #define CONS_ABORT() #include "sys_log.h" -#include "board_config/devkit_esp32c2.h" -#include "board_config/devkit_esp32c3.h" -#include "board_config/devkit_esp32s3.h" +#include "board_config/_default_config.h" typedef struct { diff --git a/app/config/board_config.h b/app/config/board_config.h index a7bb65f..216fe8a 100644 --- a/app/config/board_config.h +++ b/app/config/board_config.h @@ -27,6 +27,8 @@ #include "drivers/chip/_hal.h" #include "sdkconfig.h" +#include "hal/adc_types.h" +#include "driver/ledc.h" #define GPIO_USED(pin) ((pin) < 255) @@ -44,12 +46,27 @@ typedef struct // 对应 GPIO 单个引脚的输入/输出配置的基础定义 typedef struct // LED: WS2812 { - hal_id_t spi_id; // 模拟 PWM 用的 SPI - uint8_t strip_pin[4]; // 用于驱动灯带的输出引脚。[0] 为默认脚,[1..3] 为附加的另外几路,非 255 表示有效,程序根据这些脚判断接多少根灯带 - uint8_t bat_led_pin; // 用于指示电池电量的 LED 灯,非 255 表示有效 - uint8_t rf_status_pin; // 板上用于指示状态的 RGB 灯珠,非 255 表示有效 + hal_id_t spi_id; // 模拟 PWM 用的 SPI + uint8_t strip_pin[4]; // 用于驱动灯带的输出引脚。[0] 为默认脚,[1..3] 为附加的另外几路,非 255 表示有效,程序根据这些脚判断接多少根灯带 + uint8_t bat_led_pin[2]; // 用于指示电池电量的 RGB 灯,[0]为IO非 255 表示有效,[1]为电量灯珠数目 + uint8_t rf_status_pin; // 板上用于指示状态的 RGB 灯珠,非 255 表示有效 } cfg_board_led_spi_t; +typedef struct +{ + ledc_channel_t pwm_output; // pwm 输出控制引脚,有效电平为打开热输出的电平 + uint32_t pwm_period; // pwm 输出周期 +} cfg_pwm_config_t; + +typedef struct +{ + uint8_t adc_short; // 设测温电阻短路(阻值为0时)将表现的电平:0 表示接地,1 表示接电源 + uint16_t adc_max; // 元器件量程(采样最大值) + uint16_t thermistor_b; // 热敏电阻的材料常数(B值。一般2000~6000之间,单位为K) + uint16_t thermistor_ohm; // 热敏电阻在25℃时的阻值(Ω) + uint16_t load_res_ohm; // 测温度负载分压电阻(Ω) +} cfg_thermistor_config_t; + typedef enum __packed // 用于与飞控通讯的数据接口 { CFG_BOARD_FC_PORT_UART = 0, // 使用串口与飞控通讯 @@ -85,6 +102,7 @@ typedef struct // 数据结构一旦定下不可随意变更 cfg_board_pin_io_t key_reset; // 按键检测:开机时长安 10 秒恢复出厂设置的按键,有效电平为按下电平 cfg_board_pin_io_t key_led_strip_switch; // 按键检测:切换灯带效果,适用于灯带固件,有效电平为按下电平 + cfg_board_pin_io_t key_led_color_switch; // 按键检测:切换灯带效果,适用于竞速灯带切换颜色,有效电平为按下电平 cfg_board_pin_io_t key_rf_switch; // 按键检测:切换射频数据接口,适用于固定翼无线 USB 板,有效电平为按下电平 cfg_board_pin_io_t key_9v_switch; // 按键检测:9伏电源开关控制,适用 F7V4, 有效电平为按下电平 @@ -96,6 +114,10 @@ typedef struct // 数据结构一旦定下不可随意变更 cfg_board_pin_io_t led_strip_on; // 灯带控制主机切换的指示灯,有效电平为点亮电平 cfg_board_pin_io_t led_bat[4]; // 电池电量指示灯,有效电平为点亮电平 + hal_adc_hdl_t heat_adc; // 用于 ADC 测量的配置 + cfg_pwm_config_t heat_pwm; // 用于控制 PWM 输出的配置 + cfg_thermistor_config_t heat_thermistor; // 热敏电阻配置 + /* 产品功能描述类 */ } cfg_board_t; diff --git a/app/config/board_config/_default_config.h b/app/config/board_config/_default_config.h new file mode 100644 index 0000000..54a0bf8 --- /dev/null +++ b/app/config/board_config/_default_config.h @@ -0,0 +1,5 @@ +#pragma once + +#include "./devkit_esp32c2.h" +#include "./devkit_esp32c3.h" +#include "./devkit_esp32s3.h" diff --git a/app/config/board_config/devkit_esp32c2.h b/app/config/board_config/devkit_esp32c2.h index bcb1872..ee15eff 100644 --- a/app/config/board_config/devkit_esp32c2.h +++ b/app/config/board_config/devkit_esp32c2.h @@ -5,7 +5,8 @@ static cfg_board_t const s_cfg_board_default = { .firmware_str = PRODUCT_ID, .platform_str = CONFIG_IDF_TARGET, - .board_name = "ESP32-C2-Devkitc", + .board_name = "devkit_esp32c2", + /* 控制台串口 */ .uart_console = { .pin_txd = {43, _GPIO_DIR_OUT, _GPIO_PUD_PULL_UP}, @@ -15,18 +16,68 @@ static cfg_board_t const s_cfg_board_default = { .br = 115200, }, - /* 启动按键 */ - .key_reset = { - .pin = 9, // 用于切换灯效 - .en_lev = 0, // 用于切换灯效 + /* 数据透传串口 */ + .uart_fc = { + .pin_txd = {7, _GPIO_DIR_OUT, _GPIO_PUD_PULL_UP}, + .pin_rxd = {6, _GPIO_DIR_IN, _GPIO_PUD_PULL_UP}, + .id = UART_NUM_1, + .irq_prior = 24, + .br = 115200, }, .led_spi = { .spi_id = SPI2_HOST, // 模拟 PWM 用的 SPI .strip_pin = {10, ~0, ~0, ~0}, // 用于驱动灯带的输出引脚 - .bat_led_pin = ~0, // 用于指示电池电量的 LED 灯,非 ~0 表示有效 + .bat_led_pin = {~0, 0}, // 用于指示电池电量的 LED 灯,[0]为IO非 ~0 表示有效,[1]为电量灯珠数目 .rf_status_pin = ~0, // 板上用于指示状态的 RGB 灯珠,非 ~0 表示有效 }, + + .fc_port_type = CFG_BOARD_FC_PORT_UART, // 用于与飞控通讯的数据接口 + + /* ISP 控制脚 */ + .io_isp = { + .nrst = 4, // 复位控制引脚 + .boot0 = 5, // boot0 控制引脚 + }, + + .detect_usb = {.pin = ~0, .en_lev = 0}, // 输入检测:检测飞控 USB 插入,有效电平为插入电平 + + .key_reset = {.pin = 9, .en_lev = 0}, // 按键检测:开机时长安 10 秒恢复出厂设置的按键,有效电平为按下电平 + .key_led_strip_switch = {.pin = 9, .en_lev = 0}, // 按键检测:切换灯带效果,适用于灯带固件,有效电平为按下电平 + .key_led_color_switch = {.pin = ~0, .en_lev = 1}, // 按键检测:切换灯带颜色,适用于竞速灯带切换颜色,有效电平为按下电平 + .key_rf_switch = {.pin = ~0, .en_lev = 0}, // 按键检测:切换射频数据接口,适用于固定翼无线 USB 板,有效电平为按下电平 + .key_9v_switch = {.pin = ~0, .en_lev = 0}, // 按键检测:9伏电源开关控制,适用 F7V4, 有效电平为按下电平 + + .sw_led_strip = {.pin = ~0, .en_lev = 0}, // 灯带控制主机的切换控制引脚,有效电平为切换为本模块控制的电平 + .sw_pwr_9v = {.pin = ~0, .en_lev = 0}, // 9V 电源输出控制引脚,有效电平为打开 9V 电源的电平 + .sw_usb = {.pin = ~0, .en_lev = 0}, // USB 切换的模拟开关,有效电平为切换为本模块控制的电平 + + .led_rf_status = {.pin = ~0, .en_lev = 0}, // 射频指示灯,单色 LED. 引脚号值为 ~0 时,射频连接状态通过灯带展示,值为非 ~0 时,射频连接状态通过这个引脚控制的 LED 展示,有效电平为点亮电平 + .led_strip_on = {.pin = ~0, .en_lev = 0}, // 灯带控制主机切换的指示灯,有效电平为点亮电平 + .led_bat = { + // 电池电量指示灯,有效电平为点亮电平 + [0] = {.pin = ~0, .en_lev = 0}, + [1] = {.pin = ~0, .en_lev = 0}, + [2] = {.pin = ~0, .en_lev = 0}, + [3] = {.pin = ~0, .en_lev = 0}, + }, + + .heat_adc = { + .id = ADC_UNIT_1, // ADC 单元 + .channel_mask = ~0, // ADC 通道 + }, + .heat_pwm = { + .pwm_output = ~0, // 热输出控制引脚,有效电平为打开热输出的电平 + .pwm_period = 1000000, // 模拟 PWM 的周期( us ) + }, + .heat_thermistor = { + .adc_short = 0, // 设测温电阻短路(阻值为0时)将表现的电平:0 表示接地,1 表示接电源 + .adc_max = 1 << 12, // 器件的量程( ADC 取样的最大值) + .thermistor_ohm = 10000, // 热敏电阻在25℃时的阻值( Ω ) NCP15XH103F03RC + .load_res_ohm = 10000, // 负载电阻的阻值( Ω ) + .thermistor_b = 3380, // 热敏电阻的材料常数( B 值,一般2000~6000之间,单位为 K ) + }, + }; #endif diff --git a/app/config/board_config/devkit_esp32c3.h b/app/config/board_config/devkit_esp32c3.h index 6cc4b6d..5372bc4 100644 --- a/app/config/board_config/devkit_esp32c3.h +++ b/app/config/board_config/devkit_esp32c3.h @@ -5,7 +5,8 @@ static cfg_board_t const s_cfg_board_default = { .firmware_str = PRODUCT_ID, .platform_str = CONFIG_IDF_TARGET, - .board_name = "ESP32-C3-Devkitc", + .board_name = "devkit_esp32c3", + /* 控制台串口 */ .uart_console = { .pin_txd = {43, _GPIO_DIR_OUT, _GPIO_PUD_PULL_UP}, @@ -15,18 +16,68 @@ static cfg_board_t const s_cfg_board_default = { .br = 115200, }, - /* 启动按键 */ - .key_reset = { - .pin = 9, // 用于切换灯效 - .en_lev = 0, // 用于切换灯效 + /* 数据透传串口 */ + .uart_fc = { + .pin_txd = {7, _GPIO_DIR_OUT, _GPIO_PUD_PULL_UP}, + .pin_rxd = {6, _GPIO_DIR_IN, _GPIO_PUD_PULL_UP}, + .id = UART_NUM_1, + .irq_prior = 24, + .br = 115200, }, .led_spi = { .spi_id = SPI2_HOST, // 模拟 PWM 用的 SPI - .strip_pin = {18, ~0, ~0, ~0}, // 用于驱动灯带的输出引脚 - .bat_led_pin = ~0, // 用于指示电池电量的 LED 灯,非 ~0 表示有效 + .strip_pin = {10, ~0, ~0, ~0}, // 用于驱动灯带的输出引脚 + .bat_led_pin = {~0, 0}, // 用于指示电池电量的 LED 灯,[0]为IO非 ~0 表示有效,[1]为电量灯珠数目 .rf_status_pin = ~0, // 板上用于指示状态的 RGB 灯珠,非 ~0 表示有效 }, + + .fc_port_type = CFG_BOARD_FC_PORT_UART, // 用于与飞控通讯的数据接口 + + /* ISP 控制脚 */ + .io_isp = { + .nrst = 4, // 复位控制引脚 + .boot0 = 5, // boot0 控制引脚 + }, + + .detect_usb = {.pin = ~0, .en_lev = 0}, // 输入检测:检测飞控 USB 插入,有效电平为插入电平 + + .key_reset = {.pin = 9, .en_lev = 0}, // 按键检测:开机时长安 10 秒恢复出厂设置的按键,有效电平为按下电平 + .key_led_strip_switch = {.pin = 9, .en_lev = 0}, // 按键检测:切换灯带效果,适用于灯带固件,有效电平为按下电平 + .key_led_color_switch = {.pin = ~0, .en_lev = 1}, // 按键检测:切换灯带颜色,适用于竞速灯带切换颜色,有效电平为按下电平 + .key_rf_switch = {.pin = ~0, .en_lev = 0}, // 按键检测:切换射频数据接口,适用于固定翼无线 USB 板,有效电平为按下电平 + .key_9v_switch = {.pin = ~0, .en_lev = 0}, // 按键检测:9伏电源开关控制,适用 F7V4, 有效电平为按下电平 + + .sw_led_strip = {.pin = ~0, .en_lev = 0}, // 灯带控制主机的切换控制引脚,有效电平为切换为本模块控制的电平 + .sw_pwr_9v = {.pin = ~0, .en_lev = 0}, // 9V 电源输出控制引脚,有效电平为打开 9V 电源的电平 + .sw_usb = {.pin = ~0, .en_lev = 0}, // USB 切换的模拟开关,有效电平为切换为本模块控制的电平 + + .led_rf_status = {.pin = ~0, .en_lev = 0}, // 射频指示灯,单色 LED. 引脚号值为 ~0 时,射频连接状态通过灯带展示,值为非 ~0 时,射频连接状态通过这个引脚控制的 LED 展示,有效电平为点亮电平 + .led_strip_on = {.pin = ~0, .en_lev = 0}, // 灯带控制主机切换的指示灯,有效电平为点亮电平 + .led_bat = { + // 电池电量指示灯,有效电平为点亮电平 + [0] = {.pin = ~0, .en_lev = 0}, + [1] = {.pin = ~0, .en_lev = 0}, + [2] = {.pin = ~0, .en_lev = 0}, + [3] = {.pin = ~0, .en_lev = 0}, + }, + + .heat_adc = { + .id = ADC_UNIT_1, // ADC 单元 + .channel_mask = ~0, // ADC 通道 + }, + .heat_pwm = { + .pwm_output = ~0, // 热输出控制引脚,有效电平为打开热输出的电平 + .pwm_period = 1000000, // 模拟 PWM 的周期( us ) + }, + .heat_thermistor = { + .adc_short = 0, // 设测温电阻短路(阻值为0时)将表现的电平:0 表示接地,1 表示接电源 + .adc_max = 1 << 12, // 器件的量程( ADC 取样的最大值) + .thermistor_ohm = 10000, // 热敏电阻在25℃时的阻值( Ω ) NCP15XH103F03RC + .load_res_ohm = 10000, // 负载电阻的阻值( Ω ) + .thermistor_b = 3380, // 热敏电阻的材料常数( B 值,一般2000~6000之间,单位为 K ) + }, + }; #endif diff --git a/app/config/board_config/devkit_esp32s3.h b/app/config/board_config/devkit_esp32s3.h index 106fbf2..0954ae0 100644 --- a/app/config/board_config/devkit_esp32s3.h +++ b/app/config/board_config/devkit_esp32s3.h @@ -5,28 +5,85 @@ static cfg_board_t const s_cfg_board_default = { .firmware_str = PRODUCT_ID, .platform_str = CONFIG_IDF_TARGET, - .board_name = "ESP32-S3-Devkitc", + .board_name = "devkit_esp32s3", + /* 控制台串口 */ .uart_console = { - .pin_txd = {255, _GPIO_DIR_OUT, _GPIO_PUD_PULL_UP}, - .pin_rxd = {255, _GPIO_DIR_IN, _GPIO_PUD_PULL_UP}, + .pin_txd = {43, _GPIO_DIR_OUT, _GPIO_PUD_PULL_UP}, + .pin_rxd = {44, _GPIO_DIR_IN, _GPIO_PUD_PULL_UP}, .id = UART_NUM_0, .irq_prior = 0, .br = 115200, }, - /* 启动按键 */ - .key_reset = { - .pin = 0, // 用于切换灯效 - .en_lev = 0, // 用于切换灯效 + /* 数据透传串口 */ + .uart_fc = { + .pin_txd = {7, _GPIO_DIR_OUT, _GPIO_PUD_PULL_UP}, + .pin_rxd = {6, _GPIO_DIR_IN, _GPIO_PUD_PULL_UP}, + .id = UART_NUM_1, + .irq_prior = 24, + .br = 115200, }, .led_spi = { .spi_id = SPI2_HOST, // 模拟 PWM 用的 SPI - .strip_pin = {18, ~0, ~0, ~0}, // 用于驱动灯带的输出引脚 - .bat_led_pin = ~0, // 用于指示电池电量的 LED 灯,非 ~0 表示有效 + .strip_pin = {14, ~0, ~0, ~0}, // 用于驱动灯带的输出引脚 + .bat_led_pin = {~0, 0}, // 用于指示电池电量的 LED 灯,[0]为IO非 ~0 表示有效,[1]为电量灯珠数目 .rf_status_pin = ~0, // 板上用于指示状态的 RGB 灯珠,非 ~0 表示有效 }, + + .fc_port_type = CFG_BOARD_FC_PORT_UART, // 用于与飞控通讯的数据接口 + + /* ISP 控制脚 */ + .io_isp = { + .nrst = 4, // 复位控制引脚 + .boot0 = 5, // boot0 控制引脚 + }, + + /* USB OTG 引脚 */ + .io_usb = { + .usb_dm = 19, + .usb_dp = 20, + }, + + .detect_usb = {.pin = 36, .en_lev = 1}, // 输入检测:检测飞控 USB 插入,有效电平为插入电平 + + .key_reset = {.pin = ~0, .en_lev = 0}, // 按键检测:开机时长安 10 秒恢复出厂设置的按键,有效电平为按下电平 + .key_led_strip_switch = {.pin = ~0, .en_lev = 0}, // 按键检测:切换灯带效果,适用于灯带固件,有效电平为按下电平 + .key_led_color_switch = {.pin = ~0, .en_lev = 1}, // 按键检测:切换灯带颜色,适用于竞速灯带切换颜色,有效电平为按下电平 + .key_rf_switch = {.pin = ~0, .en_lev = 0}, // 按键检测:切换射频数据接口,适用于固定翼无线 USB 板,有效电平为按下电平 + .key_9v_switch = {.pin = ~0, .en_lev = 0}, // 按键检测:9伏电源开关控制,适用 F7V4, 有效电平为按下电平 + + .sw_led_strip = {.pin = 2, .en_lev = 1}, // 灯带控制主机的切换控制引脚,有效电平为切换为本模块控制的电平 + .sw_pwr_9v = {.pin = 11, .en_lev = 1}, // 9V 电源输出控制引脚,有效电平为打开 9V 电源的电平 + .sw_usb = {.pin = 5, .en_lev = 1}, // USB 切换的模拟开关,有效电平为切换为本模块控制的电平 + + .led_rf_status = {.pin = 3, .en_lev = 0}, // 射频指示灯,单色 LED. 引脚号值为 ~0 时,射频连接状态通过灯带展示,值为非 ~0 时,射频连接状态通过这个引脚控制的 LED 展示,有效电平为点亮电平 + .led_strip_on = {.pin = 4, .en_lev = 0}, // 灯带控制主机切换的指示灯,有效电平为点亮电平 + .led_bat = { + // 电池电量指示灯,有效电平为点亮电平 + [0] = {.pin = 33, .en_lev = 0}, + [1] = {.pin = 34, .en_lev = 0}, + [2] = {.pin = 35, .en_lev = 0}, + [3] = {.pin = 36, .en_lev = 0}, + }, + + .heat_adc = { + .id = ADC_UNIT_1, // ADC 单元 + .channel_mask = ~0, // ADC 通道 + }, + .heat_pwm = { + .pwm_output = ~0, // 热输出控制引脚,有效电平为打开热输出的电平 + .pwm_period = 1000000, // 模拟 PWM 的周期( us ) + }, + .heat_thermistor = { + .adc_short = 0, // 设测温电阻短路(阻值为0时)将表现的电平:0 表示接地,1 表示接电源 + .adc_max = 1 << 12, // 器件的量程( ADC 取样的最大值) + .thermistor_ohm = 10000, // 热敏电阻在25℃时的阻值( Ω ) NCP15XH103F03RC + .load_res_ohm = 10000, // 负载电阻的阻值( Ω ) + .thermistor_b = 3380, // 热敏电阻的材料常数( B 值,一般2000~6000之间,单位为 K ) + }, + }; #endif diff --git a/app/drivers/data_port/uart/uart_port.c b/app/drivers/data_port/uart/uart_port.c index fd66f54..cd08eaf 100755 --- a/app/drivers/data_port/uart/uart_port.c +++ b/app/drivers/data_port/uart/uart_port.c @@ -6,6 +6,7 @@ #include "uart_port.h" +#include "drivers/chip/gpio.h" #include "driver/uart.h" #include "hal/uart_ll.h" @@ -368,7 +369,7 @@ static int _uart_port_read(sb_data_port_t *port, void *data, uint32_t size) return ret; } -static bool _uart_port_is_tart(sb_data_port_t *port) +static bool _uart_port_is_start(sb_data_port_t *port) { if (port == NULL) { @@ -424,7 +425,7 @@ static sb_data_port_vtable_t const s_uart_vtable = { .stop = _uart_port_stop, .write = _uart_port_write, .read = _uart_port_read, - .is_started = _uart_port_is_tart, + .is_started = _uart_port_is_start, .get_rx_length = _uart_port_get_rx_length, }; @@ -482,9 +483,14 @@ sb_data_port_t *sb_uart_port_bind(int uart_num, void sb_uart_port_unbind(sb_data_port_t *port) { - if (_uart_port_is_tart(port)) + if (_uart_port_is_start(port)) { _uart_port_stop(port); + + __uart_data_t *uart_data = port->data; + drv_gpio_pin_configure(uart_data->tx_pin, _GPIO_DIR_IN, _GPIO_PUD_PULL_UP); + drv_gpio_pin_configure(uart_data->rx_pin, _GPIO_DIR_IN, _GPIO_PUD_PULL_UP); + + port->data = NULL; } - port->data = NULL; }