Sfoglia il codice sorgente

Добавил WDT. Добавил тестовые регистры.

TelenkovDmitry 1 anno fa
parent
commit
e0fbf02fe2

BIN
doc/~$_модули_входов_выходов_редакция_4.doc


+ 38 - 0
fw/modules/io/common_gpio.c

@@ -0,0 +1,38 @@
+#include "at32f403a_407.h"
+#include "common_gpio.h"
+#include "FreeRTOS.h"
+#include "task.h"
+#include <stdbool.h>
+
+
+//
+void cm_gpio_init(void)
+{
+    gpio_init_type gpio_initstructure;
+        
+    crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);
+    
+    // WDT
+    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_7;
+    gpio_init(GPIOC, &gpio_initstructure); 
+}
+
+
+//
+void extern_wdt_togle(void)
+{
+    static bool toogle = false;
+    
+    if (!toogle) {
+        toogle = true;
+        gpio_bits_set(GPIOC, GPIO_PINS_7);
+    }
+    else {
+        toogle = false;
+        gpio_bits_reset(GPIOC, GPIO_PINS_7);
+    }
+}

+ 12 - 0
fw/modules/io/common_gpio.h

@@ -0,0 +1,12 @@
+#ifndef __COMMON_GPIO_H
+#define __COMMON_GPIO_H
+
+//
+void cm_gpio_init(void);
+
+//
+void extern_wdt_togle(void);
+
+
+#endif  // __COMMON_GPIO_H
+

+ 4 - 3
fw/modules/modbus/modbus.c

@@ -6,6 +6,7 @@
 #include "mbport.h"
 #include "mbrtu.h"
 #include "tim_delay.h"
+#include "modbus_params.h"
 #include <stdio.h>
 #include <string.h>
 #include <stdbool.h>
@@ -41,7 +42,7 @@ void mb_init(void)
     unsigned int stop_bits = 1;
 	const UCHAR ucSlaveID[] = {0xAA, 0xBB, 0xCC};
     
-	//mb_init_params();
+	mb_init_params();
 
     mb_helper_tim_init(baud);
     eMBInit(MB_RTU, mb_addr, 4, baud, par, stop_bits);
@@ -265,7 +266,7 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
     
 	iRegIndex = (int)(usAddress - usRegHoldingStart);
 
