浏览代码

Добавил напряжение на батарее RTC.

TelenkovDmitry 5 月之前
父节点
当前提交
7d9a27e94e

+ 15 - 4
fw/modules/modbus/modbus_params.c

@@ -16,6 +16,7 @@
 #include "swap.h"
 #include "common_gpio.h"
 #include "monitoring.h"
+#include "rtc_battery.h"
 #include <string.h>
 
 
@@ -115,8 +116,18 @@ void mb_init_params(void)
     
     index++;
     
-    // Состояние модуля
+    // Напряжение на батарее RTC
     mb_param[index].reg = 0x0807;
+	mb_param[index].size = 2;
+	mb_param[index].param = (uint8_t*)&bat_voltage; // 
+	mb_param[index].set = NULL;
+    mb_param[index].get = NULL;
+    mb_param[index].check_handler = mb_check_dummy;
+    
+    index++;
+    
+    // Состояние модуля
+    mb_param[index].reg = 0x0809;
 	mb_param[index].size = 2;
 	mb_param[index].param = (uint8_t*)&mon_state; // 
 	mb_param[index].set = NULL;
@@ -126,7 +137,7 @@ void mb_init_params(void)
     index++;
     
     // Пользовательская информация. Текстовая строка.
-    mb_param[index].reg = 0x0809;
+    mb_param[index].reg = 0x080B;
 	mb_param[index].size = 16;
 	mb_param[index].param = (uint8_t*)&settings.info; // 
 	mb_param[index].set = NULL;
@@ -136,7 +147,7 @@ void mb_init_params(void)
     index++;
     
     // Безопасный режим работы
-    mb_param[index].reg = 0x080A;
+    mb_param[index].reg = 0x081B;
 	mb_param[index].size = 1;
 	mb_param[index].param = (uint8_t*)&settings.save_mode; // 
 	mb_param[index].set = NULL;
@@ -146,7 +157,7 @@ void mb_init_params(void)
     index++;
     
     // Время до перехода в безопасный режим работы
-    mb_param[index].reg = 0x080B;
+    mb_param[index].reg = 0x081C;
 	mb_param[index].size = 1;
 	mb_param[index].param = (uint8_t*)&settings.save_delay; // 
 	mb_param[index].set = NULL;

+ 1 - 1
fw/modules/modbus/modbus_params.h

