diff --git a/Core/Src/main.c b/Core/Src/main.c index 6765981..4f3cc98 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -22,7 +22,6 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ -/* uC/OS-II的公开接口、任务类型和配置宏都由此头文件提供。 */ #include "ucos_ii.h" #include "modbus_rtu_slave.h" /* USER CODE END Includes */ @@ -48,16 +47,13 @@ DMA_HandleTypeDef hdma_usart1_rx; DMA_HandleTypeDef hdma_usart1_tx; /* USER CODE BEGIN PV */ -/* - * 每个任务必须拥有独立栈空间。 - * OS_STK在本工程中为32位,因此256个OS_STK占用1024字节RAM。 - * Cortex-M栈从高地址向低地址增长,创建任务时要把数组末元素作为栈顶传入。 - */ + static OS_STK AppTaskStartStk[APP_TASK_START_STK_SIZE]; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); +static HAL_StatusTypeDef BackupSramInit(void); static void MX_GPIO_Init(void); static void MX_DMA_Init(void); static void MX_USART1_UART_Init(void); @@ -71,14 +67,10 @@ static void AppTaskStart(void *p_arg); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ -/* - * uC/OS-II任务函数的固定形式是 void Task(void *p_arg)。 - * 任务通常包含一个永久循环;需要等待时应调用OS延时或等待内核对象, - * 让出CPU给其他就绪任务,而不是在任务里忙等待。 - */ + static void AppTaskStart(void *p_arg) { - /* 当前没有给任务传递参数,显式转换可避免编译器产生未使用警告。 */ + (void)p_arg; /* @@ -86,6 +78,7 @@ static void AppTaskStart(void *p_arg) * 初始化函数会立即启动USART1的DMA空闲接收。 */ ModbusSlaveInit(&huart1, MODBUS_SLAVE_DEFAULT_ADDRESS); + ModbusRetainedRegistersLoad(); while (1) { /* @@ -107,6 +100,7 @@ static void AppTaskStart(void *p_arg) * 每1ms轮询一次,不在串口中断中执行耗时的CRC和寄存器操作。 */ ModbusSlavePoll(); + ModbusRetainedRegistersPoll(); OSTimeDly(1U); } } @@ -146,6 +140,9 @@ int main(void) MX_DMA_Init(); MX_USB_DEVICE_Init(); MX_USART1_UART_Init(); + BackupSramInit(); + + /* USER CODE BEGIN 2 */ /* uC/OS-II接口通常用返回错误码的方式报告执行结果。 */ INT8U os_err; @@ -203,6 +200,14 @@ int main(void) /* USER CODE END 3 */ } +static HAL_StatusTypeDef BackupSramInit(void) +{ + HAL_PWR_EnableBkUpAccess(); + __HAL_RCC_BKPSRAM_CLK_ENABLE(); + + return HAL_PWREx_EnableBkUpReg(); +} + /** * @brief System Clock Configuration * @retval None @@ -268,7 +273,7 @@ static void MX_USART1_UART_Init(void) /* USER CODE END USART1_Init 1 */ huart1.Instance = USART1; - huart1.Init.BaudRate = 115200; + huart1.Init.BaudRate = 19200; huart1.Init.WordLength = UART_WORDLENGTH_9B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_EVEN; @@ -341,7 +346,7 @@ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { /* * DMA遇到串口空闲事件后进入这里。 - * 仅复制帧并重启DMA,协议解析由AppTaskStart任务完成。 + * 仅复制帧并重启DMA */ ModbusSlaveOnRxEvent(huart, Size); } diff --git a/EWARM/Modbus.ewp b/EWARM/Modbus.ewp index dc25351..adfa065 100644 --- a/EWARM/Modbus.ewp +++ b/EWARM/Modbus.ewp @@ -366,6 +366,7 @@ $PROJ_DIR$\..\Middlewares\Third_Party\Micrium\uC-CPU $PROJ_DIR$\..\Middlewares\Third_Party\Micrium\uC-CPU\ARM-Cortex-M4\IAR $PROJ_DIR$\..\Middlewares\Third_Party\Micrium\uC-LIB + $PROJ_DIR$\..\Modbus\Inc