|
|
@@ -1,20 +1,20 @@ |
|
|
/* USER CODE BEGIN Header */ |
|
|
/* USER CODE BEGIN Header */ |
|
|
/** |
|
|
/** |
|
|
****************************************************************************** |
|
|
|
|
|
* @file : main.c |
|
|
|
|
|
* @brief : Main program body |
|
|
|
|
|
****************************************************************************** |
|
|
|
|
|
* @attention |
|
|
|
|
|
* |
|
|
|
|
|
* Copyright (c) 2026 STMicroelectronics. |
|
|
|
|
|
* All rights reserved. |
|
|
|
|
|
* |
|
|
|
|
|
* This software is licensed under terms that can be found in the LICENSE file |
|
|
|
|
|
* in the root directory of this software component. |
|
|
|
|
|
* If no LICENSE file comes with this software, it is provided AS-IS. |
|
|
|
|
|
* |
|
|
|
|
|
****************************************************************************** |
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
****************************************************************************** |
|
|
|
|
|
* @file : main.c |
|
|
|
|
|
* @brief : Main program body |
|
|
|
|
|
****************************************************************************** |
|
|
|
|
|
* @attention |
|
|
|
|
|
* |
|
|
|
|
|
* Copyright (c) 2026 STMicroelectronics. |
|
|
|
|
|
* All rights reserved. |
|
|
|
|
|
* |
|
|
|
|
|
* This software is licensed under terms that can be found in the LICENSE file |
|
|
|
|
|
* in the root directory of this software component. |
|
|
|
|
|
* If no LICENSE file comes with this software, it is provided AS-IS. |
|
|
|
|
|
* |
|
|
|
|
|
****************************************************************************** |
|
|
|
|
|
*/ |
|
|
/* USER CODE END Header */ |
|
|
/* USER CODE END Header */ |
|
|
/* Includes ------------------------------------------------------------------*/ |
|
|
/* Includes ------------------------------------------------------------------*/ |
|
|
#include "main.h" |
|
|
#include "main.h" |
|
|
@@ -46,7 +46,7 @@ |
|
|
UART_HandleTypeDef huart1; |
|
|
UART_HandleTypeDef huart1; |
|
|
DMA_HandleTypeDef hdma_usart1_rx; |
|
|
DMA_HandleTypeDef hdma_usart1_rx; |
|
|
DMA_HandleTypeDef hdma_usart1_tx; |
|
|
DMA_HandleTypeDef hdma_usart1_tx; |
|
|
|
|
|
|
|
|
|
|
|
static uint8_t ConnectFlag; |
|
|
/* USER CODE BEGIN PV */ |
|
|
/* USER CODE BEGIN PV */ |
|
|
|
|
|
|
|
|
static OS_STK AppTaskStartStk[APP_TASK_START_STK_SIZE]; |
|
|
static OS_STK AppTaskStartStk[APP_TASK_START_STK_SIZE]; |
|
|
@@ -59,148 +59,134 @@ static void MX_GPIO_Init(void); |
|
|
static void MX_DMA_Init(void); |
|
|
static void MX_DMA_Init(void); |
|
|
static void MX_USART1_UART_Init(void); |
|
|
static void MX_USART1_UART_Init(void); |
|
|
/* USER CODE BEGIN PFP */ |
|
|
/* USER CODE BEGIN PFP */ |
|
|
static void AppTaskStart(void *p_arg); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void AppTaskStart(void *pArg); |
|
|
|
|
|
|
|
|
/* USER CODE END PFP */ |
|
|
/* USER CODE END PFP */ |
|
|
|
|
|
|
|
|
/* Private user code ---------------------------------------------------------*/ |
|
|
/* Private user code ---------------------------------------------------------*/ |
|
|
/* USER CODE BEGIN 0 */ |
|
|
/* USER CODE BEGIN 0 */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void AppTaskStart(void *p_arg) |
|
|
|
|
|
|
|
|
static void AppTaskStart(void *pArg) |
|
|
{ |
|
|
{ |
|
|
|
|
|
|
|
|
(void)p_arg; |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
|
* F4作为Modbus RTU从站,触摸屏作为主站 |
|
|
|
|
|
* 初始化函数会立即启动USART1的DMA空闲接收 |
|
|
|
|
|
*/ |
|
|
|
|
|
ModbusSlaveInit(&huart1, MODBUS_SLAVE_DEFAULT_ADDRESS); |
|
|
|
|
|
ModbusRetainedRegistersLoad(); |
|
|
|
|
|
while (1) |
|
|
|
|
|
{ |
|
|
|
|
|
/* |
|
|
|
|
|
* 维护几个供触摸屏首次联调读取的保持寄存器: |
|
|
|
|
|
*/ |
|
|
|
|
|
(void)ModbusSlaveSetHoldingRegister(//OS时钟 |
|
|
|
|
|
HMI_REG_UPTIME_SECONDS, |
|
|
|
|
|
(uint16_t)(OSTimeGet() / OS_TICKS_PER_SEC)); |
|
|
|
|
|
(void)ModbusSlaveSetHoldingRegister(//有效帧计数 |
|
|
|
|
|
HMI_REG_RX_FRAME_COUNT, |
|
|
|
|
|
(uint16_t)ModbusSlaveStatistics.validFrameCount); |
|
|
|
|
|
|
|
|
|
|
|
(void)ModbusSlaveSetHoldingRegister(//从站地址不匹配计数 |
|
|
|
|
|
3, |
|
|
|
|
|
(uint16_t)ModbusSlaveStatistics.ignoredAddressCount); |
|
|
|
|
|
(void)ModbusSlaveSetHoldingRegister(//非法功能码计数 |
|
|
|
|
|
4, |
|
|
|
|
|
(uint16_t)ModbusSlaveStatistics.illegalFunctionCount); |
|
|
|
|
|
|
|
|
|
|
|
(void)ModbusSlaveSetHoldingRegister(//非法地址计数 |
|
|
|
|
|
5, |
|
|
|
|
|
(uint16_t)ModbusSlaveStatistics.illegalAddressCount); |
|
|
|
|
|
|
|
|
|
|
|
(void)ModbusSlaveSetHoldingRegister(//非法数据值计数 |
|
|
|
|
|
6, |
|
|
|
|
|
(uint16_t)ModbusSlaveStatistics.illegalValueCount); |
|
|
|
|
|
|
|
|
|
|
|
HistorySaveToRegisters(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(void)pArg; |
|
|
|
|
|
|
|
|
/* |
|
|
/* |
|
|
* 每1ms轮询一次, |
|
|
|
|
|
|
|
|
* F4作为Modbus RTU从站,触摸屏作为主站 |
|
|
|
|
|
* 初始化函数会立即启动USART1的DMA空闲接收 |
|
|
*/ |
|
|
*/ |
|
|
ModbusSlavePoll(); |
|
|
|
|
|
ModbusRetainedRegistersPoll(); |
|
|
|
|
|
// printf("123"); |
|
|
|
|
|
OSTimeDly(1U); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
(void)ModbusSlaveInit(&huart1, MODBUS_SLAVE_DEFAULT_ADDRESS); |
|
|
|
|
|
ModbusRetainedRegistersLoad(); |
|
|
|
|
|
while (1) |
|
|
|
|
|
{ |
|
|
|
|
|
/* |
|
|
|
|
|
* 维护几个供触摸屏首次联调读取的保持寄存器: |
|
|
|
|
|
*/ |
|
|
|
|
|
(void)ModbusSlaveSetHoldingRegister( // OS时钟 |
|
|
|
|
|
HMI_REG_UPTIME_SECONDS, (uint16_t)(OSTimeGet() / OS_TICKS_PER_SEC)); |
|
|
|
|
|
(void)ModbusSlaveSetHoldingRegister( // 有效帧计数 |
|
|
|
|
|
HMI_REG_RX_FRAME_COUNT, |
|
|
|
|
|
(uint16_t)ModbusSlaveStatistics.validFrameCount); |
|
|
|
|
|
|
|
|
|
|
|
(void)ModbusSlaveSetHoldingRegister( // 从站地址不匹配计数 |
|
|
|
|
|
3, (uint16_t)ModbusSlaveStatistics.ignoredAddressCount); |
|
|
|
|
|
(void)ModbusSlaveSetHoldingRegister( // 非法功能码计数 |
|
|
|
|
|
4, (uint16_t)ModbusSlaveStatistics.illegalFunctionCount); |
|
|
|
|
|
|
|
|
|
|
|
(void)ModbusSlaveSetHoldingRegister( // 非法地址计数 |
|
|
|
|
|
5, (uint16_t)ModbusSlaveStatistics.illegalAddressCount); |
|
|
|
|
|
|
|
|
|
|
|
(void)ModbusSlaveSetHoldingRegister( // 非法数据值计数 |
|
|
|
|
|
6, (uint16_t)ModbusSlaveStatistics.illegalValueCount); |
|
|
|
|
|
|
|
|
|
|
|
HistorySaveToRegisters(); |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
|
* 每1ms轮询一次, |
|
|
|
|
|
*/ |
|
|
|
|
|
ModbusSlavePoll(); |
|
|
|
|
|
ModbusRetainedRegistersPoll(); |
|
|
|
|
|
|
|
|
|
|
|
if (ModbusSlaveIsConnected(MODBUS_CONNECTION_TIMEOUT_MS) != 0U) |
|
|
|
|
|
{ |
|
|
|
|
|
/* 主站在线 */ |
|
|
|
|
|
ConnectFlag = 1; |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
/* 主站超时或断开 */ |
|
|
|
|
|
ConnectFlag = 0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
OSTimeDly(1U); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* USER CODE END 0 */ |
|
|
/* USER CODE END 0 */ |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* @brief The application entry point. |
|
|
|
|
|
* @retval int |
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
* @brief The application entry point. |
|
|
|
|
|
* @retval int |
|
|
|
|
|
*/ |
|
|
int main(void) |
|
|
int main(void) |
|
|
{ |
|
|
{ |
|
|
|
|
|
|
|
|
/* USER CODE BEGIN 1 */ |
|
|
|
|
|
|
|
|
|
|
|
/* USER CODE END 1 */ |
|
|
|
|
|
|
|
|
|
|
|
/* MCU Configuration--------------------------------------------------------*/ |
|
|
|
|
|
|
|
|
|
|
|
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */ |
|
|
|
|
|
HAL_Init(); |
|
|
|
|
|
|
|
|
|
|
|
/* USER CODE BEGIN Init */ |
|
|
|
|
|
|
|
|
/* USER CODE BEGIN 1 */ |
|
|
|
|
|
|
|
|
/* USER CODE END Init */ |
|
|
|
|
|
|
|
|
/* USER CODE END 1 */ |
|
|
|
|
|
|
|
|
/* Configure the system clock */ |
|
|
|
|
|
SystemClock_Config(); |
|
|
|
|
|
|
|
|
/* MCU |
|
|
|
|
|
* Configuration--------------------------------------------------------*/ |
|
|
|
|
|
|
|
|
/* USER CODE BEGIN SysInit */ |
|
|
|
|
|
|
|
|
/* Reset peripherals and initialize the Flash interface and the Systick. */ |
|
|
|
|
|
HAL_Init(); |
|
|
|
|
|
|
|
|
/* USER CODE END SysInit */ |
|
|
|
|
|
|
|
|
/* USER CODE BEGIN Init */ |
|
|
|
|
|
|
|
|
/* Initialize all configured peripherals */ |
|
|
|
|
|
MX_GPIO_Init(); |
|
|
|
|
|
MX_DMA_Init(); |
|
|
|
|
|
MX_USB_DEVICE_Init(); |
|
|
|
|
|
MX_USART1_UART_Init(); |
|
|
|
|
|
BackupSramInit(); |
|
|
|
|
|
|
|
|
/* USER CODE END Init */ |
|
|
|
|
|
|
|
|
|
|
|
/* Configure the system clock */ |
|
|
|
|
|
SystemClock_Config(); |
|
|
|
|
|
|
|
|
/* USER CODE BEGIN 2 */ |
|
|
|
|
|
INT8U os_err; |
|
|
|
|
|
|
|
|
/* USER CODE BEGIN SysInit */ |
|
|
|
|
|
|
|
|
|
|
|
/* USER CODE END SysInit */ |
|
|
|
|
|
|
|
|
OSInit(); |
|
|
|
|
|
|
|
|
/* Initialize all configured peripherals */ |
|
|
|
|
|
MX_GPIO_Init(); |
|
|
|
|
|
MX_DMA_Init(); |
|
|
|
|
|
MX_USB_DEVICE_Init(); |
|
|
|
|
|
MX_USART1_UART_Init(); |
|
|
|
|
|
(void)BackupSramInit(); |
|
|
|
|
|
|
|
|
|
|
|
/* USER CODE BEGIN 2 */ |
|
|
|
|
|
INT8U osError; |
|
|
|
|
|
|
|
|
os_err = OSTaskCreateExt(AppTaskStart, |
|
|
|
|
|
0, |
|
|
|
|
|
&AppTaskStartStk[APP_TASK_START_STK_SIZE - 1u], |
|
|
|
|
|
APP_TASK_START_PRIO, |
|
|
|
|
|
APP_TASK_START_PRIO, |
|
|
|
|
|
&AppTaskStartStk[0], |
|
|
|
|
|
APP_TASK_START_STK_SIZE, |
|
|
|
|
|
0, |
|
|
|
|
|
(OS_TASK_OPT_STK_CHK | |
|
|
|
|
|
OS_TASK_OPT_STK_CLR)); |
|
|
|
|
|
|
|
|
OSInit(); |
|
|
|
|
|
|
|
|
if (os_err != OS_ERR_NONE) |
|
|
|
|
|
{ |
|
|
|
|
|
Error_Handler(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
osError = OSTaskCreateExt(AppTaskStart, 0, |
|
|
|
|
|
&AppTaskStartStk[APP_TASK_START_STK_SIZE - 1u], |
|
|
|
|
|
APP_TASK_START_PRIO, APP_TASK_START_PRIO, |
|
|
|
|
|
&AppTaskStartStk[0], APP_TASK_START_STK_SIZE, 0, |
|
|
|
|
|
(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR)); |
|
|
|
|
|
|
|
|
|
|
|
if (osError != OS_ERR_NONE) |
|
|
|
|
|
{ |
|
|
|
|
|
Error_Handler(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
OSStart(); |
|
|
|
|
|
/* USER CODE END 2 */ |
|
|
|
|
|
|
|
|
OSStart(); |
|
|
|
|
|
/* USER CODE END 2 */ |
|
|
|
|
|
|
|
|
/* Infinite loop */ |
|
|
|
|
|
/* USER CODE BEGIN WHILE */ |
|
|
|
|
|
while (1) |
|
|
|
|
|
{ |
|
|
|
|
|
/* USER CODE END WHILE */ |
|
|
|
|
|
|
|
|
/* Infinite loop */ |
|
|
|
|
|
/* USER CODE BEGIN WHILE */ |
|
|
|
|
|
while (1) |
|
|
|
|
|
{ |
|
|
|
|
|
/* USER CODE END WHILE */ |
|
|
|
|
|
|
|
|
/* USER CODE BEGIN 3 */ |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
/* USER CODE END 3 */ |
|
|
|
|
|
|
|
|
/* USER CODE BEGIN 3 */ |
|
|
|
|
|
} |
|
|
|
|
|
/* USER CODE END 3 */ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static HAL_StatusTypeDef BackupSramInit(void) |
|
|
static HAL_StatusTypeDef BackupSramInit(void) |
|
|
@@ -212,187 +198,182 @@ static HAL_StatusTypeDef BackupSramInit(void) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* @brief System Clock Configuration |
|
|
|
|
|
* @retval None |
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
* @brief System Clock Configuration |
|
|
|
|
|
* @retval None |
|
|
|
|
|
*/ |
|
|
void SystemClock_Config(void) |
|
|
void SystemClock_Config(void) |
|
|
{ |
|
|
{ |
|
|
RCC_OscInitTypeDef RCC_OscInitStruct = {0}; |
|
|
|
|
|
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; |
|
|
|
|
|
|
|
|
|
|
|
/** Configure the main internal regulator output voltage |
|
|
|
|
|
*/ |
|
|
|
|
|
__HAL_RCC_PWR_CLK_ENABLE(); |
|
|
|
|
|
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); |
|
|
|
|
|
|
|
|
|
|
|
/** Initializes the RCC Oscillators according to the specified parameters |
|
|
|
|
|
* in the RCC_OscInitTypeDef structure. |
|
|
|
|
|
*/ |
|
|
|
|
|
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; |
|
|
|
|
|
RCC_OscInitStruct.HSEState = RCC_HSE_ON; |
|
|
|
|
|
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; |
|
|
|
|
|
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; |
|
|
|
|
|
RCC_OscInitStruct.PLL.PLLM = 12; |
|
|
|
|
|
RCC_OscInitStruct.PLL.PLLN = 336; |
|
|
|
|
|
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; |
|
|
|
|
|
RCC_OscInitStruct.PLL.PLLQ = 7; |
|
|
|
|
|
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) |
|
|
|
|
|
{ |
|
|
|
|
|
Error_Handler(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** Initializes the CPU, AHB and APB buses clocks |
|
|
|
|
|
*/ |
|
|
|
|
|
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |
|
|
|
|
|
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; |
|
|
|
|
|
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; |
|
|
|
|
|
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; |
|
|
|
|
|
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; |
|
|
|
|
|
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; |
|
|
|
|
|
|
|
|
|
|
|
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) |
|
|
|
|
|
{ |
|
|
|
|
|
Error_Handler(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** Enables the Clock Security System |
|
|
|
|
|
*/ |
|
|
|
|
|
HAL_RCC_EnableCSS(); |
|
|
|
|
|
|
|
|
RCC_OscInitTypeDef RCC_OscInitStruct = {0}; |
|
|
|
|
|
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; |
|
|
|
|
|
|
|
|
|
|
|
/** Configure the main internal regulator output voltage |
|
|
|
|
|
*/ |
|
|
|
|
|
__HAL_RCC_PWR_CLK_ENABLE(); |
|
|
|
|
|
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); |
|
|
|
|
|
|
|
|
|
|
|
/** Initializes the RCC Oscillators according to the specified parameters |
|
|
|
|
|
* in the RCC_OscInitTypeDef structure. |
|
|
|
|
|
*/ |
|
|
|
|
|
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; |
|
|
|
|
|
RCC_OscInitStruct.HSEState = RCC_HSE_ON; |
|
|
|
|
|
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; |
|
|
|
|
|
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; |
|
|
|
|
|
RCC_OscInitStruct.PLL.PLLM = 12; |
|
|
|
|
|
RCC_OscInitStruct.PLL.PLLN = 336; |
|
|
|
|
|
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; |
|
|
|
|
|
RCC_OscInitStruct.PLL.PLLQ = 7; |
|
|
|
|
|
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) |
|
|
|
|
|
{ |
|
|
|
|
|
Error_Handler(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** Initializes the CPU, AHB and APB buses clocks |
|
|
|
|
|
*/ |
|
|
|
|
|
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK |
|
|
|
|
|
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; |
|
|
|
|
|
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; |
|
|
|
|
|
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; |
|
|
|
|
|
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; |
|
|
|
|
|
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; |
|
|
|
|
|
|
|
|
|
|
|
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) |
|
|
|
|
|
{ |
|
|
|
|
|
Error_Handler(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** Enables the Clock Security System |
|
|
|
|
|
*/ |
|
|
|
|
|
HAL_RCC_EnableCSS(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* @brief USART1 Initialization Function |
|
|
|
|
|
* @param None |
|
|
|
|
|
* @retval None |
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
* @brief USART1 Initialization Function |
|
|
|
|
|
* @param None |
|
|
|
|
|
* @retval None |
|
|
|
|
|
*/ |
|
|
static void MX_USART1_UART_Init(void) |
|
|
static void MX_USART1_UART_Init(void) |
|
|
{ |
|
|
{ |
|
|
|
|
|
|
|
|
/* USER CODE BEGIN USART1_Init 0 */ |
|
|
|
|
|
|
|
|
|
|
|
/* USER CODE END USART1_Init 0 */ |
|
|
|
|
|
|
|
|
/* USER CODE BEGIN USART1_Init 0 */ |
|
|
|
|
|
|
|
|
/* USER CODE BEGIN USART1_Init 1 */ |
|
|
|
|
|
|
|
|
/* USER CODE END USART1_Init 0 */ |
|
|
|
|
|
|
|
|
/* USER CODE END USART1_Init 1 */ |
|
|
|
|
|
huart1.Instance = USART1; |
|
|
|
|
|
huart1.Init.BaudRate = 115200; |
|
|
|
|
|
huart1.Init.WordLength = UART_WORDLENGTH_9B; |
|
|
|
|
|
huart1.Init.StopBits = UART_STOPBITS_1; |
|
|
|
|
|
huart1.Init.Parity = UART_PARITY_EVEN; |
|
|
|
|
|
huart1.Init.Mode = UART_MODE_TX_RX; |
|
|
|
|
|
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; |
|
|
|
|
|
huart1.Init.OverSampling = UART_OVERSAMPLING_16; |
|
|
|
|
|
if (HAL_UART_Init(&huart1) != HAL_OK) |
|
|
|
|
|
{ |
|
|
|
|
|
Error_Handler(); |
|
|
|
|
|
} |
|
|
|
|
|
/* USER CODE BEGIN USART1_Init 2 */ |
|
|
|
|
|
|
|
|
/* USER CODE BEGIN USART1_Init 1 */ |
|
|
|
|
|
|
|
|
/* USER CODE END USART1_Init 2 */ |
|
|
|
|
|
|
|
|
/* USER CODE END USART1_Init 1 */ |
|
|
|
|
|
huart1.Instance = USART1; |
|
|
|
|
|
huart1.Init.BaudRate = 115200; |
|
|
|
|
|
huart1.Init.WordLength = UART_WORDLENGTH_9B; |
|
|
|
|
|
huart1.Init.StopBits = UART_STOPBITS_1; |
|
|
|
|
|
huart1.Init.Parity = UART_PARITY_EVEN; |
|
|
|
|
|
huart1.Init.Mode = UART_MODE_TX_RX; |
|
|
|
|
|
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; |
|
|
|
|
|
huart1.Init.OverSampling = UART_OVERSAMPLING_16; |
|
|
|
|
|
if (HAL_UART_Init(&huart1) != HAL_OK) |
|
|
|
|
|
{ |
|
|
|
|
|
Error_Handler(); |
|
|
|
|
|
} |
|
|
|
|
|
/* USER CODE BEGIN USART1_Init 2 */ |
|
|
|
|
|
|
|
|
|
|
|
/* USER CODE END USART1_Init 2 */ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* Enable DMA controller clock |
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
* Enable DMA controller clock |
|
|
|
|
|
*/ |
|
|
static void MX_DMA_Init(void) |
|
|
static void MX_DMA_Init(void) |
|
|
{ |
|
|
{ |
|
|
|
|
|
|
|
|
/* DMA controller clock enable */ |
|
|
|
|
|
__HAL_RCC_DMA2_CLK_ENABLE(); |
|
|
|
|
|
|
|
|
|
|
|
/* DMA interrupt init */ |
|
|
|
|
|
/* DMA2_Stream2_IRQn interrupt configuration */ |
|
|
|
|
|
HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 5, 0); |
|
|
|
|
|
HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn); |
|
|
|
|
|
/* DMA2_Stream7_IRQn interrupt configuration */ |
|
|
|
|
|
HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 5, 0); |
|
|
|
|
|
HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn); |
|
|
|
|
|
|
|
|
/* DMA controller clock enable */ |
|
|
|
|
|
__HAL_RCC_DMA2_CLK_ENABLE(); |
|
|
|
|
|
|
|
|
|
|
|
/* DMA interrupt init */ |
|
|
|
|
|
/* DMA2_Stream2_IRQn interrupt configuration */ |
|
|
|
|
|
HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 5, 0); |
|
|
|
|
|
HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn); |
|
|
|
|
|
/* DMA2_Stream7_IRQn interrupt configuration */ |
|
|
|
|
|
HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 5, 0); |
|
|
|
|
|
HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* @brief GPIO Initialization Function |
|
|
|
|
|
* @param None |
|
|
|
|
|
* @retval None |
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
* @brief GPIO Initialization Function |
|
|
|
|
|
* @param None |
|
|
|
|
|
* @retval None |
|
|
|
|
|
*/ |
|
|
static void MX_GPIO_Init(void) |
|
|
static void MX_GPIO_Init(void) |
|
|
{ |
|
|
{ |
|
|
/* USER CODE BEGIN MX_GPIO_Init_1 */ |
|
|
|
|
|
|
|
|
/* USER CODE BEGIN MX_GPIO_Init_1 */ |
|
|
|
|
|
|
|
|
/* USER CODE END MX_GPIO_Init_1 */ |
|
|
|
|
|
|
|
|
/* USER CODE END MX_GPIO_Init_1 */ |
|
|
|
|
|
|
|
|
/* GPIO Ports Clock Enable */ |
|
|
|
|
|
__HAL_RCC_GPIOH_CLK_ENABLE(); |
|
|
|
|
|
__HAL_RCC_GPIOA_CLK_ENABLE(); |
|
|
|
|
|
|
|
|
/* GPIO Ports Clock Enable */ |
|
|
|
|
|
__HAL_RCC_GPIOH_CLK_ENABLE(); |
|
|
|
|
|
__HAL_RCC_GPIOA_CLK_ENABLE(); |
|
|
|
|
|
|
|
|
/* USER CODE BEGIN MX_GPIO_Init_2 */ |
|
|
|
|
|
|
|
|
/* USER CODE BEGIN MX_GPIO_Init_2 */ |
|
|
|
|
|
|
|
|
/* USER CODE END MX_GPIO_Init_2 */ |
|
|
|
|
|
|
|
|
/* USER CODE END MX_GPIO_Init_2 */ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/* USER CODE BEGIN 4 */ |
|
|
/* USER CODE BEGIN 4 */ |
|
|
|
|
|
|
|
|
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) |
|
|
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) |
|
|
{ |
|
|
{ |
|
|
if (huart->Instance == USART1) |
|
|
|
|
|
{ |
|
|
|
|
|
/* 应答发送完成后,协议模块重新启动DMA接收。 */ |
|
|
|
|
|
ModbusSlaveOnTxComplete(huart); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (huart->Instance == USART1) |
|
|
|
|
|
{ |
|
|
|
|
|
/* 应答发送完成后,协议模块重新启动DMA接收。 */ |
|
|
|
|
|
ModbusSlaveOnTxComplete(huart); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) |
|
|
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) |
|
|
{ |
|
|
{ |
|
|
if (huart->Instance == USART1) |
|
|
|
|
|
{ |
|
|
|
|
|
/* |
|
|
|
|
|
* DMA遇到串口空闲事件后进入这里。 |
|
|
|
|
|
* 仅复制帧并重启DMA |
|
|
|
|
|
*/ |
|
|
|
|
|
ModbusSlaveOnRxEvent(huart, Size); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (huart->Instance == USART1) |
|
|
|
|
|
{ |
|
|
|
|
|
ModbusSlaveOnRxEvent(huart, Size); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) |
|
|
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) |
|
|
{ |
|
|
{ |
|
|
if (huart->Instance == USART1) |
|
|
|
|
|
{ |
|
|
|
|
|
/* 溢出、噪声、帧错误等异常后恢复USART1 DMA接收。 */ |
|
|
|
|
|
ModbusSlaveOnUartError(huart); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (huart->Instance == USART1) |
|
|
|
|
|
{ |
|
|
|
|
|
/* 溢出、噪声、帧错误等异常后恢复USART1 DMA接收。 */ |
|
|
|
|
|
ModbusSlaveOnUartError(huart); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/* USER CODE END 4 */ |
|
|
/* USER CODE END 4 */ |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* @brief This function is executed in case of error occurrence. |
|
|
|
|
|
* @retval None |
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
* @brief This function is executed in case of error occurrence. |
|
|
|
|
|
* @retval None |
|
|
|
|
|
*/ |
|
|
void Error_Handler(void) |
|
|
void Error_Handler(void) |
|
|
{ |
|
|
{ |
|
|
/* USER CODE BEGIN Error_Handler_Debug */ |
|
|
|
|
|
/* User can add his own implementation to report the HAL error return state */ |
|
|
|
|
|
__disable_irq(); |
|
|
|
|
|
while (1) |
|
|
|
|
|
{ |
|
|
|
|
|
} |
|
|
|
|
|
/* USER CODE END Error_Handler_Debug */ |
|
|
|
|
|
|
|
|
/* USER CODE BEGIN Error_Handler_Debug */ |
|
|
|
|
|
/* User can add his own implementation to report the HAL error return state |
|
|
|
|
|
*/ |
|
|
|
|
|
__disable_irq(); |
|
|
|
|
|
while (1) |
|
|
|
|
|
{ |
|
|
|
|
|
} |
|
|
|
|
|
/* USER CODE END Error_Handler_Debug */ |
|
|
} |
|
|
} |
|
|
#ifdef USE_FULL_ASSERT |
|
|
#ifdef USE_FULL_ASSERT |
|
|
/** |
|
|
/** |
|
|
* @brief Reports the name of the source file and the source line number |
|
|
|
|
|
* where the assert_param error has occurred. |
|
|
|
|
|
* @param file: pointer to the source file name |
|
|
|
|
|
* @param line: assert_param error line source number |
|
|
|
|
|
* @retval None |
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
* @brief Reports the name of the source file and the source line number |
|
|
|
|
|
* where the assert_param error has occurred. |
|
|
|
|
|
* @param file: pointer to the source file name |
|
|
|
|
|
* @param line: assert_param error line source number |
|
|
|
|
|
* @retval None |
|
|
|
|
|
*/ |
|
|
void assert_failed(uint8_t *file, uint32_t line) |
|
|
void assert_failed(uint8_t *file, uint32_t line) |
|
|
{ |
|
|
{ |
|
|
/* USER CODE BEGIN 6 */ |
|
|
|
|
|
/* User can add his own implementation to report the file name and line number, |
|
|
|
|
|
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ |
|
|
|
|
|
/* USER CODE END 6 */ |
|
|
|
|
|
|
|
|
/* USER CODE BEGIN 6 */ |
|
|
|
|
|
/* User can add code to report the file name and line number, |
|
|
|
|
|
for example: printf("Wrong parameter: %s:%d\r\n", file, line) */ |
|
|
|
|
|
/* USER CODE END 6 */ |
|
|
} |
|
|
} |
|
|
#endif /* USE_FULL_ASSERT */ |
|
|
#endif /* USE_FULL_ASSERT */ |