настройка 2 uart одни на слейв другой на мастер

This commit is contained in:
2026-06-25 11:08:10 +03:00
parent 132055b177
commit f695867969
6 changed files with 86 additions and 64 deletions

View File

@@ -48,7 +48,7 @@ extern "C" {
#define MODBUS_REG_ORDER_BE 0 #define MODBUS_REG_ORDER_BE 0
#define MODBUS_REG_ORDER_LE 1 #define MODBUS_REG_ORDER_LE 1
#define USE_USART USART_1 #define USE_USART USART_2
#define USART1_PA6_PA7 #define USART1_PA6_PA7
//#define USART1_PA9_PA10 //#define USART1_PA9_PA10

View File

@@ -1,4 +1,4 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/** /**
****************************************************************************** ******************************************************************************
* @file : main.c * @file : main.c
@@ -75,6 +75,13 @@ DALLAS_SensorHandleTypeDef sens[30];
int init_sens = 0; int init_sens = 0;
FlashRecord_t* record; FlashRecord_t* record;
uint8_t flash_buff[RECORD_SIZE - 4]; uint8_t flash_buff[RECORD_SIZE - 4];
RS_HandleTypeDef hmodbus_master;
RS_HandleTypeDef hmodbus_slave;
RS_MsgTypeDef master_msg;
RS_MsgTypeDef slave_msg;
uint8_t master_modbus_uart_buff[MSG_SIZE_MAX];
uint8_t slave_modbus_uart_buff[MSG_SIZE_MAX];
uint32_t last_modbus_request_tick = 0;
/* USER CODE END PM */ /* USER CODE END PM */
@@ -174,21 +181,27 @@ int main(void)
{ {
.port = GPIOC, .port = GPIOC,
.pin = GPIO_PIN_13, .pin = GPIO_PIN_13,
.blink_period = 10, // 100 мс .blink_period = 10, // 100 РјСЃ
.blink_count = 2 // 3 мигания .blink_count = 2 // 3 мигания
}; };
LED_BlinkRx_Init(&led_rx); LED_BlinkRx_Init(&led_rx);
BufferState_t buffer_init(); BufferState_t buffer_init();
led_blink(GPIOC, 13, rest_iter, reset_blink_delay); led_blink(GPIOC, 13, rest_iter, reset_blink_delay);
MODBUS_FirstInit(&hmodbus1, &mb_huart, &mb_htim); MODBUS_FirstInit(&hmodbus_master, &huart2, &htim2);
MODBUS_Config(&hmodbus1, MODBUS_DEVICE_ID, MODBUS_TIMEOUT, MODBUS_MODE_SLAVE); hmodbus_master.pBufferPtr = master_modbus_uart_buff;
// Запуск приема Modbus MODBUS_Config(&hmodbus_master, MODBUS_DEVICE_ID, MODBUS_TIMEOUT, MODBUS_MODE_MASTER);
MODBUS_SlaveStart(&hmodbus1, NULL);
MODBUS_FirstInit(&hmodbus_slave, &huart1, NULL);
hmodbus_slave.pBufferPtr = slave_modbus_uart_buff;
MODBUS_Config(&hmodbus_slave, MODBUS_DEVICE_ID, MODBUS_TIMEOUT, MODBUS_MODE_SLAVE);
MODBUS_SlaveStart(&hmodbus_slave, &slave_msg);
// Запуск приема Modbus
master_msg = MB_REQUEST_READ_HOLDING_REGS(1, 0, 1);
uint8_t uart_byte = 0; uint8_t uart_byte = 0;
Dallas_BusFirstInit(&htim1); Dallas_BusFirstInit(&htim1);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ (пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ)
reinit_t_sens(); reinit_t_sens();
init_setpoint_all_T_sense(temp_sense, hdallas.onewire->RomCnt); init_setpoint_all_T_sense(temp_sense, hdallas.onewire->RomCnt);
@@ -205,21 +218,28 @@ int main(void)
/* USER CODE BEGIN WHILE */ /* USER CODE BEGIN WHILE */
while (1) while (1)
{ {
if ((HAL_GetTick() - last_modbus_request_tick) >= 1000U)
{
if (MODBUS_MasterRequest(&hmodbus_master, &master_msg, NULL) == HAL_OK)
{
last_modbus_request_tick = HAL_GetTick();
}
}
if (MB_DATA.Coils.reserve3[3]==1) if (MB_DATA.Coils.reserve3[3]==1)
{ {
MB_DATA.Coils.reserve3[3]=0; MB_DATA.Coils.reserve3[3]=0;
LED_BlinkRx_Init(&led_rx); LED_BlinkRx_Init(&led_rx);
} }
//////блинкер по приему RS //////блинкер РїРѕ приему RS
if (hmodbus1.f.blink==1) if ((hmodbus_master.f.blink == 1) || (hmodbus_slave.f.blink == 1))
{ {
hmodbus1.f.blink=0; hmodbus_master.f.blink = 0;
hmodbus_slave.f.blink = 0;
LED_BlinkRx_OnRx(); LED_BlinkRx_OnRx();
} }
LED_BlinkRx_Process(); LED_BlinkRx_Process();
////// //////
////// запись во флэш ////// запись РІРѕ флэш
if (MB_DATA.Coils.reserve3[0]==1) if (MB_DATA.Coils.reserve3[0]==1)
{ {
MB_DATA.Coils.reserve3[0] = 0; MB_DATA.Coils.reserve3[0] = 0;
@@ -359,7 +379,7 @@ void init_cycle_counter(void) {
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
} }
// Замер времени в тактах процессора // Замер времени РІ тактах процессора
uint32_t measure_execution_time_cycles(void (*func)(void)) { uint32_t measure_execution_time_cycles(void (*func)(void)) {
uint32_t start = get_cycle_count(); uint32_t start = get_cycle_count();
func(); func();
@@ -385,7 +405,7 @@ return reg_array;
void iwdg_refresh(void) void iwdg_refresh(void)
{ {
IWDG->KR = 0xAAAA; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IWDG->KR = 0xAAAA; // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ
} }
void led_blink(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, uint8_t iter, uint16_t delay) void led_blink(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, uint8_t iter, uint16_t delay)
{ {
@@ -421,7 +441,7 @@ void reinit_t_sens(void)
{ {
for ( int i = 0; i < hdallas.onewire->RomCnt; i++) for ( int i = 0; i < hdallas.onewire->RomCnt; i++)
{ {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> ROM-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ ROM-пїЅпїЅпїЅпїЅпїЅпїЅ
//sens[i].Init.init_func = &Dallas_SensorInitByROM; //sens[i].Init.init_func = &Dallas_SensorInitByROM;
// sens[i].Init.InitParam.ROM = rom_address; // sens[i].Init.InitParam.ROM = rom_address;
sens[i].Init.InitParam.Ind = i; sens[i].Init.InitParam.Ind = i;
@@ -660,3 +680,5 @@ void assert_failed(uint8_t *file, uint32_t line)
/* USER CODE END 6 */ /* USER CODE END 6 */
} }
#endif /* USE_FULL_ASSERT */ #endif /* USE_FULL_ASSERT */

View File

@@ -67,6 +67,8 @@ extern TIM_HandleTypeDef htim2;
extern UART_HandleTypeDef huart1; extern UART_HandleTypeDef huart1;
extern UART_HandleTypeDef huart2; extern UART_HandleTypeDef huart2;
extern TIM_HandleTypeDef htim3; extern TIM_HandleTypeDef htim3;
extern RS_HandleTypeDef hmodbus_master;
extern RS_HandleTypeDef hmodbus_slave;
/* USER CODE BEGIN EV */ /* USER CODE BEGIN EV */
@@ -273,7 +275,7 @@ void TIM1_CC_IRQHandler(void)
void TIM2_IRQHandler(void) void TIM2_IRQHandler(void)
{ {
/* USER CODE BEGIN TIM2_IRQn 0 */ /* USER CODE BEGIN TIM2_IRQn 0 */
RS_TIM_Handler(&hmodbus1); RS_TIM_Handler(&hmodbus_master);
return; return;
/* USER CODE END TIM2_IRQn 0 */ /* USER CODE END TIM2_IRQn 0 */
HAL_TIM_IRQHandler(&htim2); HAL_TIM_IRQHandler(&htim2);
@@ -306,9 +308,7 @@ static uint8_t first_in=1;
void USART1_IRQHandler(void) void USART1_IRQHandler(void)
{ {
/* USER CODE BEGIN USART1_IRQn 0 */ /* USER CODE BEGIN USART1_IRQn 0 */
#if (USE_USART== USART_1) RS_UART_Handler(&hmodbus_slave);
RS_UART_Handler(&hmodbus1);
#endif
@@ -328,9 +328,7 @@ void USART1_IRQHandler(void)
void USART2_IRQHandler(void) void USART2_IRQHandler(void)
{ {
/* USER CODE BEGIN USART2_IRQn 0 */ /* USER CODE BEGIN USART2_IRQn 0 */
#if (USE_USART== USART_2) RS_UART_Handler(&hmodbus_master);
RS_UART_Handler(&hmodbus1);
#endif
/* USER CODE END USART2_IRQn 0 */ /* USER CODE END USART2_IRQn 0 */

View File

@@ -1,21 +1,21 @@
/** /**
****************************************************************************** ******************************************************************************
* @file modbus_config.h * @file modbus_config.h
* @brief Конфигурационные параметры Modbus устройства * @brief Конфигурационные параметры Modbus устройства
****************************************************************************** ******************************************************************************
@addtogroup MODBUS_CONFIGS Modbus configs @addtogroup MODBUS_CONFIGS Modbus configs
@ingroup MODBUS @ingroup MODBUS
@brief Конфигурация библиотеки @brief Конфигурация библиотеки
@{ @{
****************************************************************************** ******************************************************************************
* @details * @details
Файл содержит настройки для работы Modbus: Файл содержит настройки для работы Modbus:
- Подключение библиотек контроллера - Подключение библиотек контроллера
- ID устройства и таймауты - ID устройства Рё таймауты
- Строковые идентификаторы (Vendor, Product, Revision) - Строковые идентификаторы (Vendor, Product, Revision)
- Настройки периферии (UART, TIMER) - Настройки периферии (UART, TIMER)
- Подключение модулей Modbus - Подключение модулей Modbus
- Опциональные функции (переключение команд 0x03/0x04) - Опциональные функции (переключение команд 0x03/0x04)
******************************************************SSSSSS************************/ ******************************************************SSSSSS************************/
#ifndef _MODBUS_CONFIG_H_ #ifndef _MODBUS_CONFIG_H_
#define _MODBUS_CONFIG_H_ #define _MODBUS_CONFIG_H_
@@ -26,11 +26,11 @@
// Общие параметры // Общие параметры
#define MODBUS_DEVICE_ID 3 ///< Адрес устройства в сети Modbus #define MODBUS_DEVICE_ID 3 ///< Адрес устройства РІ сети Modbus
#define MODBUS_TIMEOUT 5000 ///< Таймаут в тиках таймера #define MODBUS_TIMEOUT 5000 ///< Таймаут РІ тиках таймера
// Строковые идентификаторы устройства // Строковые идентификаторы устройства
#define MODBUS_VENDOR_NAME "super mega vendor" #define MODBUS_VENDOR_NAME "super mega vendor"
#define MODBUS_PRODUCT_CODE "Climate control" #define MODBUS_PRODUCT_CODE "Climate control"
#define MODBUS_REVISION "1.0" #define MODBUS_REVISION "1.0"
@@ -39,36 +39,37 @@
#define MODBUS_MODEL_NAME "" #define MODBUS_MODEL_NAME ""
#define MODBUS_USER_APPLICATION_NAME "" #define MODBUS_USER_APPLICATION_NAME ""
#define MODBUS_NUMB_OF_USEROBJECTS 0 ///< Количество пользовательских объектов #define MODBUS_NUMB_OF_USEROBJECTS 0 ///< Количество пользовательских объектов
#define MODBUS_USEROBJECT_0_NAME "" ///< Строка пользовательского идентификатора 0. По аналогии можно определить строки до <=128 USEROBJECT #define MODBUS_USEROBJECT_0_NAME "" ///< Строка пользовательского идентификатора 0. РџРѕ аналогии РјРѕР¶РЅРѕ определить строки РґРѕ <=128 USEROBJECT
// Периферия (опционально) // Периферия (опционально)
#if (USE_USART== USART_1) #if (USE_USART== USART_1)
#define mb_huart huart1 ///< Удобный дефайн для модбасовского uart #define mb_huart huart1 ///< Удобный дефайн для модбасовского uart
#elif(USE_USART==USART_2) #elif(USE_USART==USART_2)
#define mb_huart huart2 #define mb_huart huart2
#endif #endif
#define mb_htim htim2 ///< Удобный дефайн для модбасовского таймера #define mb_htim htim2 ///< Удобный дефайн для модбасовского таймера
//#define RS_EnableReceive() ///< Функция изменения направления передачи на ПРИЕМ для RS-485 //#define RS_EnableReceive() ///< Функция изменения направления передачи РЅР° ПРИЕМ для RS-485
//#define RS_EnableTransmit() ///< Функция изменения направления передачи на ПЕРЕДАЧУ для RS-485 //#define RS_EnableTransmit() ///< Функция изменения направления передачи РЅР° ПЕРЕДАЧУ для RS-485
// Модули modbus // Модули modbus
#define MODBUS_ENABLE_SLAVE ///< Включить обработку СЛЕЙВ режима // Enable slave mode
//#define MODBUS_ENABLE_MASTER ///< Включить обработку МАСТЕР режима #define MODBUS_ENABLE_SLAVE ///< Включить обработку СЛЕЙВ режима
#define MODBUS_ENABLE_MASTER ///< Включить обработку МАСТЕР режима
#define MODBUS_ENABLE_COILS ///< Включить обработку коилов #define MODBUS_ENABLE_COILS ///< Включить обработку коилов
#define MODBUS_ENABLE_HOLDINGS ///< Включить обработку регистров хранения #define MODBUS_ENABLE_HOLDINGS ///< Включить обработку регистров хранения
#define MODBUS_ENABLE_INPUTS ///< Включить обработку входных регистров #define MODBUS_ENABLE_INPUTS ///< Включить обработку входных регистров
#define MODBUS_ENABLE_DEVICE_IDENTIFICATIONS ///< Включить обработку идентификаторы устройства #define MODBUS_ENABLE_DEVICE_IDENTIFICATIONS ///< Включить обработку идентификаторы устройства
#define MODBUS_ENABLE_DIAGNOSTICS ///< Включить обработку диагностики модбас #define MODBUS_ENABLE_DIAGNOSTICS ///< Включить обработку диагностики модбас
//#define MODBUS_PROTOCOL_TCP ///< Включить TCP-протокол, иначе - RTU //#define MODBUS_PROTOCOL_TCP ///< Включить TCP-протокол, иначе - RTU
/** /**
* @brief Поменять комманды 0x03 и 0x04 местами (для LabView терминалки от двигателей) * @brief Поменять комманды 0x03 Рё 0x04 местами (для LabView терминалки РѕС РґРІРёРіР°С‚РµР»РµР№)
* @details Терминалка от двигателей использует для чтения регистров комманду R_HOLD_REGS вместо R_IN_REGS * @details Терминалка РѕС РґРІРёРіР°С‚РµР»РµР№ использует для чтения регистров комманду R_HOLD_REGS вместо R_IN_REGS
* Поэтому чтобы считывать Input Regs - надо поменять их местами. * Поэтому чтобы считывать Input Regs - надо поменять РёС… местами.
*/ */
//#define MODBUS_SWITCH_COMMAND_R_IN_REGS_AND_R_HOLD_REGS //#define MODBUS_SWITCH_COMMAND_R_IN_REGS_AND_R_HOLD_REGS
@@ -78,3 +79,4 @@
#endif //_MODBUS_CONFIG_H_ #endif //_MODBUS_CONFIG_H_

View File

@@ -3,9 +3,9 @@
<FRAME activewindow="0"> <FRAME activewindow="0">
<PLACEMENT>2c0000000200000003000000ffffffffffffffffffffffffffffffff40000000670000008c080000bd050000</PLACEMENT> <PLACEMENT>2c0000000200000003000000ffffffffffffffffffffffffffffffff40000000670000008c080000bd050000</PLACEMENT>
<WINDOW type="default" module="ISIS"> <WINDOW type="default" module="ISIS">
<editor metric="0" gridmajor="2540000" mode="00000001" zoom="0" scale="240" flipped="0" gridminor="254000" gridmode="32" snapidx="2" snap="254000" xcursor="0" orgmode="0" snaprange="127000"> <editor metric="0" gridmajor="2540000" mode="00000000" zoom="0" scale="120" flipped="0" gridminor="254000" gridmode="32" snapidx="2" snap="254000" xcursor="0" orgmode="0" snaprange="127000">
<world y1="-8890000" x1="-12700000" y2="8890000" x2="12700000"/> <world y1="-8890000" x1="-12700000" y2="8890000" x2="12700000"/>
<centre x="1016000" y="4064000"/> <centre x="0" y="0"/>
<origin x="0" y="0"/> <origin x="0" y="0"/>
</editor> </editor>
</WINDOW> </WINDOW>
@@ -18,9 +18,9 @@
</editor> </editor>
</MODULE> </MODULE>
<MODULE name="ISIS"> <MODULE name="ISIS">
<editor metric="0" gridmajor="2540000" mode="00000001" zoom="0" scale="240" flipped="0" gridminor="254000" gridmode="32" snapidx="2" snap="254000" xcursor="0" orgmode="0" snaprange="127000"> <editor metric="0" gridmajor="2540000" mode="00000000" zoom="0" scale="120" flipped="0" gridminor="254000" gridmode="32" snapidx="2" snap="254000" xcursor="0" orgmode="0" snaprange="127000">
<world y1="-8890000" x1="-12700000" y2="8890000" x2="12700000"/> <world y1="-8890000" x1="-12700000" y2="8890000" x2="12700000"/>
<centre x="1016000" y="4064000"/> <centre x="0" y="0"/>
<origin x="0" y="0"/> <origin x="0" y="0"/>
</editor> </editor>
</MODULE> </MODULE>