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