-#if 0    
+#if 1    
 	switch (eMode)
 	{
 		case MB_REG_READ :
@@ -328,7 +329,7 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 eMBException
 eMBFuncReportSlaveID( UCHAR * pucFrame, USHORT * usLen )
 {
-#if 0
+#if 1
     mb_package_flag = true;
     
 	*usLen = mb_get_info(&pucFrame[1]) + 3;

+ 200 - 0
fw/modules/modbus/modbus_params.c

@@ -0,0 +1,200 @@
+#include "at32f403a_407.h"
+#include "modbus_params.h"
+#include <string.h>
+
+
+mb_param_t mb_param[MB_PARAM_MAX];
+uint16_t psw; // Пароль для установки системных настроек
+bool psw_ok = false;
+bool set_sys_settings_flag = false;
+//sys_settings_t temp_sys_settings;
+uint16_t temp_modbus_port;
+uint16_t temp_reley;
+const float null_float = 0.0;
+
+
+uint32_t u32_param = 123456789;
+uint16_t u16_param = 32768;
+float f_param = 1.23456;
+
+
+
+//
+void mb_init_params(void)
+{
+    mb_param[0].reg = 0x30;
+	mb_param[0].size = 2;
+	mb_param[0].param = (uint8_t*)&u32_param;
+	mb_param[0].set_handler = NULL;
+    mb_param[0].check_handler = mb_check_dummy;
+    
+    mb_param[1].reg = 0x32;
+	mb_param[1].size = 1;
+	mb_param[1].param = (uint8_t*)&u16_param;
+	mb_param[1].set_handler = NULL;
+    mb_param[1].check_handler = mb_check_dummy;
+    
+    mb_param[2].reg = 0x34;
+	mb_param[2].size = 2;
+	mb_param[2].param = (uint8_t*)&f_param;
+	mb_param[2].set_handler = NULL;
+    mb_param[2].check_handler = mb_check_dummy;
+}
+
+// Возвращает размер параметра в регистрах
+bool mb_find_param(uint16_t reg, uint16_t *index, uint16_t *size)
+{
+	for (uint16_t i = 0; i < MB_PARAM_MAX; i++)
+	{
+		if (mb_param[i].reg == reg)
+		{
+			*index = i;
+			*size = mb_param[i].size;
+			return true;
+		}
+	}
+	return false;
+}
+
+
+//
+mb_delay_action_t mb_set_param(uint8_t *buf, uint16_t index)
+{
+	uint8_t *ptr = mb_param[index].param;
+
+    // Если параметр только для чтения
+    if (mb_param[index].check_handler == NULL)
+        return MB_NO_ACTION;
+    
+	for (uint16_t i = 0; i < 2*mb_param[index].size; i++)
+	{
+		*ptr = buf[2*mb_param[index].size - 1 - i];
+		ptr++;
+	}
+  
+/*    
+    if (mb_param[index].check_handler != NULL)
+        mb_param[index].check_handler();
+*/    
+    
+    mb_param[index].check_handler();
+    
+    if (mb_param[index].set_handler != NULL)
+        return mb_param[index].set_handler();
+    else
+        return MB_NO_ACTION;
+    
+/*    
+    if (mb_param[index].f_activity)
+        return mb_param[index].set_handler();
+    else
+        return MB_NO_ACTION;
+*/    
+}
+
+
+//
+void mb_get_param(uint8_t *buf, uint16_t index)
+{
+	uint8_t *ptr = mb_param[index].param + 2*mb_param[index].size - 1;
+
+	for (uint16_t i = 0; i < 2*mb_param[index].size; i++)
+	{
+		*buf = *ptr;
+		buf++;
+		ptr--;
+	}
+
+}
+
+
+
+
+//
+uint8_t mb_get_info(uint8_t *buf)
+{
+	char id_str[9] = {0};
+    char model[6] = {0};
+	uint32_t id_word;
+	uint8_t ret = 0;	// длина пакета
+	uint8_t len;
+
+    len = strlen("Hello world");
+    *buf++ = len;
+    strcpy(buf, "Hello world");
+    buf += len;
+    ret = 1 + len;
+      
+#if 0    
+	// ------------------------------------------------------------------- //
+	// Model
+	// ------------------------------------------------------------------- //
+    sprintf(model, "%u", sys_settings.model);
+    len = strlen(model); 
+    *buf++ = len; // Model len
+    memcpy(buf, model, len);
+    buf += len;
+    ret = 1 + len;
+
+	// ------------------------------------------------------------------- //
+	// FW version
+	// ------------------------------------------------------------------- //
+	*buf++ = 8; // FW version len
+	memcpy(buf, sys_settings.fw_version, 8);
+	buf += 8;
+	ret += 9;
+
+	// ------------------------------------------------------------------- //
+	// Stm ID
+	// ------------------------------------------------------------------- //
+	*buf++ = 24; // STM ID len
+	id_word = HAL_GetUIDw0();
+	sprintf(id_str, "%08X", id_word);
+	len = strlen(id_str);
+	memcpy(buf, id_str, len);
+	buf += len;
+	ret += len;
+	memset(id_str, 0, 9);
+		
+	id_word = HAL_GetUIDw1();
+	sprintf(id_str, "%08X", id_word);
+	len = strlen(id_str);
+	memcpy(buf, id_str, len);
+	buf += len;
+	ret += len;
+	memset(id_str, 0, 9);
+	
+	id_word = HAL_GetUIDw2();
+	sprintf(id_str, "%08X", id_word);
+	len = strlen(id_str);
+	memcpy(buf, id_str, len);
+	buf += len;
+	ret += len;
+
+	// ------------------------------------------------------------------- //	
+	// Серийник
+	// ------------------------------------------------------------------- //
+	id_word = sys_settings.serial;
+	sprintf(id_str, "%u", id_word);
+	len = strlen(id_str);
+	*buf++ = len;
+	memcpy(buf, id_str, len);
+	ret += len;
+#endif
+	return ret;
+}
+
+
+
+
+// -------------------------------------------------------------------------- //
+//                      Проверка параметров                                   //
+// -------------------------------------------------------------------------- //
+
+//
+void mb_check_dummy(void)
+{
+}
+
+
+

+ 267 - 0
fw/modules/modbus/modbus_params.h

@@ -0,0 +1,267 @@
+#ifndef __MODBUS_PARAMS_H
+#define __MODBUS_PARAMS_H
+
+#include "mb.h"
+#include "mbport.h"
+#include "modbus.h"
+//#include "settings_sys.h"
+
+#include <stdbool.h>
+
+
+#define MB_PARAM_MAX			3
+
+
+//
+typedef struct {
+
+	uint16_t reg;
+	uint16_t size;
+	uint8_t *param;
+	bool f_activity;	
+	mb_delay_action_t (*set_handler)(void);
+    void (*check_handler)(void);
+
+} mb_param_t;
+
+
+//
+void mb_init_params(void);
+
+// Возвращает размер параметра в регистрах
+bool mb_find_param(uint16_t reg, uint16_t *index, uint16_t *size);
+
+//
+mb_delay_action_t mb_set_param(uint8_t *buf, uint16_t index);
+
+//
+void mb_get_param(uint8_t *buf, uint16_t index);
+
+//
+uint8_t mb_get_info(uint8_t *buf);
+
+// Установка адреса. Запрос без параметров.
+bool mb_set_addr(uint8_t *buf, uint8_t *addr);
+
+// Установка адреса по ID
+bool mb_set_addr_id(uint8_t *buf, uint8_t *addr);
+
+// Установка адреса по серийному номеру
+bool mb_set_addr_serial(uint8_t *buf, uint8_t *addr);
+
+
+// -------------------------------------------------------------------------- //
+//                          Установка параметров
+// -------------------------------------------------------------------------- //
+
+//
+mb_delay_action_t mb_set_pwm_freq_1(void);
+
+//
+mb_delay_action_t mb_set_pwm_freq_2(void);
+
+//
+mb_delay_action_t mb_set_pwm_freq_3(void);
+
+//
+mb_delay_action_t mb_set_duty(void);
+
+//
+mb_delay_action_t mb_set_port(void);
+
+//
+mb_delay_action_t mb_password(void);
+
+//
+mb_delay_action_t mb_sys_settings_save(void);
+
+//
+mb_delay_action_t mb_control(void);
+
+//
+mb_delay_action_t mb_relay(void);
+
+//
+mb_delay_action_t mb_led(void);
+
+
+// -------------------------------------------------------------------------- //
+//                      Проверка параметров                                   //
+// -------------------------------------------------------------------------- //
+
+//
+void mb_check_dummy(void);
+
+// ---------------------------------------------------------------------- //
+// Каналы управления вентиляторами
+
+//
+void mb_check_pwm_freq_1(void);
+
+//
+void mb_check_pwm_freq_2(void);
+
+//
+void mb_check_pwm_freq_3(void);
+
+//
+void mb_check_tacho_speed_1(void);
+
+//
+void mb_check_tacho_speed_2(void);
+
+//
+void mb_check_tacho_speed_3(void);
+
+//
+void mb_check_noise_limit_1(void);
+
+//
+void mb_check_noise_limit_2(void);
+
+//
+void mb_check_noise_limit_3(void);
+
+//
+void mb_check_crash_val_1(void);
+
+//
+void mb_check_crash_val_2(void);
+
+//
+void mb_check_crash_val_3(void);
+
+//
+void mb_check_pulse_number_1(void);
+
+//
+void mb_check_pulse_number_2(void);
+
+//
+void mb_check_pulse_number_3(void);
+
+//
+void mb_check_duty_1(void);
+
+//
+void mb_check_duty_2(void);
+
+//
+void mb_check_duty_3(void);
+
+// 
+void mb_check_pwm_type_1(void);
+
+// 
+void mb_check_pwm_type_2(void);
+
+// 
+void mb_check_pwm_type_3(void);
+
+// ---------------------------------------------------------------------- //
+// Конфигурация подключений
+
+//
+void mb_check_output_cnt(void);
+
+//
+void mb_check_input_4(void);
+
+//
+void mb_check_input_5(void);
+
+//
+void mb_check_input_6(void);
+
+// ---------------------------------------------------------------------- //
+// Температура
+
+//
+void mb_check_temp_alg(void);
+
+//
+void mb_check_temp_low_limit(void);
+
+//
+void mb_check_temp_low_hyst(void);
+
+// ---------------------------------------------------------------------- //
+// Алгоритм управления вентиляторами
+
+//
+void mb_check_temp_limit(void);
+
+//
+void mb_check_alg_max_limit(void);
+
+//
+void mb_check_alg_max_hyst(void);
+
+//
+void mb_check_con_timeout(void);
+
+//
+void mb_check_max_limit_hyst(void);
+
+// ---------------------------------------------------------------------- //
+// PID регулятор
+
+//
+void mb_check_p_factor(void);
+
+//
+void mb_check_i_factor(void);
+
+//
+void mb_check_d_factor(void);
+
+// ---------------------------------------------------------------------- //
+// Дискретные входы
+
+//
+void mb_check_input_1(void);
+
+//
+void mb_check_input_2(void);
+
+// ---------------------------------------------------------------------- //
+// Реле
+
+//
+void mb_check_relay(void);
+
+// ---------------------------------------------------------------------- //
+// Время
+
+void mb_check_time(void);
+
+// ---------------------------------------------------------------------- //
+// Системные переменные
+
+//
+void mb_check_model(void);
+
+//
+void mb_check_proddate(void);
+
+//
+void mb_check_serial(void);
+
+//
+void mb_check_fw_version(void);
+
+//
+void mb_check_state(void);
+
+//
+void mb_check_reley(void);
+
+
+/*
+extern bool psw_ok;
+extern bool set_sys_settings_flag;
+extern sys_settings_t temp_sys_settings;
+extern uint16_t temp_modbus_port;
+*/
+
+#endif // __MODBUS_PARAMS_H

+ 20 - 0
fw/user/main.c

@@ -15,6 +15,7 @@
 #include "usb_eth.h"
 #include "extended_sram.h"
 #include "modbus.h"
+#include "common_gpio.h"
 #include <stdio.h>
 #include <stdbool.h>
 #include <string.h>
@@ -23,6 +24,7 @@
 
 void init_task(void *argument);
 void test_hw_task(void *argument);
+void soft_wdt(void *params);
 
 void usb_clock48m_select(usb_clk48_s clk_s);
 
@@ -43,6 +45,8 @@ int main(void)
     
     uart_print_init(115200);
     
+    cm_gpio_init();
+    
     printf("\n\n\n\nModule universal IO [FW %s] loading....\r\n\n", VERSION);
         
     //
@@ -51,6 +55,8 @@ int main(void)
 #if 1
     taskENTER_CRITICAL();      
     
+    xTaskCreate(soft_wdt, "soft_wdt", configMINIMAL_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL);    
+    
     xTaskCreate(init_task, "init_task", 10*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
     
     xTaskCreate(test_hw_task, "hw_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
@@ -107,6 +113,20 @@ void test_hw_task(void *argument)
 }
 
 
+//
+void soft_wdt(void *params)
+{
+    (void)params;
+    
+    for (;;)
+    {
+        extern_wdt_togle(); // extern WDT
+        vTaskDelay(500);
+    }
+}
+
+
+
 //
 void usb_clock48m_select(usb_clk48_s clk_s)
 {

File diff suppressed because it is too large
+ 472 - 444
project/ewarm/module_universal_io.dep


+ 6 - 0
project/ewarm/module_universal_io.ewp

@@ -2152,6 +2152,9 @@
             <name>modules</name>
             <group>
                 <name>io</name>
+                <file>
+                    <name>$PROJ_DIR$\..\..\fw\modules\io\common_gpio.c</name>
+                </file>
                 <file>
                     <name>$PROJ_DIR$\..\..\fw\modules\io\mux.c</name>
                 </file>
@@ -2167,6 +2170,9 @@
                 <file>
                     <name>$PROJ_DIR$\..\..\fw\modules\modbus\modbus.c</name>
                 </file>
+                <file>
+                    <name>$PROJ_DIR$\..\..\fw\modules\modbus\modbus_params.c</name>
+                </file>
             </group>
             <group>
                 <name>spi_flash</name>

+ 6 - 0
project/ewarm/module_universal_io.ewt

@@ -2375,6 +2375,9 @@
             <name>modules</name>
             <group>
                 <name>io</name>
+                <file>
+                    <name>$PROJ_DIR$\..\..\fw\modules\io\common_gpio.c</name>
+                </file>
                 <file>
                     <name>$PROJ_DIR$\..\..\fw\modules\io\mux.c</name>
                 </file>
@@ -2390,6 +2393,9 @@
                 <file>
                     <name>$PROJ_DIR$\..\..\fw\modules\modbus\modbus.c</name>
                 </file>
+                <file>
+                    <name>$PROJ_DIR$\..\..\fw\modules\modbus\modbus_params.c</name>
+                </file>
             </group>
             <group>
                 <name>spi_flash</name>

Some files were not shown because too many files changed in this diff