@@ -12,7 +12,7 @@ extern "C" {
 #endif
 
 #if defined (MDIO_88)  
-#define  MB_PARAM_MAX			92
+#define  MB_PARAM_MAX			93
 #endif
 
 #if defined (MAI_12)  

+ 301 - 297
fw/user/main.cpp

@@ -1,297 +1,301 @@
-#include "at32f403a_407.h"
-#include "at32f403a_407_board.h"
-#include "at32f403a_407_clock.h"
-#include "common_config.h"
-#include "FreeRTOS.h"
-#include "task.h"
-#include "queue.h"
-#include "semphr.h"
-extern "C" {
-#include "usb_eth.h"
-#include "mux.h"
-#include "misc.h"
-#include "spi_common.h"
-#include "user_fatfs.h"
-#include "spi_flash.h"
-#include "usb_eth.h"
-#include "extended_sram.h"
-#include "modbus.h"
-#include "common_gpio.h"
-#include "io.h"
-#include "sys_api.h"
-#include "settings_api.h"
-#include "update.h"
-#include "uptime.h"
-#include "rtc.h"
-#include "mb.h"
-#include "io_utils.h"
-#include "digital_input.h"
-#include "digital_output.h"
-#include "buttons.h"
-#include "adc_transport.h"
-#include "shift_reg.h"
-#include "analog_input.h"
-#include "analog_output.h"
-#include "dac_transport.h"
-#include "log.h"
-#include "swap.h"
-#include "utility.h"
-#include "soft_test.h"
-#include "soft_wdt.h"
-#include "usb_clock.h"
-#include "filter.h"
-#include "modbus_ai_params.h"
-}
-#include "terminal_sbs.h"
-#include "terminal_usartbridge.h"
-#include <stdio.h>
-#include <stdbool.h>
-#include <string.h>
-#include <stdlib.h>
-
-
-void init_task(void *argument);
-
-
-//
-int main(void)
-{
-    __disable_irq();
-    nvic_vector_table_set(NVIC_VECTTAB_FLASH, 0x08021000);
-    nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
-	__enable_irq();
-  
-    crm_periph_clock_enable(CRM_CRC_PERIPH_CLOCK, TRUE);
-    
-    extend_SRAM();
-  
-    system_clock_config();
-
-    delay_init();
-                    
-    xTaskCreate(init_task, "init_task", 10*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
-        
-    vTaskStartScheduler();
-     
-    while (1) {}
-}
-
-
-void init_task(void *argument)
-{
-// -------------------------------------------------------------------------- //    
-// Software watchdog
-  
-    gpio_wdt_init();
-    xTaskCreate(soft_wdt, "soft_wdt", configMINIMAL_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL);    
-    
-// -------------------------------------------------------------------------
-// CLI
-    
-    sbsTerminal.configure();
-    terminalUsartBridge.configure();    
-    
-// -------------------------------------------------------------------------- //    
-// Настройки. Загрузка и проверка.
-
-    // Мьютекс для работы с настройками
-    init_settings(); 
-    
-    // Системные настройки и копия
-    sys_settings_load(&sys_settings);
-    memcpy(&temp_sys_settings, &sys_settings, sizeof(sys_settings_t));
-    
-    // Основные настройки
-    settings_load(&settings);
-    
-    // Настройки параметров порта Modbus
-    settings_set_modbus_params(settings.com_settings.mb_port);
-    
-#if 0
-// Только для теста    
-    settings_set_all_default();
-    settings_save(&settings);
-#endif
-    
-// -------------------------------------------------------------------------- //    
-// Безопасный режим, входы, выходы
-    
-#if defined (MDIO_88) || (MAO_4)
-    //settings.save_mode = false;
-    save_mode_init();
-#endif
-    
-// -------------------------------------------------------------------------- //
-// Включить тактирование портов
-    
-    io_port_enable();
-
-// -------------------------------------------------------------------------- //            
-// Цифровые входы/выходы
-
-#if defined (MDIO_88)
-    
-    // Инициализация GPIO, EXTI, TIM для цифровых входов
-    di_init();
-    
-    // 
-    do_init();
-    xTaskCreate(di_task, "input_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
-    
-#endif
-    
-#if defined (MAI_12)    
-    
-    ai_init();    
-    xTaskCreate(adc_task, "adc_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
-    
-#endif    
-    
-#if defined (MAO_4)    
-    
-    ao_init();
-    xTaskCreate(dac_task, "dac_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
-    
-#endif 
-    
-// -------------------------------------------------------------------------- //
-// Кнопки [SET, RESET]
-    
-    button_init();
-    xTaskCreate(button_task, "button_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
-    
-// -------------------------------------------------------------------------- //
-// Uptime    
-    
-    uptime_init();
-    
-// -------------------------------------------------------------------------- //
-// RTC    
-    
-    TM_RTC_Init();
-    rtc_subtim_init();
-    
-// -------------------------------------------------------------------------- //    
-// Мультиплексор
-#if 1    
-    mux_gpio_init();
-    xTaskCreate(mux_task, "mux_task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
-#endif    
-// -------------------------------------------------------------------------- //        
-// Modbus    
-    
-    mb_init();
-    
-// -------------------------------------------------------------------------- //        
-// Сброс счетчика попыток загрузок
-    
-    update_reset_boot_try();    
-    
-// -------------------------------------------------------------------------- //    
-// Считать ревизию платы (состояние пинов)
-    
-    gpio_update_rev();
-    
-// -------------------------------------------------------------------------- //    
-// SPI flash, журнал событий, архив
-#if 0
-    common_spi_init();
-    spi_flash_init();
-    
-    log_init(false);
-#endif    
-// -------------------------------------------------------------------------- //
-// Статистика FreeRTOS
-    
-    utl_stat_timer_init();
-    
-// -------------------------------------------------------------------------- //
-// EVENT. Обновление FW.
-#if 0    
-    uint16_t update_status = bpr_data_read(BACKUP_UPDATE_STATUS);
-    
-    if (update_status == IAP_UPDATE_OK)
-        log_add_entry(LOG_UPDATE_FW, LOG_EVENT_STATE_OK, 0, atof(FW_VERSION));
-    else if (update_status == IAP_UPDATE_ERROR)
-        log_add_entry(LOG_UPDATE_FW, LOG_EVENT_STATE_ERR, 0, atof(FW_VERSION));
-        
-    bpr_data_write(BACKUP_UPDATE_STATUS, IAP_UPDATE_NO);
-
-// -------------------------------------------------------------------------- //
-// EVENT. Включение питания/перезагрузка.    
-    
-    log_add_entry(LOG_SYSTEM_BOOT, (log_event_state_t)0, 0, 0);
-#endif   
-// -------------------------------------------------------------------------- //    
-// USB (RNDIS class)
-#ifdef USB_RNDIS    
-    usb_clock48m_select(USB_CLK_HEXT);
-    crm_periph_clock_enable(CRM_USB_PERIPH_CLOCK, TRUE);
-    usb_init();
-    usb_eth_init();
-#endif 
-    
-
-    
-// -------------------------------------------------------------------------- //        
-// Тесты
-
-    //usb_eth_init();
-    //sys_clear();
-    //mux_led_test_init();
-    //pwm_test();
-    
-    // -------------------------------------------------------------------------- //    
-// Сдвиговые регистры и мультиплексоры    
-    //sh_init();
-    
-// Тесты аналоговых входов    
-    //ai_connect_test();
-    //ai_mode_test();
-    //ai_connect_channel(V_ISO);  
-    //ai_connect_channel(AN_INP_1);  
-    //ai_connect_channel(AN_INP_7);  
-    
-// -------------------------------------------------------------------------- //    
-// DAC    
-/*    
-    dac_gpio_init();
-    dac_test(CH_DAC_1, 30000);  
-*/    
-/*    
-    dac_test(CH_DAC_2, 10000);  
-    dac_test(CH_DAC_3, 10000);
-    dac_test(CH_DAC_4, 10000);  
-*/    
-/*    
-    dac_test(CH_DAC_1, 10000);  
-    dac_test(CH_DAC_2, 10000);  
-    dac_test(CH_DAC_3, 10000);
-    dac_test(CH_DAC_4, 10000);  
-*/  
-    
-#if 0
-    // Настройки по умолчанию 
-    settings_set_all_default();
-    settings_save(&settings);
-#endif    
-    
-// -------------------------------------------------------------------------- //        
-// Отдельный таск для предварительных тестов
-    
-    // Разное
-    //xTaskCreate(test_hw_task, "hw_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
-    
-    // Тесты GPIO
-    //xTaskCreate(test_gpio, "gpio_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
-    
-    //ai_processing();
-    
-    //average_filter_init();
-    
-// -------------------------------------------------------------------------- //
-// Удаляем стартовую задачу 
-           
-    vTaskDelete(NULL);
-}
-
+#include "at32f403a_407.h"
+#include "at32f403a_407_board.h"
+#include "at32f403a_407_clock.h"
+#include "common_config.h"
+#include "FreeRTOS.h"
+#include "task.h"
+#include "queue.h"
+#include "semphr.h"
+extern "C" {
+#include "usb_eth.h"
+#include "mux.h"
+#include "misc.h"
+#include "spi_common.h"
+#include "user_fatfs.h"
+#include "spi_flash.h"
+#include "usb_eth.h"
+#include "extended_sram.h"
+#include "modbus.h"
+#include "common_gpio.h"
+#include "io.h"
+#include "sys_api.h"
+#include "settings_api.h"
+#include "update.h"
+#include "uptime.h"
+#include "rtc.h"
+#include "mb.h"
+#include "io_utils.h"
+#include "digital_input.h"
+#include "digital_output.h"
+#include "buttons.h"
+#include "adc_transport.h"
+#include "shift_reg.h"
+#include "analog_input.h"
+#include "analog_output.h"
+#include "dac_transport.h"
+#include "log.h"
+#include "swap.h"
+#include "utility.h"
+#include "soft_test.h"
+#include "soft_wdt.h"
+#include "usb_clock.h"
+#include "filter.h"
+#include "modbus_ai_params.h"
+#include "rtc_battery.h"
+}
+#include "terminal_sbs.h"
+#include "terminal_usartbridge.h"
+#include <stdio.h>
+#include <stdbool.h>
+#include <string.h>
+#include <stdlib.h>
+
+
+void init_task(void *argument);
+
+
+//
+int main(void)
+{
+    __disable_irq();
+    nvic_vector_table_set(NVIC_VECTTAB_FLASH, 0x08021000);
+    nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
+	__enable_irq();
+  
+    crm_periph_clock_enable(CRM_CRC_PERIPH_CLOCK, TRUE);
+    
+    extend_SRAM();
+  
+    system_clock_config();
+
+    delay_init();
+                    
+    xTaskCreate(init_task, "init_task", 10*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
+        
+    vTaskStartScheduler();
+     
+    while (1) {}
+}
+
+
+void init_task(void *argument)
+{
+// -------------------------------------------------------------------------- //    
+// Software watchdog
+  
+    gpio_wdt_init();
+    xTaskCreate(soft_wdt, "soft_wdt", configMINIMAL_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL);    
+    
+// -------------------------------------------------------------------------
+// CLI
+    
+    sbsTerminal.configure();
+    terminalUsartBridge.configure();    
+    
+// -------------------------------------------------------------------------- //    
+// Настройки. Загрузка и проверка.
+
+    // Мьютекс для работы с настройками
+    init_settings(); 
+    
+    // Системные настройки и копия
+    sys_settings_load(&sys_settings);
+    memcpy(&temp_sys_settings, &sys_settings, sizeof(sys_settings_t));
+    
+    // Основные настройки
+    settings_load(&settings);
+    
+    // Настройки параметров порта Modbus
+    settings_set_modbus_params(settings.com_settings.mb_port);
+    
+#if 0
+// Только для теста    
+    settings_set_all_default();
+    settings_save(&settings);
+#endif
+    
+// -------------------------------------------------------------------------- //    
+// Безопасный режим, входы, выходы
+    
+#if defined (MDIO_88) || (MAO_4)
+    //settings.save_mode = false;
+    save_mode_init();
+#endif
+    
+// -------------------------------------------------------------------------- //
+// Включить тактирование портов
+    
+    io_port_enable();
+
+// -------------------------------------------------------------------------- //            
+// Цифровые входы/выходы
+
+#if defined (MDIO_88)
+    
+    // Инициализация GPIO, EXTI, TIM для цифровых входов
+    di_init();
+    
+    // 
+    do_init();
+    xTaskCreate(di_task, "input_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
+    
+#endif
+    
+#if defined (MAI_12)    
+    
+    ai_init();    
+    xTaskCreate(adc_task, "adc_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
+    
+#endif    
+    
+#if defined (MAO_4)    
+    
+    ao_init();
+    xTaskCreate(dac_task, "dac_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
+    
+#endif 
+    
+// -------------------------------------------------------------------------- //
+// Кнопки [SET, RESET]
+    
+    button_init();
+    xTaskCreate(button_task, "button_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
+    
+// -------------------------------------------------------------------------- //
+// Uptime    
+    
+    uptime_init();
+    
+// -------------------------------------------------------------------------- //
+// RTC, ADC для измерения напряжения батареи.
+    
+    TM_RTC_Init();
+    rtc_subtim_init();
+    
+    adc_battery_init();
+    xTaskCreate(adc_battery_task, "adc_battery_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
+    
+// -------------------------------------------------------------------------- //    
+// Мультиплексор
+#if 1    
+    mux_gpio_init();
+    xTaskCreate(mux_task, "mux_task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
+#endif    
+// -------------------------------------------------------------------------- //        
+// Modbus    
+    
+    mb_init();
+    
+// -------------------------------------------------------------------------- //        
+// Сброс счетчика попыток загрузок
+    
+    update_reset_boot_try();    
+    
+// -------------------------------------------------------------------------- //    
+// Считать ревизию платы (состояние пинов)
+    
+    gpio_update_rev();
+    
+// -------------------------------------------------------------------------- //    
+// SPI flash, журнал событий, архив
+#if 0
+    common_spi_init();
+    spi_flash_init();
+    
+    log_init(false);
+#endif    
+// -------------------------------------------------------------------------- //
+// Статистика FreeRTOS
+    
+    utl_stat_timer_init();
+    
+// -------------------------------------------------------------------------- //
+// EVENT. Обновление FW.
+#if 0    
+    uint16_t update_status = bpr_data_read(BACKUP_UPDATE_STATUS);
+    
+    if (update_status == IAP_UPDATE_OK)
+        log_add_entry(LOG_UPDATE_FW, LOG_EVENT_STATE_OK, 0, atof(FW_VERSION));
+    else if (update_status == IAP_UPDATE_ERROR)
+        log_add_entry(LOG_UPDATE_FW, LOG_EVENT_STATE_ERR, 0, atof(FW_VERSION));
+        
+    bpr_data_write(BACKUP_UPDATE_STATUS, IAP_UPDATE_NO);
+
+// -------------------------------------------------------------------------- //
+// EVENT. Включение питания/перезагрузка.    
+    
+    log_add_entry(LOG_SYSTEM_BOOT, (log_event_state_t)0, 0, 0);
+#endif   
+// -------------------------------------------------------------------------- //    
+// USB (RNDIS class)
+#ifdef USB_RNDIS    
+    usb_clock48m_select(USB_CLK_HEXT);
+    crm_periph_clock_enable(CRM_USB_PERIPH_CLOCK, TRUE);
+    usb_init();
+    usb_eth_init();
+#endif 
+    
+
+    
+// -------------------------------------------------------------------------- //        
+// Тесты
+
+    //usb_eth_init();
+    //sys_clear();
+    //mux_led_test_init();
+    //pwm_test();
+    
+    // -------------------------------------------------------------------------- //    
+// Сдвиговые регистры и мультиплексоры    
+    //sh_init();
+    
+// Тесты аналоговых входов    
+    //ai_connect_test();
+    //ai_mode_test();
+    //ai_connect_channel(V_ISO);  
+    //ai_connect_channel(AN_INP_1);  
+    //ai_connect_channel(AN_INP_7);  
+    
+// -------------------------------------------------------------------------- //    
+// DAC    
+/*    
+    dac_gpio_init();
+    dac_test(CH_DAC_1, 30000);  
+*/    
+/*    
+    dac_test(CH_DAC_2, 10000);  
+    dac_test(CH_DAC_3, 10000);
+    dac_test(CH_DAC_4, 10000);  
+*/    
+/*    
+    dac_test(CH_DAC_1, 10000);  
+    dac_test(CH_DAC_2, 10000);  
+    dac_test(CH_DAC_3, 10000);
+    dac_test(CH_DAC_4, 10000);  
+*/  
+    
+#if 0
+    // Настройки по умолчанию 
+    settings_set_all_default();
+    settings_save(&settings);
+#endif    
+    
+// -------------------------------------------------------------------------- //        
+// Отдельный таск для предварительных тестов
+    
+    // Разное
+    //xTaskCreate(test_hw_task, "hw_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
+    
+    // Тесты GPIO
+    //xTaskCreate(test_gpio, "gpio_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
+    
+    //ai_processing();
+    
+    //average_filter_init();
+    
+// -------------------------------------------------------------------------- //
+// Удаляем стартовую задачу 
+           
+    vTaskDelete(NULL);
+}
+

二进制
output/fw.bin


文件差异内容过多而无法显示
+ 481 - 481
project/ewarm/iap/iap.dep


文件差异内容过多而无法显示
+ 660 - 656
project/ewarm/module_universal_io.dep


+ 3 - 0
project/ewarm/module_universal_io.ewp

@@ -2819,6 +2819,9 @@
             <file>
                 <name>$PROJ_DIR$\..\..\shared\rtc\rtc.c</name>
             </file>
+            <file>
+                <name>$PROJ_DIR$\..\..\shared\rtc\rtc_battery.c</name>
+            </file>
         </group>
         <group>
             <name>sys</name>

+ 3 - 0
project/ewarm/module_universal_io.ewt

@@ -3027,6 +3027,9 @@
             <file>
                 <name>$PROJ_DIR$\..\..\shared\rtc\rtc.c</name>
             </file>
+            <file>
+                <name>$PROJ_DIR$\..\..\shared\rtc\rtc_battery.c</name>
+            </file>
         </group>
         <group>
             <name>sys</name>

+ 100 - 0
shared/rtc/rtc_battery.c

@@ -0,0 +1,100 @@
+#include "rtc_battery.h"
+#include "FreeRTOS.h"
+#include "task.h"
+#include <stdio.h>
+
+
+#define ADV_FACTOR      0.000805
+
+float bat_voltage;
+
+
+//
+void adc_battery_gpio_init(void)
+{
+    gpio_init_type gpio_initstructure;
+        
+    crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
+    crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);
+ 
+    gpio_default_para_init(&gpio_initstructure);
+    
+    // VBAT RTC
+    gpio_initstructure.gpio_mode           = GPIO_MODE_ANALOG;  
+    gpio_initstructure.gpio_pins           = GPIO_PINS_4;
+    gpio_init(GPIOA, &gpio_initstructure);
+    
+    // EN_MEAS_V_BAT
+    gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;  
+    gpio_initstructure.gpio_pull           = GPIO_PULL_NONE;  
+    gpio_initstructure.gpio_mode           = GPIO_MODE_OUTPUT;  
+    gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
+    gpio_initstructure.gpio_pins           = GPIO_PINS_6;
+    gpio_init(GPIOC, &gpio_initstructure);
+}
+
+
+//
+void adc_battery_init(void)
+{
+    adc_base_config_type adc_base_struct;
+    
+    adc_battery_gpio_init();
+    
+    crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
+    crm_adc_clock_div_set(CRM_ADC_DIV_2);
+    
+    nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
+    nvic_irq_enable(ADC1_2_IRQn, 5, 0);
+        
+    adc_combine_mode_select(ADC_INDEPENDENT_MODE);
+    
+    adc_base_default_para_init(&adc_base_struct);
+    
+    adc_base_struct.sequence_mode = TRUE;
+    adc_base_struct.repeat_mode = FALSE;
+    adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;
+    adc_base_struct.ordinary_channel_length = 1;
+    adc_base_config(ADC1, &adc_base_struct);
+    
+    adc_ordinary_channel_set(ADC1, ADC_CHANNEL_4,  1, ADC_SAMPLETIME_239_5);
+    
+    adc_ordinary_conversion_trigger_set(ADC1, ADC12_ORDINARY_TRIG_SOFTWARE, TRUE);
+    
+    adc_dma_mode_enable(ADC1, FALSE);
+    adc_tempersensor_vintrv_enable(FALSE);
+    
+    adc_flag_clear(ADC1, ADC_CCE_FLAG);
+    
+    adc_interrupt_enable(ADC1, ADC_CCE_INT, TRUE);
+    
+    adc_enable(ADC1, TRUE);
+    adc_calibration_init(ADC1);
+    
+    while(adc_calibration_init_status_get(ADC1));
+    adc_calibration_start(ADC1);
+    while(adc_calibration_status_get(ADC1));
+}
+
+
+//
+void adc_battery_task(void *params)
+{
+    for (;;)
+    {
+        MEAS_VBAT_ENABLE;
+        vTaskDelay(100);
+        adc_ordinary_software_trigger_enable(ADC1, TRUE);
+        vTaskDelay(360000);
+    }
+}
+
+
+//
+void ADC1_2_IRQHandler(void)
+{
+    adc_flag_clear(ADC1, ADC_CCE_FLAG);
+    bat_voltage = (float)adc_combine_ordinary_conversion_data_get()*ADV_FACTOR;
+    //printf("ADC: %f\r\n", bat_voltage);
+    MEAS_VBAT_DISABLE;
+}

+ 26 - 0
shared/rtc/rtc_battery.h

@@ -0,0 +1,26 @@
+#ifndef __RTC_BATTERY_H
+#define __RTC_BATTERY_H
+
+
+#include "at32f403a_407.h"
+
+
+#define MEAS_VBAT_ENABLE        gpio_bits_set(GPIOC, GPIO_PINS_6)
+
+#define MEAS_VBAT_DISABLE       gpio_bits_reset(GPIOC, GPIO_PINS_6)
+
+
+
+//
+void adc_battery_gpio_init(void);
+
+//
+void adc_battery_init(void);
+
+//
+void adc_battery_task(void *params);
+
+
+extern float bat_voltage;
+
+#endif // __RTC_BATTERY_H

二进制
tools/__pycache__/mb_registers.cpython-312.pyc


二进制
tools/__pycache__/modbus.cpython-312.pyc


二进制
tools/__pycache__/sys_params.cpython-312.pyc


+ 7 - 6
tools/digital_io.py

@@ -216,9 +216,9 @@ def main():
 
     '''Тесты отдельного модуля DIO'''
     # dio.sys.get_system_vars()
-    print(dio.sys.get_save_mode())
-    print(dio.sys.get_save_delay())
-
+    # print(dio.sys.get_save_mode())
+    # print(dio.sys.get_save_delay())
+    
     '''Сохранить информацию о модуле'''
     # dio.sys.set_info('This is super DIO!')
 
@@ -253,12 +253,13 @@ def main():
     #     sleep(1)
 
     '''Системные переменные и параметры'''
-    # dev_tester.sys.get_system_vars()
-
+    # dio.sys.get_system_vars()
+    # print(dio.sys.get_bat_votage())
 
     ''' Установить текущее время с учетом часового пояса'''
     # dev.sys.set_rtc()     
-    
+
+    # dio.sys.get_system_vars()
 
     '''Лог и архив. Настройки лога.'''
     # dev.log.get_log_info()

+ 5 - 4
tools/mb_registers.py

@@ -56,7 +56,8 @@ class SysReg(Enum):
     COMMAND     = 0x0800 # Команды управления
     UPTIME      = 0x0801 # Uptime
     RTC         = 0x0803 # RTC
-    ERR         = 0x0807 # Состояние модуля
-    INFO        = 0x0809 # Текстовая строка (пользовательская информация)
-    SAVE_MODE   = 0x080A # Безопасный режим работы (0-выкл, 1-вкл)
-    SAVE_DELAY  = 0x080B # Время до перехода в безопасный режим
+    BAT_VOLTAGE = 0x0807 # Напряжение на батарее RTC
+    ERR         = 0x0809 # Состояние модуля
+    INFO        = 0x080B # Текстовая строка (пользовательская информация)
+    SAVE_MODE   = 0x081B # Безопасный режим работы (0-выкл, 1-вкл)
+    SAVE_DELAY  = 0x081C # Время до перехода в безопасный режим

+ 4 - 0
tools/modbus.py

@@ -154,6 +154,10 @@ class Modbus(ModbusMixin):
         """Read 64-bit integer from holding registers"""
         return struct.unpack('>Q', self.read_holding_registers_raw(address, 4))[0]        
 
+    def read_float_holding(self, address: int) -> float:
+        """Read float integer from two holding registers"""
+        return struct.unpack('>f', self.read_holding_registers_raw(address, 2))[0]
+
     # 0x10
     def write_holding_registers_raw(self, address:int, values: bytes):
         """Write 16-bit integers to holding registers on device"""

+ 3 - 0
tools/sys_params.py

@@ -119,6 +119,9 @@ class IO_SysParams:
     def get_rtc(self):
         return self.modbus.read_uint64_holding(SysReg.RTC.value)
 
+    def get_bat_votage(self):
+        return self.modbus.read_float_holding(SysReg.BAT_VOLTAGE.value)
+
     def set_rtc(self):
         """Установить текущее время"""
         t = int((time.time() + self.utc_offset) * 1000)

部分文件因为文件数量过多而无法显示