@@ -64,7 +64,9 @@ | |||||
/* #define HAL_MMC_MODULE_ENABLED */ | /* #define HAL_MMC_MODULE_ENABLED */ | ||||
/* #define HAL_SPI_MODULE_ENABLED */ | /* #define HAL_SPI_MODULE_ENABLED */ | ||||
#define HAL_TIM_MODULE_ENABLED | #define HAL_TIM_MODULE_ENABLED | ||||
#ifndef HAL_UART_MODULE_ENABLED | |||||
#define HAL_UART_MODULE_ENABLED | #define HAL_UART_MODULE_ENABLED | ||||
#endif | |||||
/* #define HAL_USART_MODULE_ENABLED */ | /* #define HAL_USART_MODULE_ENABLED */ | ||||
/* #define HAL_IRDA_MODULE_ENABLED */ | /* #define HAL_IRDA_MODULE_ENABLED */ | ||||
/* #define HAL_SMARTCARD_MODULE_ENABLED */ | /* #define HAL_SMARTCARD_MODULE_ENABLED */ | ||||
@@ -58,6 +58,7 @@ void SysTick_Handler(void); | |||||
void TIM1_UP_TIM10_IRQHandler(void); | void TIM1_UP_TIM10_IRQHandler(void); | ||||
void USART1_IRQHandler(void); | void USART1_IRQHandler(void); | ||||
void TIM6_DAC_IRQHandler(void); | void TIM6_DAC_IRQHandler(void); | ||||
void DMA2_Stream0_IRQHandler(void); | |||||
void DMA2_Stream2_IRQHandler(void); | void DMA2_Stream2_IRQHandler(void); | ||||
void DMA2_Stream7_IRQHandler(void); | void DMA2_Stream7_IRQHandler(void); | ||||
/* USER CODE BEGIN EFP */ | /* USER CODE BEGIN EFP */ | ||||
@@ -32,7 +32,7 @@ extern "C" { | |||||
/* USER CODE END Includes */ | /* USER CODE END Includes */ | ||||
extern TIM_HandleTypeDef htim2; | |||||
extern TIM_HandleTypeDef htim2; // TIM2恢复用于脉冲计数 | |||||
extern TIM_HandleTypeDef htim6; | extern TIM_HandleTypeDef htim6; | ||||
@@ -56,9 +56,7 @@ extern TIM_HandleTypeDef htim14; | |||||
#define PLSR_PWM_PIN GPIO_PIN_6 // PF6 - TIM10_CH1 | #define PLSR_PWM_PIN GPIO_PIN_6 // PF6 - TIM10_CH1 | ||||
#define PLSR_PWM_PORT GPIOF | #define PLSR_PWM_PORT GPIOF | ||||
// 硬件计数器定义 (使用TIM2作为硬件计数器) | |||||
#define PLSR_COUNTER_PIN GPIO_PIN_5 // PA5 - TIM2_CH1 (外部时钟输入) | |||||
#define PLSR_COUNTER_PORT GPIOA | |||||
// TIM2硬件计数器已删除 - 改用TIM10中断计数 | |||||
// 等待条件类型枚举 | // 等待条件类型枚举 | ||||
typedef enum { | typedef enum { | ||||
@@ -83,8 +81,8 @@ typedef enum { | |||||
PLSR_STATE_ACCEL = 1, // 加速状态 | PLSR_STATE_ACCEL = 1, // 加速状态 | ||||
PLSR_STATE_CONST = 2, // 匀速状态 | PLSR_STATE_CONST = 2, // 匀速状态 | ||||
PLSR_STATE_DECEL = 3, // 减速状态 | PLSR_STATE_DECEL = 3, // 减速状态 | ||||
PLSR_STATE_WAIT = 4, // 等待状态 | |||||
PLSR_STATE_STOP = 5 // 停止状态 | |||||
PLSR_STATE_WAIT = 4 // 等待状态 | |||||
// 注意:移除了PLSR_STATE_STOP状态,减速到0频率时直接进入等待状态 | |||||
} PLSR_RunState_t; | } PLSR_RunState_t; | ||||
// 路径状态枚举 | // 路径状态枚举 | ||||
@@ -115,7 +113,7 @@ typedef enum { | |||||
} PLSR_Direction_t; | } PLSR_Direction_t; | ||||
/* USER CODE END Private defines */ | /* USER CODE END Private defines */ | ||||
void MX_TIM2_Init(void); | |||||
void MX_TIM2_Init(void); // TIM2恢复用于脉冲计数 | |||||
void MX_TIM6_Init(void); | void MX_TIM6_Init(void); | ||||
void MX_TIM10_Init(void); | void MX_TIM10_Init(void); | ||||
void MX_TIM11_Init(void); | void MX_TIM11_Init(void); | ||||
@@ -147,7 +145,6 @@ typedef struct { | |||||
uint32_t target_pulse; // 目标脉冲数 | uint32_t target_pulse; // 目标脉冲数 | ||||
uint8_t next_section; // 下一段号(0表示结束) | uint8_t next_section; // 下一段号(0表示结束) | ||||
PLSR_SectionState_t section_state; // 段状态 | PLSR_SectionState_t section_state; // 段状态 | ||||
PLSR_AccelConfig_t accel_config; // 加减速配置 | |||||
PLSR_WaitCondition_t wait_condition; // 等待条件 | PLSR_WaitCondition_t wait_condition; // 等待条件 | ||||
} PLSR_SectionConfig_t; | } PLSR_SectionConfig_t; | ||||
@@ -164,6 +161,7 @@ typedef struct { | |||||
uint8_t output_port; // 输出端口选择 | uint8_t output_port; // 输出端口选择 | ||||
PLSR_Mode_t mode; // 模式(相对/绝对) | PLSR_Mode_t mode; // 模式(相对/绝对) | ||||
PLSR_Direction_t direction; // 方向 | PLSR_Direction_t direction; // 方向 | ||||
PLSR_AccelConfig_t accel_config; // 加减速配置 | |||||
// 运行状态参数 | // 运行状态参数 | ||||
PLSR_RunState_t run_state; // 运行状态 | PLSR_RunState_t run_state; // 运行状态 | ||||
@@ -184,6 +182,7 @@ typedef struct { | |||||
#define PLSR_DEFAULT_ACT_TIME_MS 200 // 默认ACT时间200ms | #define PLSR_DEFAULT_ACT_TIME_MS 200 // 默认ACT时间200ms | ||||
#define PLSR_DEFAULT_WAIT_TIME_MS 200 // 默认等待时间200ms | #define PLSR_DEFAULT_WAIT_TIME_MS 200 // 默认等待时间200ms | ||||
#define PLSR_DEFAULT_START_SECTION 0 // 默认起始段编号 | #define PLSR_DEFAULT_START_SECTION 0 // 默认起始段编号 | ||||
#define PLSR_TASK_CHECK_INTERVAL 100 // 每100个脉冲通知任务一次 | |||||
@@ -195,12 +194,15 @@ void PLSR_PWM_Init(void); | |||||
void PLSR_PWM_Start(void); | void PLSR_PWM_Start(void); | ||||
void PLSR_PWM_Stop(void); | void PLSR_PWM_Stop(void); | ||||
void PLSR_PWM_SetFrequency(uint32_t frequency); | void PLSR_PWM_SetFrequency(uint32_t frequency); | ||||
void PLSR_PWM_SetFrequency_Immediate(uint32_t frequency); | |||||
// ==================== PLSR计数器控制函数 ==================== | // ==================== PLSR计数器控制函数 ==================== | ||||
uint32_t PLSR_Counter_GetCount(void); //<暂时无用 | |||||
// ==================== PLSR计数器控制函数 ==================== | |||||
void PLSR_Counter_Init(void); | |||||
void PLSR_Counter_Start(void); | |||||
void PLSR_Counter_Stop(void); | |||||
void PLSR_Counter_Reset(void); | void PLSR_Counter_Reset(void); | ||||
void PLSR_Counter_SetTarget(uint32_t target); //<考虑配置定时器2中断,中断触发后执行段切换 | |||||
uint32_t PLSR_Counter_GetTarget(void); //<暂时无用 | |||||
uint32_t PLSR_Counter_GetCount(void); | |||||
// ==================== PLSR TIM6频率配置函数 ==================== | // ==================== PLSR TIM6频率配置函数 ==================== | ||||
void PLSR_TIM6_SetUpdateFreq(uint32_t freq_us); | void PLSR_TIM6_SetUpdateFreq(uint32_t freq_us); | ||||
@@ -221,7 +223,6 @@ uint8_t PLSR_Section_CheckWaitCondition(PLSR_RouteConfig_t* route); | |||||
void PLSR_Section_CalculateConstPulse(PLSR_RouteConfig_t* route); | void PLSR_Section_CalculateConstPulse(PLSR_RouteConfig_t* route); | ||||
// ==================== PLSR加减速算法函数 ==================== | // ==================== PLSR加减速算法函数 ==================== | ||||
float PLSR_Accel_CalculateLinear(float progress); | |||||
float PLSR_Accel_CalculateCurve(float progress); | float PLSR_Accel_CalculateCurve(float progress); | ||||
float PLSR_Accel_CalculateSine(float progress); | float PLSR_Accel_CalculateSine(float progress); | ||||
void PLSR_Accel_Process(PLSR_RouteConfig_t* route); | void PLSR_Accel_Process(PLSR_RouteConfig_t* route); | ||||
@@ -240,9 +241,13 @@ uint32_t PLSR_GetSystemTick(void); | |||||
uint32_t PLSR_PWM_GetFrequency(void); | uint32_t PLSR_PWM_GetFrequency(void); | ||||
void PLSR_PWM_SetDutyCycle(uint8_t duty_percent); | void PLSR_PWM_SetDutyCycle(uint8_t duty_percent); | ||||
// UCOSII任务相关函数 | |||||
uint8_t PLSR_CheckTaskNotification(void); | |||||
void PLSR_Task_SectionProcess(PLSR_RouteConfig_t* route); | |||||
// ==================== PLSR全局变量声明 ==================== | // ==================== PLSR全局变量声明 ==================== | ||||
extern PLSR_RouteConfig_t g_plsr_route; // 全局PLSR路径控制结构体 | extern PLSR_RouteConfig_t g_plsr_route; // 全局PLSR路径控制结构体 | ||||
extern uint32_t g_plsr_system_tick; // 系统时钟计数器 | |||||
// g_plsr_system_tick已删除 - 不再使用UCOSII时间基准 | |||||
extern uint8_t g_plsr_ext_event_flag; // 外部事件标志 | extern uint8_t g_plsr_ext_event_flag; // 外部事件标志 | ||||
/* USER CODE END Prototypes */ | /* USER CODE END Prototypes */ | ||||
@@ -29,19 +29,85 @@ extern "C" { | |||||
#include "main.h" | #include "main.h" | ||||
/* USER CODE BEGIN Includes */ | /* USER CODE BEGIN Includes */ | ||||
#include <stdio.h> | |||||
#include <string.h> | |||||
#include <ctype.h> | |||||
#include <stdlib.h> | |||||
#include <stdarg.h> | |||||
#include "modbus_crc.h" | |||||
#include "flash_save.h" | |||||
#include "modbus_log.h" | |||||
/* USER CODE END Includes */ | /* USER CODE END Includes */ | ||||
extern UART_HandleTypeDef huart1; | extern UART_HandleTypeDef huart1; | ||||
/* USER CODE BEGIN Private defines */ | /* USER CODE BEGIN Private defines */ | ||||
///> ==================== 寄存器配置 ==================== | |||||
#define MODBUS_HOLDING_REG_COUNT 1200 ///> 保持寄存器数量 (40001-49999) | |||||
#define MODBUS_COIL_COUNT 256 ///> 线圈数量 (00001-09999) | |||||
#define SRAM_HOLDING_REG_COUNT 256 ///> SRAM保持寄存器数量 (60001-69999) | |||||
#define SRAM_HOLDING_COIL_COUNT 1000 ///> SRAM保持寄存器数量 (60001-69999) | |||||
///> ==================== Modbus功能码定义 ==================== | |||||
#define MODBUS_FC_READ_COILS 0x01 ///> 读线圈状态 | |||||
#define MODBUS_FC_READ_HOLDING_REGS 0x03 ///> 读保持寄存器 | |||||
#define MODBUS_FC_WRITE_REG 0x06 | |||||
#define MODBUS_FC_WRITE_MULTIPLE_COILS 0x0F ///> 写多个线圈 | |||||
#define MODBUS_FC_WRITE_MULTIPLE_REGS 0x10 ///> 写多个保持寄存器 | |||||
#define MODBUS_FC_SEND_LOG 0x46 ///> 发送Modbus日志 | |||||
///> ==================== Modbus异常码定义 ==================== | |||||
#define MODBUS_EX_NONE 0x00 ///> 无异常 | |||||
#define MODBUS_EX_ILLEGAL_FUNCTION 0x01 ///> 非法功能码 | |||||
#define MODBUS_EX_ILLEGAL_DATA_ADDRESS 0x02 ///> 非法数据地址 | |||||
#define MODBUS_EX_ILLEGAL_DATA_VALUE 0x03 ///> 数据帧长度异常 | |||||
#define MODBUS_EX_ILLEGAL_COUNT 0x04 ///> 非法寄存器数量 | |||||
#define USART1_RX_BUFFER_SIZE 256 | |||||
#define USART1_TX_BUFFER_SIZE 256 | |||||
///> ==================== Modbus从机配置结构体 ==================== | |||||
typedef struct | |||||
{ | |||||
uint8_t slave_address; ///> 从机地址 | |||||
uint16_t holding_regs[MODBUS_HOLDING_REG_COUNT]; ///> 保持寄存器 (40001-49999) | |||||
uint8_t coils[MODBUS_COIL_COUNT/8 + 1]; ///> 线圈状态 (00001-09999) | |||||
} ModbusSlave_t; | |||||
/* USER CODE END Private defines */ | /* USER CODE END Private defines */ | ||||
void MX_USART1_UART_Init(void); | void MX_USART1_UART_Init(void); | ||||
/* USER CODE BEGIN Prototypes */ | /* USER CODE BEGIN Prototypes */ | ||||
// Modbus从机实例 | |||||
extern ModbusSlave_t ModbusSlave; | |||||
// USART1缓冲区变量 | |||||
extern uint8_t usart1_rx_buffer[USART1_RX_BUFFER_SIZE]; | |||||
extern volatile uint16_t usart1_rx_head; | |||||
extern volatile uint16_t usart1_rx_tail; | |||||
extern uint16_t Usart1_Rx_Count; | |||||
extern uint8_t usart1_dma_rx_buffer[USART1_RX_BUFFER_SIZE]; | |||||
extern volatile uint16_t usart1_dma_rx_len; | |||||
extern uint8_t usart1_dma_tx_buffer[USART1_TX_BUFFER_SIZE]; | |||||
extern volatile uint8_t usart1_tx_busy; | |||||
// Modbus功能函数 | |||||
void Modbus_Init(uint8_t slave_addr); | |||||
void Modbus_Process(void); | |||||
void Modbus_SetHoldingRegister(uint16_t addr, uint16_t value); | |||||
uint16_t Modbus_GetHoldingRegister(uint16_t addr); | |||||
void Modbus_SetCoil(uint16_t addr, uint8_t value); | |||||
uint8_t Modbus_GetCoil(uint16_t addr); | |||||
void Modbus_Handle_SendLog(uint8_t* frame, uint16_t length); | |||||
void Modbus_Process_Write_Reg(uint8_t *frame, uint16_t length); | |||||
// USART功能函数 | |||||
void USART1_SendData(uint8_t* data, uint16_t len); | |||||
uint8_t USART1_SendData_DMA(uint8_t* data, uint16_t len); | |||||
int fputc(int ch, FILE *f); | |||||
// 中断处理函数 | |||||
void USART1_IDLE_IRQHandler(void); | |||||
/* USER CODE END Prototypes */ | /* USER CODE END Prototypes */ | ||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
@@ -47,18 +47,31 @@ void MX_GPIO_Init(void) | |||||
/* GPIO Ports Clock Enable */ | /* GPIO Ports Clock Enable */ | ||||
__HAL_RCC_GPIOB_CLK_ENABLE(); | __HAL_RCC_GPIOB_CLK_ENABLE(); | ||||
__HAL_RCC_GPIOA_CLK_ENABLE(); | __HAL_RCC_GPIOA_CLK_ENABLE(); | ||||
__HAL_RCC_GPIOG_CLK_ENABLE(); | |||||
__HAL_RCC_GPIOH_CLK_ENABLE(); | __HAL_RCC_GPIOH_CLK_ENABLE(); | ||||
__HAL_RCC_GPIOF_CLK_ENABLE(); | __HAL_RCC_GPIOF_CLK_ENABLE(); | ||||
/*Configure GPIO pin Output Level */ | /*Configure GPIO pin Output Level */ | ||||
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6|GPIO_PIN_8, GPIO_PIN_RESET); | |||||
HAL_GPIO_WritePin(GPIOH, GPIO_PIN_6|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_7, GPIO_PIN_RESET); | |||||
/*Configure GPIO pins : PF6 PF8 */ | |||||
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_8; | |||||
/*Configure GPIO pin : PB5 */ | |||||
GPIO_InitStruct.Pin = GPIO_PIN_5; | |||||
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; | |||||
GPIO_InitStruct.Pull = GPIO_NOPULL; | |||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); | |||||
/*Configure GPIO pin : PG12 */ | |||||
GPIO_InitStruct.Pin = GPIO_PIN_12; | |||||
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; | |||||
GPIO_InitStruct.Pull = GPIO_NOPULL; | |||||
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); | |||||
/*Configure GPIO pins : PH6 PH8 PH9 PH7 */ | |||||
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_7; | |||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; | GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; | ||||
GPIO_InitStruct.Pull = GPIO_NOPULL; | GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | ||||
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); | |||||
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); | |||||
} | } | ||||
@@ -27,6 +27,7 @@ | |||||
#include "tim.h" | #include "tim.h" | ||||
#include "usart.h" | #include "usart.h" | ||||
#include "dma.h" | #include "dma.h" | ||||
#include "flash_save.h" | |||||
/* USER CODE END Includes */ | /* USER CODE END Includes */ | ||||
/* Private typedef -----------------------------------------------------------*/ | /* Private typedef -----------------------------------------------------------*/ | ||||
@@ -49,13 +50,13 @@ | |||||
/* USER CODE BEGIN PV */ | /* USER CODE BEGIN PV */ | ||||
/* 任务堆栈定义 */ | /* 任务堆栈定义 */ | ||||
static OS_STK StartupTaskStk[APP_CFG_STARTUP_TASK_STK_SIZE]; | static OS_STK StartupTaskStk[APP_CFG_STARTUP_TASK_STK_SIZE]; | ||||
static OS_STK LedTaskStk[APP_CFG_LED_TASK_STK_SIZE]; | |||||
static OS_STK MODBUSTaskStk[APP_CFG_MODBUS_TASK_STK_SIZE]; | |||||
static OS_STK KeyTaskStk[APP_CFG_KEY_TASK_STK_SIZE]; | static OS_STK KeyTaskStk[APP_CFG_KEY_TASK_STK_SIZE]; | ||||
// 全局加速配置 | // 全局加速配置 | ||||
//static PLSR_AccelProfile_t motor_profile; | //static PLSR_AccelProfile_t motor_profile; | ||||
/* 任务函数声明 */ | /* 任务函数声明 */ | ||||
static void StartupTask(void *p_arg); | static void StartupTask(void *p_arg); | ||||
static void LedTask(void *p_arg); | |||||
static void MODBUSTask(void *p_arg); | |||||
static void KeyTask(void *p_arg); | static void KeyTask(void *p_arg); | ||||
/* USER CODE END PV */ | /* USER CODE END PV */ | ||||
@@ -97,11 +98,11 @@ int main(void) | |||||
/* USER CODE END SysInit */ | /* USER CODE END SysInit */ | ||||
/* Initialize all configured peripherals */ | /* Initialize all configured peripherals */ | ||||
//MX_GPIO_Init(); | |||||
MX_GPIO_Init(); | |||||
MX_USART1_UART_Init(); | MX_USART1_UART_Init(); | ||||
MX_DMA_Init(); | MX_DMA_Init(); | ||||
PLSR_PWM_Init(); | |||||
PLSR_Route_Init(&g_plsr_route); | |||||
/* 初始化备份SRAM和DMA */ | |||||
BackupSRAM_Init(); | |||||
/* USER CODE BEGIN 2 */ | /* USER CODE BEGIN 2 */ | ||||
/* 初始化uC/OS-II */ | /* 初始化uC/OS-II */ | ||||
@@ -191,18 +192,23 @@ static void StartupTask(void *p_arg) | |||||
/* 初始化SysTick */ | /* 初始化SysTick */ | ||||
OS_CPU_SysTickInitFreq(SystemCoreClock); | OS_CPU_SysTickInitFreq(SystemCoreClock); | ||||
PLSR_PWM_Init(); | |||||
PLSR_Route_Init(&g_plsr_route); | |||||
/* 启用统计任务 */ | /* 启用统计任务 */ | ||||
#if OS_TASK_STAT_EN > 0u | #if OS_TASK_STAT_EN > 0u | ||||
OSStatInit(); | OSStatInit(); | ||||
#endif | #endif | ||||
/* 创建启动任务 */ | /* 创建启动任务 */ | ||||
err = OSTaskCreateExt(LedTask, | |||||
err = OSTaskCreateExt(MODBUSTask, | |||||
(void *)0, | (void *)0, | ||||
&LedTaskStk[APP_CFG_LED_TASK_STK_SIZE - 1], | |||||
APP_CFG_LED_TASK_PRIO, | |||||
APP_CFG_LED_TASK_PRIO, | |||||
&LedTaskStk[0], | |||||
APP_CFG_LED_TASK_STK_SIZE, | |||||
&MODBUSTaskStk[APP_CFG_MODBUS_TASK_STK_SIZE - 1], | |||||
APP_CFG_MODBUS_TASK_PRIO, | |||||
APP_CFG_MODBUS_TASK_PRIO, | |||||
&MODBUSTaskStk[0], | |||||
APP_CFG_MODBUS_TASK_STK_SIZE, | |||||
(void *)0, | (void *)0, | ||||
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); | OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); | ||||
/* 创建启动任务 */ | /* 创建启动任务 */ | ||||
@@ -224,22 +230,15 @@ static void StartupTask(void *p_arg) | |||||
/* 启动任务完成,删除自身 */ | /* 启动任务完成,删除自身 */ | ||||
OSTaskDel(OS_PRIO_SELF); | OSTaskDel(OS_PRIO_SELF); | ||||
} | } | ||||
static void LedTask(void *p_arg) | |||||
static void MODBUSTask(void *p_arg) | |||||
{ | { | ||||
(void)p_arg; | (void)p_arg; | ||||
uint8_t data = 0; | uint8_t data = 0; | ||||
while (1) | while (1) | ||||
{ | { | ||||
// if(HAL_UART_Receive(&huart1, &data, sizeof(data), 10) != HAL_OK) | |||||
// { | |||||
// // 接收超时或错误处理 | |||||
// HAL_UART_Transmit(&huart1, (uint8_t *)"Receive Error\r\n", 15, 10); | |||||
// } | |||||
// else | |||||
// { | |||||
// HAL_UART_Transmit(&huart1, &data, sizeof(data), 10); | |||||
// } | |||||
OSTimeDlyHMSM(0, 0, 0, 10); /* 延时10ms */ | |||||
Modbus_Process(); | |||||
OSTimeDlyHMSM(0, 0, 0, 10); /* 延时10ms */ | |||||
} | } | ||||
@@ -250,6 +249,7 @@ static void KeyTask(void *p_arg) | |||||
PLSR_Route_Start(&g_plsr_route); | PLSR_Route_Start(&g_plsr_route); | ||||
while (1) | while (1) | ||||
{ | { | ||||
OSTimeDlyHMSM(0, 0, 0, 10); /* 延时10ms */ | OSTimeDlyHMSM(0, 0, 0, 10); /* 延时10ms */ | ||||
} | } | ||||
} | } | ||||
@@ -281,7 +281,7 @@ void Error_Handler(void) | |||||
* @param line: assert_param error line source number | * @param line: assert_param error line source number | ||||
* @retval None | * @retval None | ||||
*/ | */ | ||||
void assert_failed(uint8_t *file, uint32_t line) | |||||
void assert_faiMODBUS(uint8_t *file, uint32_t line) | |||||
{ | { | ||||
/* USER CODE BEGIN 6 */ | /* USER CODE BEGIN 6 */ | ||||
/* User can add his own implementation to report the file name and line number, | /* User can add his own implementation to report the file name and line number, | ||||
@@ -49,6 +49,7 @@ extern DMA_HandleTypeDef hdma_usart1_rx; | |||||
extern DMA_HandleTypeDef hdma_usart1_tx; | extern DMA_HandleTypeDef hdma_usart1_tx; | ||||
extern UART_HandleTypeDef huart1; | extern UART_HandleTypeDef huart1; | ||||
extern TIM_HandleTypeDef htim1; | extern TIM_HandleTypeDef htim1; | ||||
extern DMA_HandleTypeDef hdma_backup; | |||||
/* USER CODE END PV */ | /* USER CODE END PV */ | ||||
/* Private function prototypes -----------------------------------------------*/ | /* Private function prototypes -----------------------------------------------*/ | ||||
@@ -226,11 +227,16 @@ void TIM1_UP_TIM10_IRQHandler(void) | |||||
void USART1_IRQHandler(void) | void USART1_IRQHandler(void) | ||||
{ | { | ||||
/* USER CODE BEGIN USART1_IRQn 0 */ | /* USER CODE BEGIN USART1_IRQn 0 */ | ||||
OSIntEnter(); | |||||
// 处理UART空闲中断 | |||||
extern void USART1_IDLE_IRQHandler(void); | |||||
USART1_IDLE_IRQHandler(); | |||||
/* USER CODE END USART1_IRQn 0 */ | /* USER CODE END USART1_IRQn 0 */ | ||||
HAL_UART_IRQHandler(&huart1); | HAL_UART_IRQHandler(&huart1); | ||||
/* USER CODE BEGIN USART1_IRQn 1 */ | /* USER CODE BEGIN USART1_IRQn 1 */ | ||||
OSIntExit(); | |||||
/* USER CODE END USART1_IRQn 1 */ | /* USER CODE END USART1_IRQn 1 */ | ||||
} | } | ||||
@@ -254,11 +260,11 @@ void TIM6_DAC_IRQHandler(void) | |||||
void DMA2_Stream2_IRQHandler(void) | void DMA2_Stream2_IRQHandler(void) | ||||
{ | { | ||||
/* USER CODE BEGIN DMA2_Stream2_IRQn 0 */ | /* USER CODE BEGIN DMA2_Stream2_IRQn 0 */ | ||||
OSIntEnter(); | |||||
/* USER CODE END DMA2_Stream2_IRQn 0 */ | /* USER CODE END DMA2_Stream2_IRQn 0 */ | ||||
HAL_DMA_IRQHandler(&hdma_usart1_rx); | HAL_DMA_IRQHandler(&hdma_usart1_rx); | ||||
/* USER CODE BEGIN DMA2_Stream2_IRQn 1 */ | /* USER CODE BEGIN DMA2_Stream2_IRQn 1 */ | ||||
OSIntExit(); | |||||
/* USER CODE END DMA2_Stream2_IRQn 1 */ | /* USER CODE END DMA2_Stream2_IRQn 1 */ | ||||
} | } | ||||
@@ -268,14 +274,23 @@ void DMA2_Stream2_IRQHandler(void) | |||||
void DMA2_Stream7_IRQHandler(void) | void DMA2_Stream7_IRQHandler(void) | ||||
{ | { | ||||
/* USER CODE BEGIN DMA2_Stream7_IRQn 0 */ | /* USER CODE BEGIN DMA2_Stream7_IRQn 0 */ | ||||
OSIntEnter(); | |||||
/* USER CODE END DMA2_Stream7_IRQn 0 */ | /* USER CODE END DMA2_Stream7_IRQn 0 */ | ||||
HAL_DMA_IRQHandler(&hdma_usart1_tx); | HAL_DMA_IRQHandler(&hdma_usart1_tx); | ||||
/* USER CODE BEGIN DMA2_Stream7_IRQn 1 */ | /* USER CODE BEGIN DMA2_Stream7_IRQn 1 */ | ||||
OSIntExit(); | |||||
/* USER CODE END DMA2_Stream7_IRQn 1 */ | /* USER CODE END DMA2_Stream7_IRQn 1 */ | ||||
} | } | ||||
void DMA2_Stream0_IRQHandler(void) | |||||
{ | |||||
OSIntEnter(); | |||||
HAL_DMA_IRQHandler(&hdma_backup); | |||||
OSIntExit(); | |||||
} | |||||
/* USER CODE BEGIN 1 */ | /* USER CODE BEGIN 1 */ | ||||
/* USER CODE END 1 */ | /* USER CODE END 1 */ |
@@ -24,14 +24,38 @@ | |||||
/* USER CODE BEGIN 0 */ | /* USER CODE BEGIN 0 */ | ||||
// ==================== PLSR全局变量定义 ==================== | // ==================== PLSR全局变量定义 ==================== | ||||
PLSR_RouteConfig_t g_plsr_route; // 全局PLSR路径控制结构体 | PLSR_RouteConfig_t g_plsr_route; // 全局PLSR路径控制结构体 | ||||
uint32_t g_plsr_system_tick = 0; // 系统时钟计数器(ms) | |||||
// g_plsr_system_tick已删除 - 不再使用UCOSII时间基准 | |||||
uint8_t g_plsr_ext_event_flag = 0; // 外部事件标志 | uint8_t g_plsr_ext_event_flag = 0; // 外部事件标志 | ||||
// ==================== PLSR内部变量 ==================== | // ==================== PLSR内部变量 ==================== | ||||
static uint32_t s_tim6_update_freq_us = 1000; // TIM6更新频率(微秒) | static uint32_t s_tim6_update_freq_us = 1000; // TIM6更新频率(微秒) | ||||
static uint32_t s_current_pwm_freq = 0; // 当前PWM频率 | static uint32_t s_current_pwm_freq = 0; // 当前PWM频率 | ||||
static uint8_t s_pwm_running = 0; // PWM运行状态 | static uint8_t s_pwm_running = 0; // PWM运行状态 | ||||
static uint32_t s_target_pulse_count = 0; // 目标脉冲计数 | |||||
// static uint32_t s_target_pulse_count = 0; // 目标脉冲计数 - 暂时注释掉未使用的变量 | |||||
// ==================== 等待时间相关变量 ==================== | |||||
static volatile uint32_t s_wait_time_counter = 0; // 等待时间计数器 | |||||
static volatile uint32_t s_wait_time_target = 0; // 等待时间目标值 | |||||
static volatile uint8_t s_wait_time_flag = 0; // 等待时间到达标志 | |||||
static volatile uint32_t s_act_time_counter = 0; // ACT时间计数器 | |||||
static volatile uint32_t s_act_time_target = 0; // ACT时间目标值 | |||||
static volatile uint8_t s_act_time_flag = 0; // ACT时间到达标志 | |||||
// 频率更新相关静态变量 | |||||
static volatile uint8_t s_freq_update_pending = 0; // 频率更新挂起标志 | |||||
static volatile uint16_t s_next_prescaler = 0; // 下一个预分频器值 | |||||
static volatile uint32_t s_next_period = 0; // 下一个周期值 | |||||
static volatile uint8_t s_task_notification_flag = 0; // 任务通知标志 | |||||
static uint32_t s_pulse_check_counter = 0; // 脉冲检查计数器 | |||||
// ==================== PLSR辅助函数声明 ==================== | |||||
static void PLSR_Section_StartNewSection(PLSR_RouteConfig_t* route); | |||||
static void PLSR_Accel_CalculateSteps(PLSR_RouteConfig_t* route, uint32_t time_ms, uint8_t is_accel); | |||||
static void PLSR_Section_ProcessConstSpeed(PLSR_RouteConfig_t* route); | |||||
static void PLSR_Section_ProcessWait(PLSR_RouteConfig_t* route); | |||||
static uint8_t PLSR_Section_CheckPulseComplete(PLSR_RouteConfig_t* route); | |||||
static void PLSR_Section_CheckTransition(PLSR_RouteConfig_t* route); | |||||
static void PLSR_CalculateTimerParams(uint32_t frequency, uint16_t* prescaler, uint32_t* period); | |||||
// ==================== PLSR等待条件处理函数实现 ==================== | // ==================== PLSR等待条件处理函数实现 ==================== | ||||
/** | /** | ||||
@@ -47,21 +71,26 @@ void PLSR_Wait_StartTimer(PLSR_RouteConfig_t* route) | |||||
PLSR_SectionConfig_t* current_section = &route->section[route->current_section_num - 1]; | PLSR_SectionConfig_t* current_section = &route->section[route->current_section_num - 1]; | ||||
PLSR_WaitCondition_t* wait_cond = ¤t_section->wait_condition; | PLSR_WaitCondition_t* wait_cond = ¤t_section->wait_condition; | ||||
// 记录当前时间作为起始时间 | |||||
// 根据等待类型设置TIM6计时器 | |||||
switch (wait_cond->wait_type) { | switch (wait_cond->wait_type) { | ||||
case PLSR_WAIT_TIME: | case PLSR_WAIT_TIME: | ||||
route->wait_start_tick = g_plsr_system_tick; | |||||
break; | |||||
case PLSR_WAIT_CONDITION: //<停止条件不需要计数器 | |||||
s_wait_time_target = wait_cond->wait_time_ms; | |||||
s_wait_time_counter = 0; | |||||
s_wait_time_flag = 0; | |||||
PLSR_TIM6_Start(); | |||||
break; | break; | ||||
case PLSR_WAIT_ACT_TIME: | case PLSR_WAIT_ACT_TIME: | ||||
route->act_start_tick = g_plsr_system_tick; | |||||
s_act_time_target = wait_cond->act_time_ms; | |||||
s_act_time_counter = 0; | |||||
s_act_time_flag = 0; | |||||
PLSR_TIM6_Start(); | |||||
break; | break; | ||||
case PLSR_WAIT_CONDITION: | |||||
case PLSR_WAIT_EXT_EVENT: | case PLSR_WAIT_EXT_EVENT: | ||||
case PLSR_WAIT_EXT_OR_END: | case PLSR_WAIT_EXT_OR_END: | ||||
// 外部事件不需要计时器 | |||||
// 这些条件不需要TIM6计时器 | |||||
break; | break; | ||||
default: | default: | ||||
@@ -79,10 +108,16 @@ uint8_t PLSR_Wait_CheckTimeCondition(PLSR_RouteConfig_t* route) | |||||
{ | { | ||||
if (route == NULL) return 0; | if (route == NULL) return 0; | ||||
PLSR_SectionConfig_t* current_section = &route->section[route->current_section_num - 1]; | |||||
uint32_t elapsed_time = g_plsr_system_tick - route->wait_start_tick; | |||||
// 检查等待时间标志位 | |||||
if (s_wait_time_flag) { | |||||
// 清除标志位和停止计时器 | |||||
s_wait_time_flag = 0; | |||||
s_wait_time_target = 0; | |||||
PLSR_TIM6_Stop(); | |||||
return 1; // 等待时间已到 | |||||
} | |||||
return (elapsed_time >= current_section->wait_condition.wait_time_ms) ? 1 : 0; | |||||
return 0; // 等待时间未到 | |||||
} | } | ||||
/** | /** | ||||
@@ -95,10 +130,16 @@ uint8_t PLSR_Wait_CheckActTime(PLSR_RouteConfig_t* route) | |||||
{ | { | ||||
if (route == NULL) return 0; | if (route == NULL) return 0; | ||||
PLSR_SectionConfig_t* current_section = &route->section[route->current_section_num - 1]; | |||||
uint32_t elapsed_time = g_plsr_system_tick - route->act_start_tick; | |||||
// 检查ACT时间标志位 | |||||
if (s_act_time_flag) { | |||||
// 清除标志位和停止计时器 | |||||
s_act_time_flag = 0; | |||||
s_act_time_target = 0; | |||||
PLSR_TIM6_Stop(); | |||||
return 1; // ACT时间已到 | |||||
} | |||||
return (elapsed_time >= current_section->wait_condition.act_time_ms) ? 1 : 0; | |||||
return 0; // ACT时间未到 | |||||
} | } | ||||
/** | /** | ||||
@@ -160,21 +201,92 @@ void PLSR_SetSectionCondition(PLSR_RouteConfig_t* route, uint8_t section_num, ui | |||||
*/ | */ | ||||
uint32_t PLSR_GetSystemTick(void) | uint32_t PLSR_GetSystemTick(void) | ||||
{ | { | ||||
return g_plsr_system_tick; | |||||
return s_wait_time_counter; | |||||
} | } | ||||
// ==================== PLSR辅助函数声明 ==================== | |||||
static void PLSR_Section_StartNewSection(PLSR_RouteConfig_t* route); | |||||
static void PLSR_Accel_CalculateSteps(PLSR_RouteConfig_t* route, uint32_t time_ms, uint8_t is_accel); | |||||
static void PLSR_Section_ProcessConstSpeed(PLSR_RouteConfig_t* route); | |||||
static void PLSR_Section_ProcessWait(PLSR_RouteConfig_t* route); | |||||
static uint8_t PLSR_Section_CheckPulseComplete(PLSR_RouteConfig_t* route); | |||||
static void PLSR_Section_CheckTransition(PLSR_RouteConfig_t* route); | |||||
static void PLSR_CalculateTimerParams(uint32_t frequency, uint16_t* prescaler, uint32_t* period); | |||||
/** | |||||
* @brief 检查任务通知标志 | |||||
* @retval 1: 有通知, 0: 无通知 | |||||
* | |||||
* 该函数用于UCOSII任务中检查是否需要进行段处理。 | |||||
* 调用后会自动清除通知标志。 | |||||
*/ | |||||
uint8_t PLSR_CheckTaskNotification(void) | |||||
{ | |||||
if(s_task_notification_flag) | |||||
{ | |||||
s_task_notification_flag = 0; | |||||
return 1; | |||||
} | |||||
return 0; | |||||
} | |||||
/** | |||||
* @brief 任务级段处理函数 | |||||
* @param route 路径控制结构体指针 | |||||
* | |||||
* 该函数在UCOSII任务中调用,负责处理段切换逻辑。 | |||||
* 与中断级的频率更新分离,避免中断处理时间过长。 | |||||
*/ | |||||
void PLSR_Task_SectionProcess(PLSR_RouteConfig_t* route) | |||||
{ | |||||
// 参数有效性检查 | |||||
if (route == NULL) return; | |||||
if (route->route_state != PLSR_ROUTE_RUNNING) return; | |||||
// 段号有效性检查 | |||||
if (route->current_section_num == 0 || route->current_section_num > PLSR_MAX_SECTIONS) { | |||||
PLSR_Route_Stop(route); | |||||
return; | |||||
} | |||||
// 处理特殊等待条件(ACT_TIME和EXT_EVENT需要实时处理) | |||||
if(route->section[route->current_section_num-1].wait_condition.wait_type == PLSR_WAIT_ACT_TIME | |||||
|| route->section[route->current_section_num-1].wait_condition.wait_type == PLSR_WAIT_EXT_EVENT) | |||||
{ | |||||
PLSR_Section_ProcessWait(route); | |||||
} | |||||
// 根据当前运行状态执行相应的处理逻辑 | |||||
switch (route->run_state) | |||||
{ | |||||
case PLSR_STATE_IDLE: | |||||
// 空闲状态:开始新段处理 | |||||
PLSR_Section_StartNewSection(route); | |||||
break; | |||||
case PLSR_STATE_ACCEL: | |||||
// 加速状态:加速处理在TIM10中断中进行,任务中只检查状态转换 | |||||
PLSR_Section_CheckTransition(route); | |||||
break; | |||||
case PLSR_STATE_CONST: | |||||
// 匀速状态:保持目标频率运行 | |||||
PLSR_Section_ProcessConstSpeed(route); | |||||
break; | |||||
case PLSR_STATE_DECEL: | |||||
// 减速状态:减速处理在TIM10中断中进行,任务中只检查状态转换 | |||||
PLSR_Section_CheckTransition(route); | |||||
break; | |||||
case PLSR_STATE_WAIT: | |||||
// 等待状态:处理等待条件 | |||||
PLSR_Section_ProcessWait(route); | |||||
break; | |||||
default: | |||||
// 未知状态:重置为空闲状态 | |||||
route->run_state = PLSR_STATE_IDLE; | |||||
break; | |||||
} | |||||
} | |||||
// 辅助函数声明已在文件开头声明 | |||||
/* USER CODE END 1 */ | /* USER CODE END 1 */ | ||||
TIM_HandleTypeDef htim2; | |||||
TIM_HandleTypeDef htim2; // TIM2恢复用于脉冲计数 | |||||
TIM_HandleTypeDef htim6; | TIM_HandleTypeDef htim6; | ||||
TIM_HandleTypeDef htim10; | TIM_HandleTypeDef htim10; | ||||
TIM_HandleTypeDef htim11; | TIM_HandleTypeDef htim11; | ||||
@@ -183,7 +295,6 @@ TIM_HandleTypeDef htim14; | |||||
/* TIM2 init function */ | /* TIM2 init function */ | ||||
void MX_TIM2_Init(void) | void MX_TIM2_Init(void) | ||||
{ | { | ||||
/* USER CODE BEGIN TIM2_Init 0 */ | /* USER CODE BEGIN TIM2_Init 0 */ | ||||
/* USER CODE END TIM2_Init 0 */ | /* USER CODE END TIM2_Init 0 */ | ||||
@@ -195,19 +306,20 @@ void MX_TIM2_Init(void) | |||||
/* USER CODE END TIM2_Init 1 */ | /* USER CODE END TIM2_Init 1 */ | ||||
htim2.Instance = TIM2; | htim2.Instance = TIM2; | ||||
htim2.Init.Prescaler = 0; | |||||
htim2.Init.CounterMode = TIM_COUNTERMODE_UP; | |||||
htim2.Init.Period = 4294967295; | |||||
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; | |||||
htim2.Init.Prescaler = 0; // 不分频,直接计数外部脉冲 | |||||
htim2.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数 | |||||
htim2.Init.Period = 0xFFFFFFFF; // 32位最大值,避免溢出 | |||||
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 时钟不分频 | |||||
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; | htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; | ||||
if (HAL_TIM_Base_Init(&htim2) != HAL_OK) | if (HAL_TIM_Base_Init(&htim2) != HAL_OK) | ||||
{ | { | ||||
Error_Handler(); | Error_Handler(); | ||||
} | } | ||||
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_ETRMODE2; | |||||
sClockSourceConfig.ClockPolarity = TIM_CLOCKPOLARITY_NONINVERTED; | |||||
sClockSourceConfig.ClockPrescaler = TIM_CLOCKPRESCALER_DIV1; | |||||
sClockSourceConfig.ClockFilter = 0; | |||||
// 配置外部时钟源 - ETR模式 | |||||
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_ETRMODE2; // 外部时钟模式2 | |||||
sClockSourceConfig.ClockPolarity = TIM_CLOCKPOLARITY_NONINVERTED; // 上升沿触发 | |||||
sClockSourceConfig.ClockPrescaler = TIM_CLOCKPRESCALER_DIV1; // 不分频 | |||||
sClockSourceConfig.ClockFilter = 0; // 无滤波 | |||||
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) | if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) | ||||
{ | { | ||||
Error_Handler(); | Error_Handler(); | ||||
@@ -219,9 +331,9 @@ void MX_TIM2_Init(void) | |||||
Error_Handler(); | Error_Handler(); | ||||
} | } | ||||
/* USER CODE BEGIN TIM2_Init 2 */ | /* USER CODE BEGIN TIM2_Init 2 */ | ||||
HAL_TIM_Base_Start(&htim2); | |||||
HAL_TIM_Base_MspInit(&htim2); | |||||
/* USER CODE END TIM2_Init 2 */ | /* USER CODE END TIM2_Init 2 */ | ||||
} | } | ||||
/* TIM6 init function */ | /* TIM6 init function */ | ||||
void MX_TIM6_Init(void) | void MX_TIM6_Init(void) | ||||
@@ -433,9 +545,6 @@ void MX_TIM14_Init(void) | |||||
*/ | */ | ||||
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) | void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) | ||||
{ | { | ||||
// 定义GPIO初始化结构体 | |||||
GPIO_InitTypeDef GPIO_InitStruct = {0}; | |||||
// 根据定时器实例进行不同的初始化配置 | // 根据定时器实例进行不同的初始化配置 | ||||
if(tim_baseHandle->Instance==TIM2) | if(tim_baseHandle->Instance==TIM2) | ||||
{ | { | ||||
@@ -445,25 +554,25 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) | |||||
// 使能TIM2时钟 | // 使能TIM2时钟 | ||||
__HAL_RCC_TIM2_CLK_ENABLE(); | __HAL_RCC_TIM2_CLK_ENABLE(); | ||||
// 使能GPIOA时钟,用于配置PA15引脚 | |||||
// 使能GPIOA时钟 | |||||
__HAL_RCC_GPIOA_CLK_ENABLE(); | __HAL_RCC_GPIOA_CLK_ENABLE(); | ||||
/**TIM2 GPIO Configuration | /**TIM2 GPIO Configuration | ||||
PA15 ------> TIM2_ETR (外部触发输入) | |||||
PA15 ------> TIM2_ETR | |||||
*/ | */ | ||||
// 配置PA15为TIM2的外部触发输入引脚 | |||||
GPIO_InitStruct.Pin = GPIO_PIN_15; // 选择PA15引脚 | |||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出模式 | |||||
GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上下拉 | |||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // 极高速度 | |||||
GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; // 复用功能1:TIM2 | |||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIO | |||||
GPIO_InitTypeDef GPIO_InitStruct = {0}; | |||||
GPIO_InitStruct.Pin = GPIO_PIN_15; | |||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出 | |||||
GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上下拉 | |||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 高速 | |||||
GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; // TIM2复用功能 | |||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); | |||||
/* USER CODE BEGIN TIM2_MspInit 1 */ | /* USER CODE BEGIN TIM2_MspInit 1 */ | ||||
/* USER CODE END TIM2_MspInit 1 */ | /* USER CODE END TIM2_MspInit 1 */ | ||||
} | } | ||||
else if(tim_baseHandle->Instance==TIM6) | |||||
if(tim_baseHandle->Instance==TIM6) | |||||
{ | { | ||||
/* USER CODE BEGIN TIM6_MspInit 0 */ | /* USER CODE BEGIN TIM6_MspInit 0 */ | ||||
@@ -637,7 +746,7 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) | |||||
/* USER CODE END TIM2_MspDeInit 1 */ | /* USER CODE END TIM2_MspDeInit 1 */ | ||||
} | } | ||||
else if(tim_baseHandle->Instance==TIM6) | |||||
if(tim_baseHandle->Instance==TIM6) | |||||
{ | { | ||||
/* USER CODE BEGIN TIM6_MspDeInit 0 */ | /* USER CODE BEGIN TIM6_MspDeInit 0 */ | ||||
@@ -720,10 +829,12 @@ void PLSR_PWM_Init(void) | |||||
MX_TIM11_Init(); | MX_TIM11_Init(); | ||||
MX_TIM13_Init(); | MX_TIM13_Init(); | ||||
MX_TIM14_Init(); | MX_TIM14_Init(); | ||||
MX_TIM2_Init(); | |||||
MX_TIM2_Init(); // TIM2恢复用于脉冲计数 | |||||
MX_TIM6_Init(); | MX_TIM6_Init(); | ||||
// 停止PWM输出 | // 停止PWM输出 | ||||
HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1); | HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1); | ||||
BackupSRAM_RestoreData(); | |||||
} | } | ||||
@@ -731,16 +842,19 @@ void PLSR_PWM_Init(void) | |||||
* @brief 启动PLSR PWM输出 | * @brief 启动PLSR PWM输出 | ||||
* @param None | * @param None | ||||
* @retval None | * @retval None | ||||
* @note 启动TIM10 PWM输出和TIM2计数器 | |||||
* @note 启动TIM10 PWM输出和更新中断 | |||||
*/ | */ | ||||
void PLSR_PWM_Start(void) //<后续加入启动通道选择 | |||||
void PLSR_PWM_Start(void) | |||||
{ | { | ||||
if (!s_pwm_running) | if (!s_pwm_running) | ||||
{ | { | ||||
// 启动PWM输出 | |||||
HAL_TIM_PWM_Start(&htim10, TIM_CHANNEL_1); | |||||
// 启动PWM输出和更新中断 | |||||
HAL_TIM_PWM_Start_IT(&htim10, TIM_CHANNEL_1); | |||||
// 启动TIM2脉冲计数器 | |||||
PLSR_Counter_Start(); | |||||
s_pwm_running = 1; //< 更新PWM运行状态 | |||||
s_pwm_running = 1; | |||||
} | } | ||||
} | } | ||||
@@ -757,7 +871,7 @@ void PLSR_PWM_Stop(void) | |||||
HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1); | HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1); | ||||
// 停止TIM2计数器 | // 停止TIM2计数器 | ||||
HAL_TIM_Base_Stop(&htim2); | |||||
HAL_TIM_Base_Stop(&htim2); // TIM2恢复用于脉冲计数 | |||||
s_pwm_running = 0; | s_pwm_running = 0; | ||||
s_current_pwm_freq = 0; | s_current_pwm_freq = 0; | ||||
@@ -783,8 +897,9 @@ static void PLSR_CalculateTimerParams(uint32_t frequency, uint16_t* prescaler, u | |||||
// 输出频率 = 定时器时钟频率 / ((预分频器 + 1) * (自动重装载值 + 1)) | // 输出频率 = 定时器时钟频率 / ((预分频器 + 1) * (自动重装载值 + 1)) | ||||
// 因此:(预分频器 + 1) * (自动重装载值 + 1) = 定时器时钟频率 / 目标频率 | // 因此:(预分频器 + 1) * (自动重装载值 + 1) = 定时器时钟频率 / 目标频率 | ||||
// 频率为0时的异常处理 | |||||
// 频率为0时停止PWM输出 | |||||
if (frequency == 0) { | if (frequency == 0) { | ||||
PLSR_PWM_Stop(); // 直接停止PWM输出 | |||||
*prescaler = 0; | *prescaler = 0; | ||||
*period = 0; | *period = 0; | ||||
return; | return; | ||||
@@ -795,7 +910,8 @@ static void PLSR_CalculateTimerParams(uint32_t frequency, uint16_t* prescaler, u | |||||
// 遍历所有可能的预分频器值,寻找合适的组合 | // 遍历所有可能的预分频器值,寻找合适的组合 | ||||
// 预分频器范围:1-65536(寄存器值0-65535) | // 预分频器范围:1-65536(寄存器值0-65535) | ||||
for (uint16_t psc = 1; psc <= 65535; psc++) { | |||||
for (uint16_t psc = 1; psc <= 65535; psc++) | |||||
{ | |||||
// 计算对应的自动重装载值 | // 计算对应的自动重装载值 | ||||
uint32_t arr = total_count / psc; | uint32_t arr = total_count / psc; | ||||
@@ -838,6 +954,13 @@ static void PLSR_CalculateTimerParams(uint32_t frequency, uint16_t* prescaler, u | |||||
* 6. 状态恢复 - 如果之前在运行,重新启动PWM | * 6. 状态恢复 - 如果之前在运行,重新启动PWM | ||||
* 7. 记录更新 - 更新当前频率记录 | * 7. 记录更新 - 更新当前频率记录 | ||||
*/ | */ | ||||
/** | |||||
* @brief 安全设置PWM频率(通过中断更新) | |||||
* @param frequency 目标频率(Hz) | |||||
* | |||||
* 该函数不直接更新定时器参数,而是设置待更新的参数, | |||||
* 实际更新在TIM10中断中完成,确保原子性和波形连续性。 | |||||
*/ | |||||
void PLSR_PWM_SetFrequency(uint32_t frequency) | void PLSR_PWM_SetFrequency(uint32_t frequency) | ||||
{ | { | ||||
uint16_t prescaler = 0; // 预分频器值 | uint16_t prescaler = 0; // 预分频器值 | ||||
@@ -852,18 +975,44 @@ void PLSR_PWM_SetFrequency(uint32_t frequency) | |||||
// 计算最佳定时器参数 - 根据目标频率计算预分频器和周期值 | // 计算最佳定时器参数 - 根据目标频率计算预分频器和周期值 | ||||
PLSR_CalculateTimerParams(frequency, &prescaler, &period); | PLSR_CalculateTimerParams(frequency, &prescaler, &period); | ||||
// 设置待更新的参数(在中断中会检查并更新) | |||||
s_next_prescaler = prescaler; | |||||
s_next_period = period; | |||||
// 更新定时器核心参数 | |||||
__HAL_TIM_SET_PRESCALER(&htim10, prescaler); //< 放置波形出现问题对参数直接进行更新 | |||||
__HAL_TIM_SET_AUTORELOAD(&htim10, period); | |||||
// 设置更新挂起标志,中断中会检查此标志并执行更新 | |||||
s_freq_update_pending = 1; | |||||
// 更新当前频率记录 - 保存新的频率值供其他函数查询使用 | |||||
s_current_pwm_freq = frequency; | |||||
} | |||||
/** | |||||
* @brief 立即设置PWM频率(直接更新,用于初始化) | |||||
* @param frequency 目标频率(Hz) | |||||
* | |||||
* 该函数直接更新定时器参数,仅用于初始化或紧急情况。 | |||||
* 正常运行时应使用PLSR_PWM_SetFrequency()。 | |||||
*/ | |||||
void PLSR_PWM_SetFrequency_Immediate(uint32_t frequency) | |||||
{ | |||||
uint16_t prescaler = 0; // 预分频器值 | |||||
uint32_t period = 0; // 自动重载值(周期) | |||||
// 设置占空比为50% - 比较值设为周期的一半,产生对称的PWM波形 | |||||
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, period / 2); | |||||
// 频率范围检查 | |||||
if(frequency < PLSR_PWM_FREQ_MIN || frequency > PLSR_PWM_FREQ_MAX) | |||||
{ | |||||
return; | |||||
} | |||||
// 重置计数器 - 确保从0开始计数,避免参数更新时的计数器状态不一致 | |||||
__HAL_TIM_SET_COUNTER(&htim10, 0); | |||||
// 计算定时器参数 | |||||
PLSR_CalculateTimerParams(frequency, &prescaler, &period); | |||||
// 更新当前频率记录 - 保存新的频率值供其他函数查询使用 | |||||
// 直接更新定时器参数 | |||||
__HAL_TIM_SET_PRESCALER(&htim10, prescaler); | |||||
__HAL_TIM_SET_AUTORELOAD(&htim10, period); | |||||
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, period / 2); | |||||
// 更新当前频率记录 | |||||
s_current_pwm_freq = frequency; | s_current_pwm_freq = frequency; | ||||
} | } | ||||
@@ -873,17 +1022,7 @@ void PLSR_PWM_SetFrequency(uint32_t frequency) | |||||
* @brief 设置TIM6更新频率 | * @brief 设置TIM6更新频率 | ||||
* @param freq_us 更新频率(微秒) | * @param freq_us 更新频率(微秒) | ||||
* | * | ||||
* 该函数用于动态配置TIM6的更新中断频率,主要用于PLSR系统的加减速控制。 | |||||
* TIM6作为基础定时器,其更新频率直接影响加减速算法的执行精度和平滑度。 | |||||
* | |||||
* 处理流程: | |||||
* 1. 频率范围限制 - 确保频率在合理范围内(100us-100ms) | |||||
* 2. 参数计算 - 基于APB1时钟计算预分频器和周期值 | |||||
* 3. 定时器停止 - 停止当前运行以避免参数更新冲突 | |||||
* 4. 参数更新 - 设置新的预分频器、自动重载值和计数器 | |||||
* 5. 寄存器同步 - 触发更新事件使新参数生效 | |||||
* | |||||
* @note 定时器参数计算基于APB1时钟42MHz,预分频器设为41,得到1MHz计数频率(1us/tick) | |||||
* @note 定时器参数计算基于APB1时钟84MHz,预分频器设为83,得到1MHz计数频率(1us/tick) | |||||
*/ | */ | ||||
void PLSR_TIM6_SetUpdateFreq(uint32_t freq_us) | void PLSR_TIM6_SetUpdateFreq(uint32_t freq_us) | ||||
{ | { | ||||
@@ -947,45 +1086,6 @@ void PLSR_TIM6_Stop(void) | |||||
HAL_TIM_Base_Stop_IT(&htim6); | HAL_TIM_Base_Stop_IT(&htim6); | ||||
} | } | ||||
/** | |||||
* @brief 获取硬件计数器当前值 | |||||
* @param None | |||||
* @retval 当前计数值 | |||||
*/ | |||||
uint32_t PLSR_Counter_GetCount(void) | |||||
{ | |||||
return __HAL_TIM_GET_COUNTER(&htim2); | |||||
} | |||||
/** | |||||
* @brief 重置硬件计数器 | |||||
* @param None | |||||
* @retval None | |||||
*/ | |||||
void PLSR_Counter_Reset(void) | |||||
{ | |||||
__HAL_TIM_SET_COUNTER(&htim2, 0); | |||||
} | |||||
/** | |||||
* @brief 设置目标脉冲数 | |||||
* @param target: 目标脉冲数 | |||||
* @retval None | |||||
*/ | |||||
void PLSR_Counter_SetTarget(uint32_t target) | |||||
{ | |||||
s_target_pulse_count = target; | |||||
} | |||||
/** | |||||
* @brief 获取目标脉冲数 | |||||
* @param None | |||||
* @retval 目标脉冲数 | |||||
*/ | |||||
uint32_t PLSR_Counter_GetTarget(void) | |||||
{ | |||||
return s_target_pulse_count; | |||||
} | |||||
/** | /** | ||||
* @brief 获取当前PWM频率 | * @brief 获取当前PWM频率 | ||||
@@ -1015,37 +1115,78 @@ void PLSR_PWM_SetDutyCycle(uint8_t duty_percent) | |||||
/** | /** | ||||
* @brief 定时器周期结束中断回调函数 | * @brief 定时器周期结束中断回调函数 | ||||
* @param htim 定时器句柄指针 | * @param htim 定时器句柄指针 | ||||
* | |||||
* 该函数是HAL库的标准定时器中断回调函数,当定时器计数器溢出时被自动调用。 | |||||
* 在PLSR系统中,主要用于TIM6的周期性中断处理,实现精确的时序控制。 | |||||
* | |||||
* 处理流程: | |||||
* 1. 定时器识别 - 检查是否为TIM6中断 | |||||
* 2. 路径处理 - 调用PLSR_Section_Process执行路径状态机 | |||||
* 3. 时钟更新 - 递增系统时钟计数器 | |||||
* | |||||
* @note TIM6中断频率由PLSR_TIM6_SetUpdateFreq函数设置,直接影响加减速算法的执行精度 | * @note TIM6中断频率由PLSR_TIM6_SetUpdateFreq函数设置,直接影响加减速算法的执行精度 | ||||
* @note 该函数在中断上下文中执行,应保持处理时间尽可能短 | * @note 该函数在中断上下文中执行,应保持处理时间尽可能短 | ||||
*/ | */ | ||||
// 全局变量用于TIM10中断与任务通信 | |||||
// 频率更新相关静态变量已在文件开头声明 | |||||
#define PLSR_TASK_CHECK_INTERVAL 100 // 每100个脉冲通知任务一次 | |||||
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) | void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) | ||||
{ | { | ||||
// 检查中断源 - 确保只处理TIM6的中断 | |||||
// 检查中断源 - 处理TIM10的PWM更新中断 | |||||
if(htim->Instance == TIM10) | |||||
{ | |||||
// 1. 脉冲计数 - 每个PWM脉冲完成时计数 | |||||
g_plsr_route.pulse_count++; | |||||
// 2. 加减速过程中的频率参数更新 | |||||
if(g_plsr_route.run_state == PLSR_STATE_ACCEL || g_plsr_route.run_state == PLSR_STATE_DECEL) | |||||
{ | |||||
PLSR_Accel_Process(&g_plsr_route); // 在中断中进行加减速处理 | |||||
} | |||||
// 3. 检查是否需要频率更新 | |||||
if(s_freq_update_pending) | |||||
{ | |||||
// 原子性频率参数更新 | |||||
__HAL_TIM_SET_PRESCALER(&htim10, s_next_prescaler); | |||||
__HAL_TIM_SET_AUTORELOAD(&htim10, s_next_period); | |||||
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, s_next_period / 2); | |||||
// 清除更新标志 | |||||
s_freq_update_pending = 0; | |||||
} | |||||
// 4. 定期通知任务进行段处理 | |||||
s_pulse_check_counter++; | |||||
if(s_pulse_check_counter >= PLSR_TASK_CHECK_INTERVAL) | |||||
{ | |||||
s_pulse_check_counter = 0; | |||||
s_task_notification_flag = 1; | |||||
} | |||||
} | |||||
// TIM6用于等待时间计时 | |||||
if(htim->Instance == TIM6) | if(htim->Instance == TIM6) | ||||
{ | { | ||||
// PLSR路径状态机处理 - 这是PLSR系统的核心调度函数 | |||||
// 在每个TIM6中断周期内执行一次路径处理,包括: | |||||
// - 加速/减速算法计算 | |||||
// - 匀速段控制 | |||||
// - 等待条件检查 | |||||
// - 段间切换逻辑 | |||||
PLSR_Section_Process(&g_plsr_route); | |||||
// 系统时钟计数器递增 - 提供毫秒级时间基准 | |||||
// 注意:这里假设TIM6中断频率配置为1ms,如果频率不同需要相应调整 | |||||
g_plsr_system_tick++; | |||||
// 等待时间计数器递增 | |||||
if(s_wait_time_flag == 0 && s_wait_time_target > 0) | |||||
{ | |||||
uint32_t temp_counter = s_wait_time_counter + 1; | |||||
s_wait_time_counter = temp_counter; | |||||
if(temp_counter >= s_wait_time_target) | |||||
{ | |||||
s_wait_time_flag = 1; | |||||
s_task_notification_flag = 1; // 通知任务进行段切换 | |||||
} | |||||
} | |||||
if(s_act_time_flag == 0 && s_act_time_target > 0) | |||||
{ | |||||
uint32_t temp_counter = s_act_time_counter + 1; | |||||
s_act_time_counter = temp_counter; | |||||
if(temp_counter >= s_act_time_target) | |||||
{ | |||||
s_act_time_flag = 1; | |||||
s_task_notification_flag = 1; // 通知任务进行段切换 | |||||
} | |||||
} | |||||
} | } | ||||
} | } | ||||
// ==================== 路径控制函数实现 ==================== | // ==================== 路径控制函数实现 ==================== | ||||
/** | /** | ||||
@@ -1080,6 +1221,11 @@ void PLSR_Route_Init(PLSR_RouteConfig_t* route) | |||||
route->mode = PLSR_MODE_RELATIVE; // 路径模式:默认相对模式 | route->mode = PLSR_MODE_RELATIVE; // 路径模式:默认相对模式 | ||||
route->direction = PLSR_DIR_FORWARD; // 运行方向:默认正向 | route->direction = PLSR_DIR_FORWARD; // 运行方向:默认正向 | ||||
// 初始化加减速配置 - 系统级配置 | |||||
route->accel_config.accel_time_ms = PLSR_DEFAULT_ACCEL_TIME_MS; // 默认加速时间 | |||||
route->accel_config.decel_time_ms = PLSR_DEFAULT_DECEL_TIME_MS; // 默认减速时间 | |||||
route->accel_config.accel_algorithm = PLSR_ACCEL_LINEAR; // 默认线性加减速 | |||||
// 初始化运行状态参数 - 清零所有运行时状态 | // 初始化运行状态参数 - 清零所有运行时状态 | ||||
route->run_state = PLSR_STATE_IDLE; // 运行状态:空闲 | route->run_state = PLSR_STATE_IDLE; // 运行状态:空闲 | ||||
route->accel_step_count = 0; // 加速步数计数:清零 | route->accel_step_count = 0; // 加速步数计数:清零 | ||||
@@ -1094,8 +1240,6 @@ void PLSR_Route_Init(PLSR_RouteConfig_t* route) | |||||
PLSR_Section_Init(&route->section[i], i + 1); // 段号从1开始 | PLSR_Section_Init(&route->section[i], i + 1); // 段号从1开始 | ||||
} | } | ||||
// 硬件资源重置 - 确保硬件处于安全的初始状态 | |||||
PLSR_Counter_Reset(); // 重置脉冲计数器 | |||||
PLSR_PWM_Stop(); // 停止PWM输出 | PLSR_PWM_Stop(); // 停止PWM输出 | ||||
PLSR_TIM6_Stop(); // 停止TIM6定时器 | PLSR_TIM6_Stop(); // 停止TIM6定时器 | ||||
} | } | ||||
@@ -1129,8 +1273,8 @@ void PLSR_Route_Start(PLSR_RouteConfig_t* route) | |||||
route->current_freq = route->start_freq; //< 设置当前频率为起始频率 | route->current_freq = route->start_freq; //< 设置当前频率为起始频率 | ||||
route->pulse_count = 0; //< 清零脉冲计数 | route->pulse_count = 0; //< 清零脉冲计数 | ||||
// 硬件资源初始化 | |||||
PLSR_Counter_Reset(); //< 重置脉冲计数器 | |||||
// 重置脉冲计数器 - 现在使用软件计数 | |||||
route->pulse_count = 0; // 直接重置软件脉冲计数 | |||||
// PWM输出初始化 - 根据起始频率决定是否启动 | // PWM输出初始化 - 根据起始频率决定是否启动 | ||||
if (route->start_freq > 0) { | if (route->start_freq > 0) { | ||||
@@ -1165,7 +1309,7 @@ void PLSR_Route_Stop(PLSR_RouteConfig_t* route) | |||||
route->current_freq = 0; | route->current_freq = 0; | ||||
// 重置计数器 | // 重置计数器 | ||||
PLSR_Counter_Reset(); | |||||
PLSR_Counter_Reset(); // TIM2恢复用于脉冲计数 | |||||
} | } | ||||
@@ -1190,10 +1334,7 @@ void PLSR_Section_Init(PLSR_SectionConfig_t* section, uint8_t section_num) | |||||
section->next_section = (section_num < PLSR_MAX_SECTIONS) ? (section_num + 1) : 0; | section->next_section = (section_num < PLSR_MAX_SECTIONS) ? (section_num + 1) : 0; | ||||
section->section_state = PLSR_SECTION_IDLE; | section->section_state = PLSR_SECTION_IDLE; | ||||
// 加减速参数初始化 | |||||
section->accel_config.accel_time_ms = PLSR_DEFAULT_ACCEL_TIME_MS; | |||||
section->accel_config.decel_time_ms = PLSR_DEFAULT_DECEL_TIME_MS; | |||||
section->accel_config.accel_algorithm = PLSR_ACCEL_LINEAR; | |||||
// 注意:加减速参数现在在路径级别配置,不在段级别 | |||||
// 等待条件初始化 | // 等待条件初始化 | ||||
section->wait_condition.wait_type = PLSR_WAIT_PLUSEEND; | section->wait_condition.wait_type = PLSR_WAIT_PLUSEEND; | ||||
@@ -1264,10 +1405,7 @@ void PLSR_Section_Process(PLSR_RouteConfig_t* route) | |||||
PLSR_Section_ProcessWait(route); | PLSR_Section_ProcessWait(route); | ||||
break; | break; | ||||
case PLSR_STATE_STOP: | |||||
// 停止状态:立即停止路径执行 | |||||
PLSR_Route_Stop(route); | |||||
break; | |||||
default: | default: | ||||
// 未知状态:重置为空闲状态 | // 未知状态:重置为空闲状态 | ||||
@@ -1299,14 +1437,14 @@ static void PLSR_Section_StartNewSection(PLSR_RouteConfig_t* route) | |||||
// 目标频率大于当前频率:需要加速到目标频率 | // 目标频率大于当前频率:需要加速到目标频率 | ||||
route->run_state = PLSR_STATE_ACCEL; | route->run_state = PLSR_STATE_ACCEL; | ||||
// 计算加速过程的步数和参数(参数1表示加速过程) | // 计算加速过程的步数和参数(参数1表示加速过程) | ||||
PLSR_Accel_CalculateSteps(route, current_section->accel_config.accel_time_ms, 1); | |||||
PLSR_Accel_CalculateSteps(route, route->accel_config.accel_time_ms, 1); | |||||
} | } | ||||
else if (route->target_freq < route->current_freq) | else if (route->target_freq < route->current_freq) | ||||
{ | { | ||||
// 目标频率小于当前频率:需要减速到目标频率 | // 目标频率小于当前频率:需要减速到目标频率 | ||||
route->run_state = PLSR_STATE_DECEL; | route->run_state = PLSR_STATE_DECEL; | ||||
// 计算减速过程的步数和参数(参数0表示减速过程) | // 计算减速过程的步数和参数(参数0表示减速过程) | ||||
PLSR_Accel_CalculateSteps(route, current_section->accel_config.decel_time_ms, 0); | |||||
PLSR_Accel_CalculateSteps(route, route->accel_config.decel_time_ms, 0); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
@@ -1413,23 +1551,23 @@ void PLSR_Section_CalculateConstPulse(PLSR_RouteConfig_t* route) | |||||
// 参数有效性检查:路径指针不能为空 | // 参数有效性检查:路径指针不能为空 | ||||
if (route == NULL) return; | if (route == NULL) return; | ||||
// 获取当前段的配置指针 | |||||
PLSR_SectionConfig_t* current_section = &route->section[route->current_section_num - 1]; | |||||
//// 获取当前段的配置指针 | |||||
//PLSR_SectionConfig_t* current_section = &route->section[route->current_section_num - 1]; | |||||
// 根据路径模式计算本段需要执行的总脉冲数 | // 根据路径模式计算本段需要执行的总脉冲数 | ||||
uint32_t total_pulse; | |||||
if (route->mode == PLSR_MODE_RELATIVE) | |||||
{ | |||||
// 相对模式:直接使用段配置中的目标脉冲数 | |||||
total_pulse = current_section->target_pulse; | |||||
} | |||||
else | |||||
{ | |||||
// 绝对模式:计算从当前位置到目标位置需要的脉冲数 | |||||
// 如果目标位置已达到或超过,则无需发送脉冲 | |||||
total_pulse = (current_section->target_pulse > route->pulse_count) ? | |||||
(current_section->target_pulse - route->pulse_count) : 0; | |||||
} | |||||
// uint32_t total_pulse; // 暂时注释掉未使用的变量 | |||||
// if (route->mode == PLSR_MODE_RELATIVE) | |||||
// { | |||||
// // 相对模式:直接使用段配置中的目标脉冲数 | |||||
// total_pulse = current_section->target_pulse; | |||||
// } | |||||
// else | |||||
// { | |||||
// // 绝对模式:计算从当前位置到目标位置需要的脉冲数 | |||||
// // 如果目标位置已达到或超过,则无需发送脉冲 | |||||
// total_pulse = (current_section->target_pulse > route->pulse_count) ? | |||||
// (current_section->target_pulse - route->pulse_count) : 0; | |||||
// } | |||||
// // 计算加减速过程中消耗的脉冲数,方便计算何时进入匀速阶段 | // // 计算加减速过程中消耗的脉冲数,方便计算何时进入匀速阶段 | ||||
// //有问题,步数不等价于脉冲数. | // //有问题,步数不等价于脉冲数. | ||||
@@ -1457,24 +1595,6 @@ void PLSR_Section_CalculateConstPulse(PLSR_RouteConfig_t* route) | |||||
// ==================== PLSR加减速算法函数实现 ==================== | // ==================== PLSR加减速算法函数实现 ==================== | ||||
/** | |||||
* @brief 线性加减速算法 | |||||
* @param progress: 进度值(0.0-1.0) | |||||
* @retval 频率比例(0.0-1.0) | |||||
* @note 线性变化的加减速算法 | |||||
*/ | |||||
float PLSR_Accel_CalculateLinear(float progress) | |||||
{ | |||||
// 线性加减速算法 | |||||
// progress: 0.0 到 1.0 的进度值 | |||||
// 返回: 0.0 到 1.0 的频率比例 | |||||
if (progress < 0.0f) progress = 0.0f; | |||||
if (progress > 1.0f) progress = 1.0f; | |||||
return progress; | |||||
} | |||||
/** | /** | ||||
* @brief 曲线加减速算法 | * @brief 曲线加减速算法 | ||||
* @param progress: 进度值(0.0-1.0) | * @param progress: 进度值(0.0-1.0) | ||||
@@ -1602,23 +1722,24 @@ void PLSR_Accel_Process(PLSR_RouteConfig_t* route) | |||||
static uint32_t total_decel_steps = 0; // 总减速步数 | static uint32_t total_decel_steps = 0; // 总减速步数 | ||||
// 获取当前段配置和初始化变量 | // 获取当前段配置和初始化变量 | ||||
PLSR_SectionConfig_t* current_section = &route->section[route->current_section_num - 1]; | |||||
// PLSR_SectionConfig_t* current_section = &route->section[route->current_section_num - 1]; // 暂时注释掉未使用的变量 | |||||
uint32_t new_freq = route->current_freq; // 新频率,默认为当前频率 | uint32_t new_freq = route->current_freq; // 新频率,默认为当前频率 | ||||
uint8_t state_changed = 0; // 状态改变标志 | |||||
// ==================== 加速处理 ==================== | // ==================== 加速处理 ==================== | ||||
if (route->run_state == PLSR_STATE_ACCEL) | if (route->run_state == PLSR_STATE_ACCEL) | ||||
{ | { | ||||
// 检查是否还有加速步数需要执行 | // 检查是否还有加速步数需要执行 | ||||
if (route->accel_step_count > 0) { | |||||
if (route->accel_step_count > 0) | |||||
{ | |||||
// 记录总步数和起始频率(仅在第一次进入加速时) | // 记录总步数和起始频率(仅在第一次进入加速时) | ||||
if (total_accel_steps == 0) { | |||||
if (total_accel_steps == 0) | |||||
{ | |||||
total_accel_steps = route->accel_step_count; // 保存总加速步数 | total_accel_steps = route->accel_step_count; // 保存总加速步数 | ||||
start_freq_accel = route->current_freq; // 保存加速起始频率 | start_freq_accel = route->current_freq; // 保存加速起始频率 | ||||
} | } | ||||
// 根据加速算法类型计算新频率 | // 根据加速算法类型计算新频率 | ||||
switch (current_section->accel_config.accel_algorithm) | |||||
switch (route->accel_config.accel_algorithm) | |||||
{ | { | ||||
case PLSR_ACCEL_LINEAR: | case PLSR_ACCEL_LINEAR: | ||||
{ | { | ||||
@@ -1641,12 +1762,14 @@ void PLSR_Accel_Process(PLSR_RouteConfig_t* route) | |||||
// 根据算法类型计算频率比例 | // 根据算法类型计算频率比例 | ||||
float freq_ratio = 0.0f; | float freq_ratio = 0.0f; | ||||
if (current_section->accel_config.accel_algorithm == PLSR_ACCEL_CURVE) { | |||||
if (route->accel_config.accel_algorithm == PLSR_ACCEL_CURVE) | |||||
{ | |||||
freq_ratio = PLSR_Accel_CalculateCurve(progress); // 曲线算法 | freq_ratio = PLSR_Accel_CalculateCurve(progress); // 曲线算法 | ||||
} else { | |||||
} | |||||
else | |||||
{ | |||||
freq_ratio = PLSR_Accel_CalculateSine(progress); // 正弦算法 | freq_ratio = PLSR_Accel_CalculateSine(progress); // 正弦算法 | ||||
} | |||||
} | |||||
// 计算新频率 = 起始频率 + (频率范围 × 频率比例) | // 计算新频率 = 起始频率 + (频率范围 × 频率比例) | ||||
uint32_t freq_range = route->target_freq - start_freq_accel; | uint32_t freq_range = route->target_freq - start_freq_accel; | ||||
new_freq = start_freq_accel + (uint32_t)(freq_range * freq_ratio); | new_freq = start_freq_accel + (uint32_t)(freq_range * freq_ratio); | ||||
@@ -1671,7 +1794,6 @@ void PLSR_Accel_Process(PLSR_RouteConfig_t* route) | |||||
// 加速完成,设置为目标频率并切换到匀速状态 | // 加速完成,设置为目标频率并切换到匀速状态 | ||||
new_freq = route->target_freq; | new_freq = route->target_freq; | ||||
route->run_state = PLSR_STATE_CONST; | route->run_state = PLSR_STATE_CONST; | ||||
state_changed = 1; // 标记状态已改变 | |||||
// 重置加速相关的静态变量 | // 重置加速相关的静态变量 | ||||
total_accel_steps = 0; | total_accel_steps = 0; | ||||
start_freq_accel = 0; | start_freq_accel = 0; | ||||
@@ -1689,7 +1811,7 @@ void PLSR_Accel_Process(PLSR_RouteConfig_t* route) | |||||
} | } | ||||
// 根据减速算法类型计算新频率 | // 根据减速算法类型计算新频率 | ||||
switch (current_section->accel_config.accel_algorithm) { | |||||
switch (route->accel_config.accel_algorithm) { | |||||
case PLSR_ACCEL_LINEAR: | case PLSR_ACCEL_LINEAR: | ||||
{ | { | ||||
// 直线减速:使用固定频率减量 | // 直线减速:使用固定频率减量 | ||||
@@ -1711,7 +1833,7 @@ void PLSR_Accel_Process(PLSR_RouteConfig_t* route) | |||||
// 根据算法类型计算频率比例 | // 根据算法类型计算频率比例 | ||||
float freq_ratio = 0.0f; | float freq_ratio = 0.0f; | ||||
if (current_section->accel_config.accel_algorithm == PLSR_ACCEL_CURVE) { | |||||
if (route->accel_config.accel_algorithm == PLSR_ACCEL_CURVE) { | |||||
freq_ratio = PLSR_Accel_CalculateCurve(progress); // 曲线算法 | freq_ratio = PLSR_Accel_CalculateCurve(progress); // 曲线算法 | ||||
} else { | } else { | ||||
freq_ratio = PLSR_Accel_CalculateSine(progress); // 正弦算法 | freq_ratio = PLSR_Accel_CalculateSine(progress); // 正弦算法 | ||||
@@ -1738,10 +1860,17 @@ void PLSR_Accel_Process(PLSR_RouteConfig_t* route) | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
// 减速完成,设置为目标频率并切换到匀速状态 | |||||
// 减速完成,设置为目标频率 | |||||
new_freq = route->target_freq; | new_freq = route->target_freq; | ||||
route->run_state = PLSR_STATE_CONST; | |||||
state_changed = 1; // 标记状态已改变 | |||||
// 如果目标频率为0,停止PWM输出并直接进入等待状态 | |||||
if (route->target_freq == 0) { | |||||
PLSR_PWM_Stop(); // 停止PWM输出 | |||||
route->run_state = PLSR_STATE_WAIT; // 直接进入等待状态 | |||||
} else { | |||||
route->run_state = PLSR_STATE_CONST; // 进入匀速状态 | |||||
} | |||||
// 重置减速相关的静态变量 | // 重置减速相关的静态变量 | ||||
total_decel_steps = 0; | total_decel_steps = 0; | ||||
start_freq_decel = 0; | start_freq_decel = 0; | ||||
@@ -1749,16 +1878,20 @@ void PLSR_Accel_Process(PLSR_RouteConfig_t* route) | |||||
} | } | ||||
// ==================== 频率更新和状态检查 ==================== | // ==================== 频率更新和状态检查 ==================== | ||||
// 如果频率发生变化,更新PWM输出频率 | |||||
// 如果频率发生变化,设置频率更新标志 | |||||
if (new_freq != route->current_freq) | if (new_freq != route->current_freq) | ||||
{ | { | ||||
route->current_freq = new_freq; // 更新当前频率 | route->current_freq = new_freq; // 更新当前频率 | ||||
PLSR_PWM_SetFrequency(new_freq); // 设置PWM输出频率 | |||||
PLSR_PWM_Start(); | |||||
// 计算新的定时器参数并设置更新标志 | |||||
uint16_t prescaler; | |||||
uint32_t period; | |||||
PLSR_CalculateTimerParams(new_freq, &prescaler, &period); | |||||
s_next_prescaler = prescaler; | |||||
s_next_period = period; | |||||
s_freq_update_pending = 1; // 设置频率更新标志 | |||||
} | } | ||||
// 更新脉冲计数 | |||||
route->pulse_count = PLSR_Counter_GetCount(); | |||||
// 脉冲计数已在TIM10中断中自动更新 | |||||
// 检查是否需要切换状态或段 | // 检查是否需要切换状态或段 | ||||
// 当状态改变或脉冲完成时,进行状态转换检查 | // 当状态改变或脉冲完成时,进行状态转换检查 | ||||
@@ -1778,8 +1911,7 @@ static void PLSR_Section_ProcessConstSpeed(PLSR_RouteConfig_t* route) | |||||
{ | { | ||||
if (route == NULL) return; | if (route == NULL) return; | ||||
// 更新脉冲计数 | |||||
route->pulse_count = PLSR_Counter_GetCount(); | |||||
// 脉冲计数已在TIM10中断中自动更新 | |||||
// 检查是否需要进入减速或完成段 | // 检查是否需要进入减速或完成段 | ||||
if (PLSR_Section_CheckPulseComplete(route)) | if (PLSR_Section_CheckPulseComplete(route)) | ||||
@@ -1867,6 +1999,67 @@ static void PLSR_Section_CheckTransition(PLSR_RouteConfig_t* route) | |||||
} | } | ||||
} | } | ||||
// ==================== PLSR计数器控制函数实现 ==================== | |||||
/** | |||||
* @brief 初始化PLSR计数器 | |||||
* @param None | |||||
* @retval None | |||||
* @note 初始化TIM2作为外部脉冲计数器 | |||||
*/ | |||||
void PLSR_Counter_Init(void) | |||||
{ | |||||
// TIM2初始化已在MX_TIM2_Init中完成 | |||||
// 这里可以添加额外的计数器配置 | |||||
} | |||||
/** | |||||
* @brief 启动PLSR计数器 | |||||
* @param None | |||||
* @retval None | |||||
* @note 启动TIM2计数器开始计数外部脉冲 | |||||
*/ | |||||
void PLSR_Counter_Start(void) | |||||
{ | |||||
// 重置计数器到0 | |||||
__HAL_TIM_SET_COUNTER(&htim2, 0); | |||||
// 启动TIM2计数器 | |||||
HAL_TIM_Base_Start(&htim2); | |||||
} | |||||
/** | |||||
* @brief 停止PLSR计数器 | |||||
* @param None | |||||
* @retval None | |||||
* @note 停止TIM2计数器 | |||||
*/ | |||||
void PLSR_Counter_Stop(void) | |||||
{ | |||||
HAL_TIM_Base_Stop(&htim2); | |||||
} | |||||
/** | |||||
* @brief 重置PLSR计数器 | |||||
* @param None | |||||
* @retval None | |||||
* @note 将TIM2计数器重置为0 | |||||
*/ | |||||
void PLSR_Counter_Reset(void) | |||||
{ | |||||
__HAL_TIM_SET_COUNTER(&htim2, 0); | |||||
} | |||||
/** | |||||
* @brief 获取PLSR计数器当前值 | |||||
* @param None | |||||
* @retval 当前计数值 | |||||
* @note 读取TIM2计数器的当前值 | |||||
*/ | |||||
uint32_t PLSR_Counter_GetCount(void) | |||||
{ | |||||
return __HAL_TIM_GET_COUNTER(&htim2); | |||||
} | |||||
@@ -21,7 +21,30 @@ | |||||
#include "usart.h" | #include "usart.h" | ||||
/* USER CODE BEGIN 0 */ | /* USER CODE BEGIN 0 */ | ||||
// USART1缓冲区变量定义 - 添加内存对齐确保DMA传输稳定 | |||||
uint8_t usart1_rx_buffer[USART1_RX_BUFFER_SIZE] __attribute__((aligned(4))); | |||||
volatile uint16_t usart1_rx_head = 0; | |||||
volatile uint16_t usart1_rx_tail = 0; | |||||
uint16_t Usart1_Rx_Count = 0; | |||||
uint8_t usart1_dma_rx_buffer[USART1_RX_BUFFER_SIZE] __attribute__((aligned(4))); | |||||
volatile uint16_t usart1_dma_rx_len = 0; | |||||
uint8_t usart1_dma_tx_buffer[USART1_TX_BUFFER_SIZE] __attribute__((aligned(4))); | |||||
volatile uint8_t usart1_tx_busy = 0; // 发送忙标志 | |||||
// Modbus从机实例 | |||||
ModbusSlave_t ModbusSlave; | |||||
// 内部函数声明 | |||||
static void Modbus_Send_Response(uint8_t *data, uint16_t length); | |||||
static void Modbus_Send_Exception(uint8_t function_code, uint8_t exception_code); | |||||
static void Modbus_Process_Read_Coils(uint8_t *frame, uint16_t length); | |||||
static void Modbus_Process_Read_Holding_Regs(uint8_t *frame, uint16_t length); | |||||
static void Modbus_Process_Write_Multiple_Coils(uint8_t *frame, uint16_t length); | |||||
static void Modbus_Process_Write_Multiple_Regs(uint8_t *frame, uint16_t length); | |||||
// 辅助函数声明 | |||||
static uint8_t Get_Coil_Bit(uint16_t addr); | |||||
static void Set_Coil_Bit(uint16_t addr, uint8_t value); | |||||
/* USER CODE END 0 */ | /* USER CODE END 0 */ | ||||
UART_HandleTypeDef huart1; | UART_HandleTypeDef huart1; | ||||
@@ -53,7 +76,14 @@ void MX_USART1_UART_Init(void) | |||||
Error_Handler(); | Error_Handler(); | ||||
} | } | ||||
/* USER CODE BEGIN USART1_Init 2 */ | /* USER CODE BEGIN USART1_Init 2 */ | ||||
HAL_UART_MspInit(&huart1); | |||||
// 使能IDLE中断 | |||||
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); | |||||
// 启动DMA接收 | |||||
HAL_UART_Receive_DMA(&huart1, usart1_dma_rx_buffer, USART1_RX_BUFFER_SIZE); | |||||
// 初始化Modbus | |||||
Modbus_Init(1); // 默认从机地址为1 | |||||
/* USER CODE END USART1_Init 2 */ | /* USER CODE END USART1_Init 2 */ | ||||
} | } | ||||
@@ -82,6 +112,9 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) | |||||
GPIO_InitStruct.Alternate = GPIO_AF7_USART1; | GPIO_InitStruct.Alternate = GPIO_AF7_USART1; | ||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); | HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); | ||||
/* DMA controller clock enable */ | |||||
__HAL_RCC_DMA2_CLK_ENABLE(); | |||||
/* USART1 DMA Init */ | /* USART1 DMA Init */ | ||||
/* USART1_RX Init */ | /* USART1_RX Init */ | ||||
hdma_usart1_rx.Instance = DMA2_Stream2; | hdma_usart1_rx.Instance = DMA2_Stream2; | ||||
@@ -119,8 +152,16 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) | |||||
__HAL_LINKDMA(uartHandle,hdmatx,hdma_usart1_tx); | __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart1_tx); | ||||
/* DMA interrupt init */ | |||||
/* DMA2_Stream2_IRQn interrupt configuration */ | |||||
HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 6, 0); | |||||
HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn); | |||||
/* DMA2_Stream7_IRQn interrupt configuration */ | |||||
HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 4, 0); | |||||
HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn); | |||||
/* USART1 interrupt Init */ | /* USART1 interrupt Init */ | ||||
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); | |||||
HAL_NVIC_SetPriority(USART1_IRQn, 4, 0); | |||||
HAL_NVIC_EnableIRQ(USART1_IRQn); | HAL_NVIC_EnableIRQ(USART1_IRQn); | ||||
/* USER CODE BEGIN USART1_MspInit 1 */ | /* USER CODE BEGIN USART1_MspInit 1 */ | ||||
@@ -159,4 +200,534 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) | |||||
/* USER CODE BEGIN 1 */ | /* USER CODE BEGIN 1 */ | ||||
/* USER CODE END 1 */ | |||||
// printf重定向函数 | |||||
int fputc(int ch, FILE *f) | |||||
{ | |||||
HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY); | |||||
return ch; | |||||
} | |||||
void USART1_IDLE_IRQHandler(void) | |||||
{ | |||||
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE)) | |||||
{ | |||||
__HAL_UART_CLEAR_IDLEFLAG(&huart1); | |||||
// 停止DMA接收 | |||||
HAL_UART_DMAStop(&huart1); | |||||
// 计算接收到的数据长度 | |||||
usart1_dma_rx_len = USART1_RX_BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart1.hdmarx); | |||||
if(usart1_dma_rx_len > 0) | |||||
{ | |||||
// 将DMA缓冲区数据复制到接收缓冲区 | |||||
for(uint16_t i = 0; i < usart1_dma_rx_len; i++) | |||||
{ | |||||
if(Usart1_Rx_Count < USART1_RX_BUFFER_SIZE) | |||||
{ | |||||
usart1_rx_buffer[usart1_rx_head] = usart1_dma_rx_buffer[i]; | |||||
usart1_rx_head = (usart1_rx_head + 1) % USART1_RX_BUFFER_SIZE; | |||||
Usart1_Rx_Count++; | |||||
} | |||||
} | |||||
} | |||||
// 重新启动DMA接收 | |||||
HAL_UART_Receive_DMA(&huart1, usart1_dma_rx_buffer, USART1_RX_BUFFER_SIZE); | |||||
} | |||||
} | |||||
// DMA发送函数 | |||||
uint8_t USART1_SendData_DMA(uint8_t* data, uint16_t len) | |||||
{ | |||||
if(usart1_tx_busy) | |||||
{ | |||||
return 0; // 发送忙,返回失败 | |||||
} | |||||
if(len > USART1_TX_BUFFER_SIZE) | |||||
{ | |||||
return 0; // 数据长度超出缓冲区大小 | |||||
} | |||||
// 复制数据到发送缓冲区 | |||||
memcpy(usart1_dma_tx_buffer, data, len); | |||||
usart1_tx_busy = 1; | |||||
// 启动DMA发送 | |||||
if(HAL_UART_Transmit_DMA(&huart1, usart1_dma_tx_buffer, len) != HAL_OK) | |||||
{ | |||||
usart1_tx_busy = 0; | |||||
return 0; | |||||
} | |||||
return 1; // 发送成功 | |||||
} | |||||
// HAL库版本的串口发送函数 | |||||
void USART1_SendData(uint8_t* data, uint16_t len) | |||||
{ | |||||
HAL_UART_Transmit_DMA(&huart1, data, len); | |||||
} | |||||
// DMA发送完成回调函数 | |||||
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) | |||||
{ | |||||
if(huart->Instance == USART1) | |||||
{ | |||||
usart1_tx_busy = 0; // 清除发送忙标志 | |||||
} | |||||
} | |||||
/** | |||||
* @brief Modbus从机初始化 | |||||
* @param slave_addr 从机地址 | |||||
*/ | |||||
void Modbus_Init(uint8_t slave_addr) | |||||
{ | |||||
ModbusSlave.slave_address = slave_addr; | |||||
memset(ModbusSlave.holding_regs, 0, sizeof(ModbusSlave.holding_regs)); | |||||
memset(ModbusSlave.coils, 0, sizeof(ModbusSlave.coils)); | |||||
} | |||||
/** | |||||
* @brief Modbus数据处理函数 | |||||
*/ | |||||
void Modbus_Process(void) | |||||
{ | |||||
if(Usart1_Rx_Count < 8) return; // 最小Modbus帧长度检查 | |||||
// 检查帧完整性 | |||||
uint8_t frame[256]; | |||||
uint16_t frame_len = 0; | |||||
// 从接收缓冲区读取数据 | |||||
while(Usart1_Rx_Count > 0) | |||||
{ | |||||
frame[frame_len] = usart1_rx_buffer[usart1_rx_tail]; | |||||
usart1_rx_tail = (usart1_rx_tail + 1) % USART1_RX_BUFFER_SIZE; | |||||
Usart1_Rx_Count--; | |||||
frame_len++; | |||||
// 检查是否为完整帧 | |||||
if(frame_len >= 8) | |||||
{ | |||||
// 验证CRC | |||||
uint16_t crc_received = (frame[frame_len-1] << 8) | frame[frame_len-2]; | |||||
uint16_t crc_calculated = Modbus_CRC16(frame, frame_len - 2); | |||||
if(crc_received == crc_calculated && frame[0] == ModbusSlave.slave_address) | |||||
{ | |||||
// 处理Modbus帧 | |||||
uint8_t function_code = frame[1]; | |||||
switch(function_code) | |||||
{ | |||||
case MODBUS_FC_READ_COILS: | |||||
Modbus_Process_Read_Coils(frame, frame_len); | |||||
break; | |||||
case MODBUS_FC_READ_HOLDING_REGS: | |||||
Modbus_Process_Read_Holding_Regs(frame, frame_len); | |||||
break; | |||||
case MODBUS_FC_WRITE_MULTIPLE_COILS: | |||||
Modbus_Process_Write_Multiple_Coils(frame, frame_len); | |||||
break; | |||||
case MODBUS_FC_WRITE_MULTIPLE_REGS: | |||||
Modbus_Process_Write_Multiple_Regs(frame, frame_len); | |||||
break; | |||||
case MODBUS_FC_WRITE_REG: | |||||
Modbus_Process_Write_Reg(frame,frame_len); | |||||
break; | |||||
case MODBUS_FC_SEND_LOG: | |||||
Modbus_Handle_SendLog(frame, frame_len); | |||||
break; | |||||
default: | |||||
Modbus_Send_Exception(function_code, MODBUS_EX_ILLEGAL_FUNCTION); | |||||
break; | |||||
} | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* @brief 处理Modbus日志发送请求 | |||||
* @param frame 接收的Modbus帧 | |||||
* @param length 帧长度 | |||||
*/ | |||||
void Modbus_Handle_SendLog(uint8_t* frame, uint16_t length) | |||||
{ | |||||
if(length != 8) | |||||
{ | |||||
Modbus_Log(0x01, MODBUS_FC_SEND_LOG, 0, 0, 0x01, MODBUS_EX_ILLEGAL_DATA_VALUE); | |||||
Modbus_Send_Exception(MODBUS_FC_SEND_LOG, MODBUS_EX_ILLEGAL_DATA_VALUE); | |||||
return; | |||||
} | |||||
uint16_t log_index = (frame[2] << 8) | frame[3]; | |||||
uint16_t log_count = (frame[4] << 8) | frame[5]; | |||||
if(log_count == 0 || log_count > 30) | |||||
{ | |||||
Modbus_Log(0x01, MODBUS_FC_SEND_LOG, log_index, log_count, 0x01, MODBUS_EX_ILLEGAL_COUNT); | |||||
Modbus_Send_Exception(MODBUS_FC_SEND_LOG, MODBUS_EX_ILLEGAL_COUNT); | |||||
return; | |||||
} | |||||
if(log_index >= MODBUS_LOG_MAX) | |||||
{ | |||||
Modbus_Log(0x01, MODBUS_FC_SEND_LOG, log_index, log_count, 0x01, MODBUS_EX_ILLEGAL_DATA_ADDRESS); | |||||
Modbus_Send_Exception(MODBUS_FC_SEND_LOG, MODBUS_EX_ILLEGAL_DATA_ADDRESS); | |||||
return; | |||||
} | |||||
// 发送日志数据 | |||||
for(uint16_t i = 0; i < log_count && (log_index + i) < MODBUS_LOG_MAX; i++) | |||||
{ | |||||
uint8_t buf[8]; | |||||
ModbusLog* log = &modbus_logs[(log_index + i) % MODBUS_LOG_MAX]; | |||||
buf[0] = log->element_type; | |||||
buf[1] = log->function_code; | |||||
buf[2] = (log->start_address >> 8) & 0xFF; | |||||
buf[3] = log->start_address & 0xFF; | |||||
buf[4] = (log->data_len >> 8) & 0xFF; | |||||
buf[5] = log->data_len & 0xFF; | |||||
buf[6] = log->operation_type; | |||||
buf[7] = log->error_code; | |||||
// 发送日志数据 | |||||
USART1_SendData(buf, 8); | |||||
} | |||||
} | |||||
/** | |||||
* @brief 处理读线圈请求 | |||||
* @param frame 接收的Modbus帧 | |||||
* @param length 帧长度 | |||||
*/ | |||||
static void Modbus_Process_Read_Coils(uint8_t *frame, uint16_t length) | |||||
{ | |||||
if(length != 8) | |||||
{ | |||||
Modbus_Send_Exception(MODBUS_FC_READ_COILS, MODBUS_EX_ILLEGAL_DATA_VALUE); | |||||
return; | |||||
} | |||||
uint16_t start_addr = (frame[2] << 8) | frame[3]; | |||||
uint16_t coil_count = (frame[4] << 8) | frame[5]; | |||||
if(coil_count == 0 || coil_count > 2000 || start_addr + coil_count > MODBUS_COIL_COUNT) | |||||
{ | |||||
Modbus_Send_Exception(MODBUS_FC_READ_COILS, MODBUS_EX_ILLEGAL_DATA_ADDRESS); | |||||
return; | |||||
} | |||||
uint8_t response[256]; | |||||
response[0] = ModbusSlave.slave_address; | |||||
response[1] = MODBUS_FC_READ_COILS; | |||||
response[2] = (coil_count + 7) / 8; // 字节数 | |||||
uint16_t byte_count = response[2]; | |||||
for(uint16_t i = 0; i < byte_count; i++) | |||||
{ | |||||
response[3 + i] = 0; | |||||
for(uint8_t bit = 0; bit < 8 && (i * 8 + bit) < coil_count; bit++) | |||||
{ | |||||
if(Get_Coil_Bit(start_addr + i * 8 + bit)) | |||||
{ | |||||
response[3 + i] |= (1 << bit); | |||||
} | |||||
} | |||||
} | |||||
Modbus_Send_Response(response, 3 + byte_count); | |||||
} | |||||
/** | |||||
* @brief 读保持寄存器请求 | |||||
* @param frame 接收的Modbus帧 | |||||
* @param length 帧长度 | |||||
*/ | |||||
static void Modbus_Process_Read_Holding_Regs(uint8_t *frame, uint16_t length) | |||||
{ | |||||
if(length != 8) | |||||
{ | |||||
Modbus_Send_Exception(MODBUS_FC_READ_HOLDING_REGS, MODBUS_EX_ILLEGAL_DATA_VALUE); | |||||
return; | |||||
} | |||||
uint16_t start_addr = (frame[2] << 8) | frame[3]; | |||||
uint16_t reg_count = (frame[4] << 8) | frame[5]; | |||||
if(reg_count == 0 || reg_count > 125 || start_addr + reg_count > MODBUS_HOLDING_REG_COUNT) | |||||
{ | |||||
Modbus_Send_Exception(MODBUS_FC_READ_HOLDING_REGS, MODBUS_EX_ILLEGAL_DATA_ADDRESS); | |||||
return; | |||||
} | |||||
uint8_t response[256]; | |||||
response[0] = ModbusSlave.slave_address; | |||||
response[1] = MODBUS_FC_READ_HOLDING_REGS; | |||||
response[2] = reg_count * 2; // 字节数 | |||||
for(uint16_t i = 0; i < reg_count; i++) | |||||
{ | |||||
uint16_t reg_value = ModbusSlave.holding_regs[start_addr + i]; | |||||
response[3 + i * 2] = (reg_value >> 8) & 0xFF; | |||||
response[4 + i * 2] = reg_value & 0xFF; | |||||
} | |||||
Modbus_Send_Response(response, 3 + reg_count * 2); | |||||
} | |||||
/** | |||||
* @brief 处理写多个线圈请求 | |||||
* @param frame 接收的Modbus帧 | |||||
* @param length 帧长度 | |||||
*/ | |||||
static void Modbus_Process_Write_Multiple_Coils(uint8_t *frame, uint16_t length) | |||||
{ | |||||
if(length < 9) | |||||
{ | |||||
Modbus_Send_Exception(MODBUS_FC_WRITE_MULTIPLE_COILS, MODBUS_EX_ILLEGAL_DATA_VALUE); | |||||
return; | |||||
} | |||||
uint16_t start_addr = (frame[2] << 8) | frame[3]; | |||||
uint16_t coil_count = (frame[4] << 8) | frame[5]; | |||||
uint8_t byte_count = frame[6]; | |||||
if(coil_count == 0 || coil_count > 1968 || start_addr + coil_count > MODBUS_COIL_COUNT || | |||||
byte_count != (coil_count + 7) / 8 || length != 9 + byte_count) | |||||
{ | |||||
Modbus_Send_Exception(MODBUS_FC_WRITE_MULTIPLE_COILS, MODBUS_EX_ILLEGAL_DATA_VALUE); | |||||
return; | |||||
} | |||||
// 写入线圈数据 | |||||
for(uint16_t i = 0; i < coil_count; i++) | |||||
{ | |||||
uint8_t byte_index = i / 8; | |||||
uint8_t bit_index = i % 8; | |||||
uint8_t coil_value = (frame[7 + byte_index] >> bit_index) & 0x01; | |||||
Set_Coil_Bit(start_addr + i, coil_value); | |||||
} | |||||
// 发送响应 | |||||
uint8_t response[8]; | |||||
response[0] = ModbusSlave.slave_address; | |||||
response[1] = MODBUS_FC_WRITE_MULTIPLE_COILS; | |||||
response[2] = (start_addr >> 8) & 0xFF; | |||||
response[3] = start_addr & 0xFF; | |||||
response[4] = (coil_count >> 8) & 0xFF; | |||||
response[5] = coil_count & 0xFF; | |||||
Modbus_Send_Response(response, 6); | |||||
} | |||||
/** | |||||
* @brief 处理写单个保持寄存器请求 | |||||
* @param frame 接收的Modbus帧 | |||||
* @param length 帧长度 | |||||
*/ | |||||
static void Modbus_Process_Write_Reg(uint8_t *frame, uint16_t length) | |||||
{ | |||||
if(length != 8) | |||||
{ | |||||
Modbus_Send_Exception(MODBUS_FC_WRITE_REG, MODBUS_EX_ILLEGAL_DATA_VALUE); | |||||
return; | |||||
} | |||||
uint16_t reg_addr = (frame[2] << 8) | frame[3]; | |||||
uint16_t write_num = (frame[4] << 8) | frame[5]; | |||||
if(reg_addr > MODBUS_HOLDING_REG_COUNT) | |||||
{ | |||||
Modbus_Send_Exception(MODBUS_FC_WRITE_REG, MODBUS_EX_ILLEGAL_DATA_ADDRESS); | |||||
return; | |||||
} | |||||
ModbusSlave.holding_regs[reg_addr] = write_num; | |||||
BackupSRAM_SaveRegData(); | |||||
// 发送响应 | |||||
uint8_t response[8]; | |||||
response[0] = ModbusSlave.slave_address; | |||||
response[1] = MODBUS_FC_WRITE_REG; | |||||
response[2] = (reg_addr >> 8) & 0xFF; | |||||
response[3] = reg_addr & 0xFF; | |||||
response[4] = (write_num >> 8) & 0xFF; | |||||
response[5] = write_num & 0xFF; | |||||
Modbus_Send_Response(response, 8); | |||||
} | |||||
/** | |||||
* @brief 处理写多个保持寄存器请求 | |||||
* @param frame 接收的Modbus帧 | |||||
* @param length 帧长度 | |||||
*/ | |||||
static void Modbus_Process_Write_Multiple_Regs(uint8_t *frame, uint16_t length) | |||||
{ | |||||
if(length < 9) | |||||
{ | |||||
Modbus_Send_Exception(MODBUS_FC_WRITE_MULTIPLE_REGS, MODBUS_EX_ILLEGAL_DATA_VALUE); | |||||
return; | |||||
} | |||||
uint16_t start_addr = (frame[2] << 8) | frame[3]; | |||||
uint16_t reg_count = (frame[4] << 8) | frame[5]; | |||||
uint8_t byte_count = frame[6]; | |||||
if(reg_count == 0 || reg_count > 123 || start_addr + reg_count > MODBUS_HOLDING_REG_COUNT || | |||||
byte_count != reg_count * 2 || length != 9 + byte_count) | |||||
{ | |||||
Modbus_Send_Exception(MODBUS_FC_WRITE_MULTIPLE_REGS, MODBUS_EX_ILLEGAL_DATA_VALUE); | |||||
return; | |||||
} | |||||
// 写入寄存器数据 | |||||
for(uint16_t i = 0; i < reg_count; i++) | |||||
{ | |||||
uint16_t reg_value = (frame[7 + i * 2] << 8) | frame[8 + i * 2]; | |||||
ModbusSlave.holding_regs[start_addr + i] = reg_value; | |||||
} | |||||
BackupSRAM_SaveRegData(); | |||||
// 发送响应 | |||||
uint8_t response[8]; | |||||
response[0] = ModbusSlave.slave_address; | |||||
response[1] = MODBUS_FC_WRITE_MULTIPLE_REGS; | |||||
response[2] = (start_addr >> 8) & 0xFF; | |||||
response[3] = start_addr & 0xFF; | |||||
response[4] = (reg_count >> 8) & 0xFF; | |||||
response[5] = reg_count & 0xFF; | |||||
Modbus_Send_Response(response, 6); | |||||
} | |||||
/** | |||||
* @brief 发送Modbus响应 | |||||
* @param data 响应数据 | |||||
* @param length 数据长度 | |||||
*/ | |||||
static void Modbus_Send_Response(uint8_t *data, uint16_t length) | |||||
{ | |||||
uint16_t crc = Modbus_CRC16(data, length); | |||||
data[length] = crc & 0xFF; | |||||
data[length + 1] = (crc >> 8) & 0xFF; | |||||
USART1_SendData_DMA(data, length + 2); | |||||
} | |||||
/** | |||||
* @brief 发送Modbus异常响应 | |||||
* @param function_code 功能码 | |||||
* @param exception_code 异常码 | |||||
*/ | |||||
static void Modbus_Send_Exception(uint8_t function_code, uint8_t exception_code) | |||||
{ | |||||
uint8_t response[5]; | |||||
response[0] = ModbusSlave.slave_address; | |||||
response[1] = function_code | 0x80; | |||||
response[2] = exception_code; | |||||
uint16_t crc = Modbus_CRC16(response, 3); | |||||
response[3] = crc & 0xFF; | |||||
response[4] = (crc >> 8) & 0xFF; | |||||
USART1_SendData_DMA(response, 5); | |||||
} | |||||
/** | |||||
* @brief 获取线圈位状态 | |||||
* @param addr 线圈地址 | |||||
* @return 线圈状态 (0或1) | |||||
*/ | |||||
static uint8_t Get_Coil_Bit(uint16_t addr) | |||||
{ | |||||
if(addr >= MODBUS_COIL_COUNT) return 0; | |||||
uint16_t byte_index = addr / 8; | |||||
uint8_t bit_index = addr % 8; | |||||
return (ModbusSlave.coils[byte_index] >> bit_index) & 0x01; | |||||
} | |||||
/** | |||||
* @brief 设置线圈位状态 | |||||
* @param addr 线圈地址 | |||||
* @param value 线圈状态 (0或1) | |||||
*/ | |||||
static void Set_Coil_Bit(uint16_t addr, uint8_t value) | |||||
{ | |||||
if(addr >= MODBUS_COIL_COUNT) return; | |||||
uint16_t byte_index = addr / 8; | |||||
uint8_t bit_index = addr % 8; | |||||
if(value) | |||||
{ | |||||
ModbusSlave.coils[byte_index] |= (1 << bit_index); | |||||
} | |||||
else | |||||
{ | |||||
ModbusSlave.coils[byte_index] &= ~(1 << bit_index); | |||||
} | |||||
} | |||||
/** | |||||
* @brief 设置保持寄存器值 | |||||
* @param addr 寄存器地址 | |||||
* @param value 寄存器值 | |||||
*/ | |||||
void Modbus_SetHoldingRegister(uint16_t addr, uint16_t value) | |||||
{ | |||||
if(addr < MODBUS_HOLDING_REG_COUNT) | |||||
{ | |||||
ModbusSlave.holding_regs[addr] = value; | |||||
} | |||||
} | |||||
/** | |||||
* @brief 获取保持寄存器值 | |||||
* @param addr 寄存器地址 | |||||
* @return 寄存器值 | |||||
*/ | |||||
uint16_t Modbus_GetHoldingRegister(uint16_t addr) | |||||
{ | |||||
if(addr < MODBUS_HOLDING_REG_COUNT) | |||||
{ | |||||
return ModbusSlave.holding_regs[addr]; | |||||
} | |||||
return 0; | |||||
} | |||||
/** | |||||
* @brief 设置线圈状态 | |||||
* @param addr 线圈地址 | |||||
* @param value 线圈状态 | |||||
*/ | |||||
void Modbus_SetCoil(uint16_t addr, uint8_t value) | |||||
{ | |||||
Set_Coil_Bit(addr, value); | |||||
} | |||||
/** | |||||
* @brief 获取线圈状态 | |||||
* @param addr 线圈地址 | |||||
* @return 线圈状态 | |||||
*/ | |||||
uint8_t Modbus_GetCoil(uint16_t addr) | |||||
{ | |||||
return Get_Coil_Bit(addr); | |||||
} | |||||
/* USER CODE END 1 */ |
@@ -163,11 +163,11 @@ | |||||
<RecentlyUsedMenus>1</RecentlyUsedMenus> | <RecentlyUsedMenus>1</RecentlyUsedMenus> | ||||
<MenuShadows>1</MenuShadows> | <MenuShadows>1</MenuShadows> | ||||
<ShowAllMenusAfterDelay>1</ShowAllMenusAfterDelay> | <ShowAllMenusAfterDelay>1</ShowAllMenusAfterDelay> | ||||
<CommandsUsage>F402000013001386000009000000108600003801000023920000030000000F810000010000005F860000030000000C8100000F00000056860000AD00000000840000010000000E810000010000001A860000010000001F8100001700000009860000010000000B810000020000001486000015000000118600008B0000002781000006000000468100002F00000002810000010000000886000002000000</CommandsUsage> | |||||
<CommandsUsage>F502000013001386000009000000108600003801000023920000030000000F810000010000005F860000030000000C8100000F00000056860000AD00000000840000010000000E810000010000001A860000010000001F8100001700000009860000010000000B810000020000001486000015000000118600008B0000002781000006000000468100003000000002810000010000000886000002000000</CommandsUsage> | |||||
</MFCToolBarParameters> | </MFCToolBarParameters> | ||||
<CommandManager> | <CommandManager> | ||||
<CommandsWithoutImages>0500FFFFFFFF838600005886000004DC000074860000</CommandsWithoutImages> | <CommandsWithoutImages>0500FFFFFFFF838600005886000004DC000074860000</CommandsWithoutImages> | ||||
<MenuUserImages>2400578600001C00000002860000130000001386000031000000108600002F000000768600003B000000D9860000100000002392000000000000848600003C0000000A8600002D0000009A8600001A00000001860000120000005686000035000000008400007A000000D88600000F000000098600002C0000001A860000340000005E860000370000008E8600003D000000698600003A00000003860000140000001486000032000000558600000800000000860000110000001186000030000000DA860000060000000E8600001B00000046810000640000000B8600002E0000006086000039000000088600002B000000C386000004000000A18600003E0000005D860000360000001686000033000000C08600000E0000003787000003000000</MenuUserImages> | |||||
<MenuUserImages>240013860000310000000286000013000000578600001C000000768600003B000000108600002F000000848600003C0000002392000000000000D9860000100000000A8600002D000000568600003500000001860000120000009A8600001A000000008400007A000000D88600000F0000005E860000370000001A86000034000000098600002C0000008E8600003D00000014860000320000000386000014000000698600003A00000011860000300000000086000011000000558600000800000046810000640000000E8600001B000000DA8600000600000060860000390000000B8600002E0000005D86000036000000A18600003E000000C386000004000000088600002B0000003787000003000000C08600000E0000001686000033000000</MenuUserImages> | |||||
</CommandManager> | </CommandManager> | ||||
<Pane-59393> | <Pane-59393> | ||||
<ID>0</ID> | <ID>0</ID> | ||||
@@ -1094,7 +1094,7 @@ | |||||
</BasePane-34049> | </BasePane-34049> | ||||
<MFCToolBar-34050> | <MFCToolBar-34050> | ||||
<Name>Main</Name> | <Name>Main</Name> | ||||
<Buttons>00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000067000000FFFEFF000000000000000000000000000100000001000000018001E100000000000068000000FFFEFF000000000000000000000000000100000001000000018003E10000000000006A000000FFFEFF000000000000000000000000000100000001000000018000810000000000004B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006D000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018025E100000000000071000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040074000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040075000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005E000000FFFEFF000000000000000000000000000100000001000000018024E100000000000070000000FFFEFF000000000000000000000000000100000001000000018028E100000000040072000000FFFEFF000000000000000000000000000100000001000000018029E100000000000073000000FFFEFF000000000000000000000000000100000001000000018002810000000000004D000000FFFEFF0000000000000000000000000001000000010000000180298100000000000062000000FFFEFF0000000000000000000000000001000000010000000180278100000000000060000000FFFEFF0000000000000000000000000001000000010000000180288100000000000061000000FFFEFF00000000000000000000000000010000000100000001801D810000000004005A000000FFFEFF00000000000000000000000000010000000100000001801E810000000004005B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B8100000000040051000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000052000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000066000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F810000000000005C000000FFFEFF000000000000000000000000000100000001000000018020810000000000005D000000FFFEFF0000000000000000000000000001000000010000000180468100000000020064000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF020000</Buttons> | |||||
<Buttons>00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000066000000FFFEFF000000000000000000000000000100000001000000018001E100000000000067000000FFFEFF000000000000000000000000000100000001000000018003E100000000000069000000FFFEFF000000000000000000000000000100000001000000018000810000000000004A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006C000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006D000000FFFEFF000000000000000000000000000100000001000000018025E100000000000070000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040073000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040074000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000000FFFFFFFFFFFEFF0001000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005D000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006F000000FFFEFF000000000000000000000000000100000001000000018028E100000000040071000000FFFEFF000000000000000000000000000100000001000000018029E100000000000072000000FFFEFF000000000000000000000000000100000001000000018002810000000000004C000000FFFEFF0000000000000000000000000001000000010000000180298100000000000061000000FFFEFF000000000000000000000000000100000001000000018027810000000000005F000000FFFEFF0000000000000000000000000001000000010000000180288100000000000060000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040059000000FFFEFF00000000000000000000000000010000000100000001801E810000000004005A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B8100000000000050000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000051000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000065000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F810000000000005B000000FFFEFF000000000000000000000000000100000001000000018020810000000000005C000000FFFEFF0000000000000000000000000001000000010000000180468100000000020063000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF020000</Buttons> | |||||
</MFCToolBar-34050> | </MFCToolBar-34050> | ||||
<Pane-34050> | <Pane-34050> | ||||
<ID>34050</ID> | <ID>34050</ID> | ||||
@@ -14,13 +14,13 @@ | |||||
<StLinkDriver> | <StLinkDriver> | ||||
<stlinkserialNo>46232557</stlinkserialNo> | <stlinkserialNo>46232557</stlinkserialNo> | ||||
<stlinkfoundProbes /> | <stlinkfoundProbes /> | ||||
<stlinkResetStyle>0</stlinkResetStyle> | |||||
<stlinkResetStrategy>2</stlinkResetStrategy> | |||||
<CStepIntDis>_ 0</CStepIntDis> | <CStepIntDis>_ 0</CStepIntDis> | ||||
<LeaveTargetRunning>_ 0</LeaveTargetRunning> | <LeaveTargetRunning>_ 0</LeaveTargetRunning> | ||||
<stlinkResetStyle>0</stlinkResetStyle> | |||||
<stlinkResetStrategy>2</stlinkResetStrategy> | |||||
</StLinkDriver> | </StLinkDriver> | ||||
<DebugChecksum> | <DebugChecksum> | ||||
<Checksum>154654718</Checksum> | |||||
<Checksum>3949072944</Checksum> | |||||
</DebugChecksum> | </DebugChecksum> | ||||
<Exceptions> | <Exceptions> | ||||
<StopOnUncaught>_ 0</StopOnUncaught> | <StopOnUncaught>_ 0</StopOnUncaught> | ||||
@@ -84,6 +84,13 @@ | |||||
<LogFile>_ ""</LogFile> | <LogFile>_ ""</LogFile> | ||||
<Category>_ 0</Category> | <Category>_ 0</Category> | ||||
</LogFile> | </LogFile> | ||||
<DisassembleMode> | |||||
<mode>0</mode> | |||||
</DisassembleMode> | |||||
<Aliases> | |||||
<Count>0</Count> | |||||
<SuppressDialog>0</SuppressDialog> | |||||
</Aliases> | |||||
<Trace2> | <Trace2> | ||||
<Enabled>0</Enabled> | <Enabled>0</Enabled> | ||||
<ShowSource>0</ShowSource> | <ShowSource>0</ShowSource> | ||||
@@ -129,6 +136,9 @@ | |||||
<ShowTimeSum>1</ShowTimeSum> | <ShowTimeSum>1</ShowTimeSum> | ||||
<SumSortOrder>0</SumSortOrder> | <SumSortOrder>0</SumSortOrder> | ||||
</EventLog> | </EventLog> | ||||
<Breakpoints2> | |||||
<Count>0</Count> | |||||
</Breakpoints2> | |||||
<DriverProfiling> | <DriverProfiling> | ||||
<Enabled>0</Enabled> | <Enabled>0</Enabled> | ||||
<Mode>3</Mode> | <Mode>3</Mode> | ||||
@@ -142,14 +152,4 @@ | |||||
<CallStackStripe> | <CallStackStripe> | ||||
<ShowTiming>1</ShowTiming> | <ShowTiming>1</ShowTiming> | ||||
</CallStackStripe> | </CallStackStripe> | ||||
<DisassembleMode> | |||||
<mode>0</mode> | |||||
</DisassembleMode> | |||||
<Breakpoints2> | |||||
<Count>0</Count> | |||||
</Breakpoints2> | |||||
<Aliases> | |||||
<Count>0</Count> | |||||
<SuppressDialog>0</SuppressDialog> | |||||
</Aliases> | |||||
</settings> | </settings> |
@@ -1076,12 +1076,21 @@ | |||||
<file> | <file> | ||||
<name>$PROJ_DIR$\..\Core\Src\dma.c</name> | <name>$PROJ_DIR$\..\Core\Src\dma.c</name> | ||||
</file> | </file> | ||||
<file> | |||||
<name>$PROJ_DIR$\..\Core\Src\flash_save.c</name> | |||||
</file> | |||||
<file> | <file> | ||||
<name>$PROJ_DIR$\..\Core\Src\gpio.c</name> | <name>$PROJ_DIR$\..\Core\Src\gpio.c</name> | ||||
</file> | </file> | ||||
<file> | <file> | ||||
<name>$PROJ_DIR$\..\Core\Src\main.c</name> | <name>$PROJ_DIR$\..\Core\Src\main.c</name> | ||||
</file> | </file> | ||||
<file> | |||||
<name>$PROJ_DIR$\..\Core\Src\modbus_crc.c</name> | |||||
</file> | |||||
<file> | |||||
<name>$PROJ_DIR$\..\Core\Src\modbus_log.c</name> | |||||
</file> | |||||
<file> | <file> | ||||
<name>$PROJ_DIR$\..\Core\Src\stm32f4xx_hal_msp.c</name> | <name>$PROJ_DIR$\..\Core\Src\stm32f4xx_hal_msp.c</name> | ||||
</file> | </file> | ||||
@@ -1200,12 +1200,21 @@ | |||||
<file> | <file> | ||||
<name>$PROJ_DIR$\..\Core\Src\dma.c</name> | <name>$PROJ_DIR$\..\Core\Src\dma.c</name> | ||||
</file> | </file> | ||||
<file> | |||||
<name>$PROJ_DIR$\..\Core\Src\flash_save.c</name> | |||||
</file> | |||||
<file> | <file> | ||||
<name>$PROJ_DIR$\..\Core\Src\gpio.c</name> | <name>$PROJ_DIR$\..\Core\Src\gpio.c</name> | ||||
</file> | </file> | ||||
<file> | <file> | ||||
<name>$PROJ_DIR$\..\Core\Src\main.c</name> | <name>$PROJ_DIR$\..\Core\Src\main.c</name> | ||||
</file> | </file> | ||||
<file> | |||||
<name>$PROJ_DIR$\..\Core\Src\modbus_crc.c</name> | |||||
</file> | |||||
<file> | |||||
<name>$PROJ_DIR$\..\Core\Src\modbus_log.c</name> | |||||
</file> | |||||
<file> | <file> | ||||
<name>$PROJ_DIR$\..\Core\Src\stm32f4xx_hal_msp.c</name> | <name>$PROJ_DIR$\..\Core\Src\stm32f4xx_hal_msp.c</name> | ||||
</file> | </file> | ||||
@@ -1,146 +1,63 @@ | |||||
# ninja log v5 | # ninja log v5 | ||||
123 258 7764177383144035 stm32f4xx_ll_rng.pbi 5e12b9ea00d0b826 | |||||
865 901 7764177389514042 stm32f4xx_ll_gpio.pbi df8b54563945d41d | |||||
628 661 7764177387144037 stm32f4xx_ll_tim.pbi b88554c6464192f5 | |||||
2012 2480 7764177404774077 stm32f4xx_hal_flash_ex.pbi ac2d035774fe6a2e | |||||
771 1102 7764177391494047 stm32f4xx_hal_pwr.pbi b347497fce55b6a8 | |||||
661 722 7764177387504039 stm32f4xx_ll_pwr.pbi 952cb4e4f4edb65b | |||||
1103 1682 7764177397334057 test.1_part3.pbi 6eb1d553da066571 | |||||
716 1080 7764177391154049 stm32f4xx_hal_rcc_ex.pbi c1d751d24d77a2df | |||||
41 229 7764177382754038 app_hooks.pbi ffd399489d189d5a | |||||
1017 1345 7764177393944061 test.1_part4.pbi 4a2716eb92784a90 | |||||
186 649 7764177386924039 stm32f4xx_hal_pwr_ex.pbi b84426bf5a4ce0cf | |||||
44 123 7764177381674037 os_cpu_c.pbi eb75b848b406ea34 | |||||
34 420 7764177384704032 stm32f4xx_hal_rcc.pbi 50976e6b18f3b8bc | |||||
37 596 7764177386454061 stm32f4xx_hal_tim.pbi 71840baae88d57c4 | |||||
46 516 7764177385524038 stm32f4xx_hal_usart.pbi b368fafd8b8b8bb9 | |||||
1177 2720 7764189921464956 test.1.pbw f11e09b552b4c82f | |||||
2386 2550 7765944093266374 stm32f4xx_ll_rng.pbi 5e12b9ea00d0b826 | |||||
2623 2823 7765944095613336 stm32f4xx_ll_gpio.pbi df8b54563945d41d | |||||
1380 1740 7765944085304247 stm32f4xx_hal_flash_ex.pbi ac2d035774fe6a2e | |||||
2290 2697 7765944094956311 stm32f4xx_hal_pwr.pbi b347497fce55b6a8 | |||||
2592 2622 7765944094204558 stm32f4xx_ll_pwr.pbi 952cb4e4f4edb65b | |||||
1740 1773 7765944085671831 stm32f4xx_ll_tim.pbi b88554c6464192f5 | |||||
1353 1385 7765944081838449 test.1_part7.pbi 67c64030b23c9b51 | |||||
2898 3414 7765944102128366 test.1_part3.pbi 2c7780fc3f88c160 | |||||
1304 1667 7765944084550493 stm32f4xx_hal_rcc_ex.pbi c1d751d24d77a2df | |||||
2101 2274 7765944090683100 app_hooks.pbi ffd399489d189d5a | |||||
2103 2189 7765944089538184 os_cpu_c.pbi eb75b848b406ea34 | |||||
2614 2898 7765944096933757 stm32f4xx_hal_pwr_ex.pbi b84426bf5a4ce0cf | |||||
2868 3348 7765944101394896 test.1_part4.pbi b15d70d6e2dea5ca | |||||
2310 2613 7765944094111527 stm32f4xx_hal_rcc.pbi 50976e6b18f3b8bc | |||||
1385 1737 7765944085161127 stm32f4xx_hal_usart.pbi b368fafd8b8b8bb9 | |||||
2369 2868 7765944096522356 stm32f4xx_hal_tim.pbi 71840baae88d57c4 | |||||
2501 2553 7765944093276625 stm32f4xx_ll_dac.pbi 7dfc4be0933cdfaf | |||||
2014 2487 7762488664073707 uart.pbi 5ce52444157923c9 | 2014 2487 7762488664073707 uart.pbi 5ce52444157923c9 | ||||
517 553 7764177386084042 stm32f4xx_ll_dac.pbi 7dfc4be0933cdfaf | |||||
852 1017 7764177390414063 stm32f4xx_ll_crc.pbi dcf41d4b97590765 | |||||
553 719 7764177387484040 stm32f4xx_ll_rcc.pbi fb9ace481decf8ab | |||||
1430 1744 7764177397994062 stm32f4xx_hal_msp.pbi 8144db72f01a260b | |||||
594 627 7764177386824042 stm32f4xx_ll_spi.pbi ce805017b70a4f43 | |||||
597 771 7764177388264055 os_dbg.pbi f7287a072fe86a55 | |||||
720 865 7764177389204042 stm32f4xx_ll_usart.pbi 783190689e783d9 | |||||
1489 1912 7764177399674064 stm32f4xx_hal_crc.pbi 881b29e4c80746b3 | |||||
659 716 7764177387464040 stm32f4xx_ll_dma.pbi f9e6142ede2883b4 | |||||
39 185 7764177382404038 stm32f4xx_ll_exti.pbi 883a2fd463949e02 | |||||
933 944 7764177390014073 test.1_part5.pbi d64d2ad0ff3eb443 | |||||
723 852 7764177389074049 ucos_ii.pbi 4e0ab25e0060431e | |||||
2002 2368 7764177403764082 stm32f4xx_hal.pbi a073c739b6b34173 | |||||
901 933 7764177389864043 stm32f4xx_ll_i2c.pbi 7f1151d8874c40c9 | |||||
229 594 7764177386264071 stm32f4xx_hal_sram.pbi 4652c5af4efd4e19 | |||||
2005 2316 7764177403594076 stm32f4xx_hal_flash.pbi eccf13860e1d0c6a | |||||
945 1014 7764177390454069 test.1_part6.pbi ddc887ac32bb1191 | |||||
650 1020 7764177390704070 stm32f4xx_hal_tim_ex.pbi 3c68a2e86514987f | |||||
2148 2564 7764177406134072 stm32f4xx_hal_flash_ramfunc.pbi ae498685b336a49c | |||||
421 755 7764177388104041 stm32f4xx_hal_wwdg.pbi fca2b44f67349f99 | |||||
258 658 7764177387144037 stm32f4xx_hal_uart.pbi e7ca7ebbb4330340 | |||||
3862 5441 7765944122073337 test.1.pbw f11e09b552b4c82f | |||||
2274 2310 7765944091071942 stm32f4xx_ll_crc.pbi dcf41d4b97590765 | |||||
1737 1771 7765944085641834 stm32f4xx_ll_rcc.pbi fb9ace481decf8ab | |||||
2189 2249 7765944090156714 stm32f4xx_ll_spi.pbi ce805017b70a4f43 | |||||
422 906 7765944076954791 stm32f4xx_hal_msp.pbi 8144db72f01a260b | |||||
1771 1964 7765944087093658 stm32f4xx_ll_usart.pbi 783190689e783d9 | |||||
2249 2324 7765944091181946 os_dbg.pbi f7287a072fe86a55 | |||||
2324 2500 7765944092643679 stm32f4xx_ll_dma.pbi f9e6142ede2883b4 | |||||
45 424 7765944071933926 stm32f4xx_hal_crc.pbi 881b29e4c80746b3 | |||||
2553 2595 7765944093801880 stm32f4xx_ll_exti.pbi 883a2fd463949e02 | |||||
1213 1352 7765944081467551 ucos_ii.pbi 4e0ab25e0060431e | |||||
2823 2852 7765944096324667 test.1_part5.pbi 41f12be61ce67c27 | |||||
2141 2277 7765944090752286 stm32f4xx_ll_i2c.pbi 7f1151d8874c40c9 | |||||
39 518 7765944073106678 stm32f4xx_hal.pbi a073c739b6b34173 | |||||
1774 2103 7765944088941230 stm32f4xx_hal_sram.pbi 4652c5af4efd4e19 | |||||
2550 2592 7765944093722798 test.1_part6.pbi b9d684e502f25afa | |||||
2595 2999 7765944097872088 stm32f4xx_hal_flash.pbi eccf13860e1d0c6a | |||||
1965 2369 7765944091278927 stm32f4xx_hal_tim_ex.pbi 3c68a2e86514987f | |||||
1667 2100 7765944088871009 stm32f4xx_hal_wwdg.pbi fca2b44f67349f99 | |||||
2043 2386 7765944091674121 stm32f4xx_hal_flash_ramfunc.pbi ae498685b336a49c | |||||
1307 1797 7765944085944433 stm32f4xx_hal_uart.pbi e7ca7ebbb4330340 | |||||
35 454 7762489045860992 timer.pbi 8f8acc6a162957f | 35 454 7762489045860992 timer.pbi 8f8acc6a162957f | ||||
2316 2631 7764177406654074 stm32f4xx_hal_i2c.pbi 74395538aa12fa10 | |||||
1763 2148 7764177401454076 stm32f4xx_hal_dma.pbi 2d6aa8f3983bf80a | |||||
1020 1430 7764177394364052 stm32f4xx_hal_timebase_tim.pbi b6f5ce0feaca8054 | |||||
1570 2002 7764177400514075 stm32f4xx_hal_dma_ex.pbi 1960c5ab56ffede7 | |||||
755 1077 7764177391224051 stm32f4xx_hal_i2c_ex.pbi 7798e48f8e6ef374 | |||||
1913 2229 7764177402714070 stm32f4xx_hal_exti.pbi 373789209d565f00 | |||||
1745 2145 7764177401774091 main.pbi 9c0a6aa02351636a | |||||
1078 1489 7764177395304063 stm32f4xx_it.pbi d01766022cb163bc | |||||
1428 1763 7764177398054059 stm32f4xx_hal_cortex.pbi 2c6d2473a153fb5a | |||||
1683 2011 7764177400604103 system_stm32f4xx.pbi f50e519d7e78a5de | |||||
1346 1677 7764177397304058 gpio.pbi a088b5271f02118a | |||||
845 1177 7764189906354929 test.1.pbd dd3dd60110e24e1b | |||||
339 844 7764189903034906 test.1_part0.pbi 524317d160cb374e | |||||
2229 2565 7764177405934099 stm32f4xx_hal_gpio.pbi 53b438f48be9a8d0 | |||||
2368 2891 7764177409414108 test.1_part1.pbi dc01e3b8207ff4ec | |||||
2631 3131 7764177411864092 test.1_part2.pbi 5b60a24e7c60e7e6 | |||||
1014 1427 7764177394414055 dma.pbi 4f5ebe00ac67ed57 | |||||
31 338 7764189897954924 tim.pbi f07c6d790a519d93 | |||||
1678 2004 7764177400524070 usart.pbi 7c2d93866867ab60 | |||||
44 80 7764217976173092 stm32f4xx_ll_dma.pbi f9e6142ede2883b4 | |||||
37 101 7764217976413106 os_cpu_c.pbi eb75b848b406ea34 | |||||
80 121 7764217976623103 stm32f4xx_ll_rcc.pbi fb9ace481decf8ab | |||||
35 167 7764217977093094 stm32f4xx_ll_gpio.pbi df8b54563945d41d | |||||
122 271 7764217978023102 stm32f4xx_ll_rng.pbi 5e12b9ea00d0b826 | |||||
31 487 7764217979423102 stm32f4xx_hal_rcc.pbi 50976e6b18f3b8bc | |||||
40 491 7764217979403106 stm32f4xx_hal_tim_ex.pbi 3c68a2e86514987f | |||||
167 510 7764217980403109 stm32f4xx_hal_rcc_ex.pbi c1d751d24d77a2df | |||||
510 555 7764217980963120 stm32f4xx_ll_dac.pbi 7dfc4be0933cdfaf | |||||
101 558 7764217980983108 stm32f4xx_hal_wwdg.pbi fca2b44f67349f99 | |||||
42 611 7764217981523111 stm32f4xx_hal_tim.pbi 71840baae88d57c4 | |||||
39 66 7764218055246764 stm32f4xx_ll_exti.pbi 883a2fd463949e02 | |||||
35 168 7764218056256766 stm32f4xx_ll_gpio.pbi df8b54563945d41d | |||||
32 171 7764218056276770 stm32f4xx_ll_tim.pbi b88554c6464192f5 | |||||
171 206 7764218056636771 stm32f4xx_ll_dma.pbi f9e6142ede2883b4 | |||||
41 377 7764218058306766 stm32f4xx_hal_rcc_ex.pbi c1d751d24d77a2df | |||||
207 381 7764218057986773 stm32f4xx_ll_i2c.pbi 7f1151d8874c40c9 | |||||
378 412 7764218058686776 stm32f4xx_ll_pwr.pbi 952cb4e4f4edb65b | |||||
412 468 7764218059256791 app_hooks.pbi ffd399489d189d5a | |||||
43 509 7764218059666769 stm32f4xx_hal_sram.pbi 4652c5af4efd4e19 | |||||
168 511 7764218059676773 stm32f4xx_hal_wwdg.pbi fca2b44f67349f99 | |||||
37 522 7764218059796775 stm32f4xx_hal_uart.pbi e7ca7ebbb4330340 | |||||
469 539 7764218059876772 os_cpu_c.pbi eb75b848b406ea34 | |||||
381 541 7764218059856770 stm32f4xx_ll_rng.pbi 5e12b9ea00d0b826 | |||||
67 543 7764218059916773 stm32f4xx_hal_rcc.pbi 50976e6b18f3b8bc | |||||
539 577 7764218060286781 stm32f4xx_ll_rcc.pbi fb9ace481decf8ab | |||||
541 580 7764218060316784 stm32f4xx_ll_spi.pbi ce805017b70a4f43 | |||||
523 584 7764218060416785 os_dbg.pbi f7287a072fe86a55 | |||||
580 593 7764218060516780 test.1_part5.pbi d64d2ad0ff3eb443 | |||||
594 749 7764218061836782 stm32f4xx_ll_crc.pbi dcf41d4b97590765 | |||||
584 752 7764218061516779 ucos_ii.pbi 4e0ab25e0060431e | |||||
753 785 7764218062426787 stm32f4xx_ll_usart.pbi 783190689e783d9 | |||||
749 789 7764218062416777 stm32f4xx_ll_dac.pbi 7dfc4be0933cdfaf | |||||
785 834 7764218062926793 test.1_part6.pbi ddc887ac32bb1191 | |||||
512 877 7764218063336785 stm32f4xx_hal_tim_ex.pbi 3c68a2e86514987f | |||||
544 918 7764218063346786 stm32f4xx_hal_pwr_ex.pbi b84426bf5a4ce0cf | |||||
509 928 7764218063856785 stm32f4xx_hal_tim.pbi 71840baae88d57c4 | |||||
578 1063 7764218064706802 stm32f4xx_hal_usart.pbi b368fafd8b8b8bb9 | |||||
789 1168 7764218065856794 stm32f4xx_hal_msp.pbi 8144db72f01a260b | |||||
835 1185 7764218066326789 dma.pbi 4f5ebe00ac67ed57 | |||||
918 1265 7764218066996795 stm32f4xx_hal_crc.pbi 881b29e4c80746b3 | |||||
877 1328 7764218067666797 stm32f4xx_hal_dma.pbi 2d6aa8f3983bf80a | |||||
1063 1350 7764218067886792 test.1_part4.pbi 4a2716eb92784a90 | |||||
929 1373 7764218068306791 gpio.pbi a088b5271f02118a | |||||
1169 1505 7764218069566789 stm32f4xx_hal_dma_ex.pbi 1960c5ab56ffede7 | |||||
1185 1508 7764218069656796 stm32f4xx_hal_timebase_tim.pbi b6f5ce0feaca8054 | |||||
1329 1688 7764218071406797 stm32f4xx_hal_flash_ramfunc.pbi ae498685b336a49c | |||||
1266 1691 7764218070906791 stm32f4xx_hal_exti.pbi 373789209d565f00 | |||||
1351 1751 7764218071656846 stm32f4xx_hal_gpio.pbi 53b438f48be9a8d0 | |||||
1505 1857 7764218073146806 stm32f4xx_hal_cortex.pbi 2c6d2473a153fb5a | |||||
1509 1860 7764218073176797 stm32f4xx_hal_flash.pbi eccf13860e1d0c6a | |||||
1373 1911 7764218073366807 tim.pbi f07c6d790a519d93 | |||||
1689 1997 7764218074406797 stm32f4xx_hal_i2c_ex.pbi 7798e48f8e6ef374 | |||||
1691 1999 7764218074516809 stm32f4xx_hal_flash_ex.pbi ac2d035774fe6a2e | |||||
1752 2177 7764218076306808 system_stm32f4xx.pbi f50e519d7e78a5de | |||||
1860 2300 7764218077576804 stm32f4xx_hal.pbi a073c739b6b34173 | |||||
1858 2366 7764218078086813 main.pbi 9c0a6aa02351636a | |||||
1911 2367 7764218078036804 stm32f4xx_hal_pwr.pbi b347497fce55b6a8 | |||||
2000 2369 7764218078056809 usart.pbi 7c2d93866867ab60 | |||||
1997 2436 7764218078246818 stm32f4xx_it.pbi d01766022cb163bc | |||||
2178 2535 7764218079506808 stm32f4xx_hal_i2c.pbi 74395538aa12fa10 | |||||
2367 2951 7764218083776823 test.1_part3.pbi 6eb1d553da066571 | |||||
2370 2951 7764218083516820 test.1_part1.pbi dc01e3b8207ff4ec | |||||
2437 2988 7764218084336837 test.1_part0.pbi 524317d160cb374e | |||||
2536 3065 7764218085236817 test.1_part2.pbi 5b60a24e7c60e7e6 | |||||
3066 3396 7764218088546845 test.1.pbd dd3dd60110e24e1b | |||||
3396 4920 7764218103477785 test.1.pbw f11e09b552b4c82f | |||||
31 334 7764230767009972 tim.pbi f07c6d790a519d93 | |||||
334 841 7764230772080115 test.1_part0.pbi 524317d160cb374e | |||||
841 1183 7764230775509986 test.1.pbd dd3dd60110e24e1b | |||||
1183 2728 7764230790630017 test.1.pbw f11e09b552b4c82f | |||||
32 354 7764230836851837 tim.pbi f07c6d790a519d93 | |||||
355 865 7764230841961851 test.1_part0.pbi 524317d160cb374e | |||||
865 1193 7764230845241838 test.1.pbd dd3dd60110e24e1b | |||||
1193 2721 7764230860219795 test.1.pbw f11e09b552b4c82f | |||||
37 350 7764231234861946 tim.pbi f07c6d790a519d93 | |||||
351 897 7764231240342996 test.1_part0.pbi 524317d160cb374e | |||||
898 1240 7764231243673001 test.1.pbd dd3dd60110e24e1b | |||||
1241 2831 7764231259343011 test.1.pbw f11e09b552b4c82f | |||||
33 368 7764233132077882 tim.pbi f07c6d790a519d93 | |||||
368 881 7764233137177890 test.1_part0.pbi 524317d160cb374e | |||||
882 1214 7764233140537918 test.1.pbd dd3dd60110e24e1b | |||||
1214 2895 7764233155807946 test.1.pbw f11e09b552b4c82f | |||||
30 505 7764247219630332 tim.pbi f07c6d790a519d93 | |||||
505 1019 7764247224790357 test.1_part0.pbi 524317d160cb374e | |||||
1020 1348 7764247228080358 test.1.pbd dd3dd60110e24e1b | |||||
1349 2879 7764247243080386 test.1.pbw f11e09b552b4c82f | |||||
2278 2682 7765944094792178 stm32f4xx_hal_i2c.pbi 74395538aa12fa10 | |||||
34 421 7765944071873918 stm32f4xx_hal_dma.pbi 2d6aa8f3983bf80a | |||||
43 533 7765944073230826 stm32f4xx_hal_timebase_tim.pbi b6f5ce0feaca8054 | |||||
1968 2290 7765944090871643 stm32f4xx_hal_i2c_ex.pbi 7798e48f8e6ef374 | |||||
425 808 7765944076026173 stm32f4xx_hal_dma_ex.pbi 1960c5ab56ffede7 | |||||
591 1022 7765944078180586 main.pbi 9c0a6aa02351636a | |||||
518 889 7765944076803026 stm32f4xx_hal_exti.pbi 373789209d565f00 | |||||
37 591 7765944073639492 stm32f4xx_it.pbi d01766022cb163bc | |||||
1023 1380 7765944081780211 stm32f4xx_hal_cortex.pbi 2c6d2473a153fb5a | |||||
929 1307 7765944080920020 system_stm32f4xx.pbi f50e519d7e78a5de | |||||
539 925 7765944077106476 gpio.pbi a088b5271f02118a | |||||
1797 2140 7765944089172990 stm32f4xx_hal_gpio.pbi 53b438f48be9a8d0 | |||||
1371 1968 7765944087547595 test.1_part0.pbi 60db414ccd7a80f4 | |||||
3523 3861 7765944106600045 test.1.pbd 363d5d355a216cdf | |||||
1441 2042 7765944088290296 test.1_part1.pbi 72148e63fe682e2f | |||||
3000 3523 7765944103216549 test.1_part2.pbi 932c7a5b50912170 | |||||
41 538 7765944073337308 dma.pbi 4f5ebe00ac67ed57 | |||||
925 1440 7765944082259040 tim.pbi f07c6d790a519d93 | |||||
906 1303 7765944080900017 usart.pbi 7c2d93866867ab60 | |||||
808 1212 7765944079931957 modbus_log.pbi 596603da5f343c45 | |||||
534 928 7765944077266980 flash_save.pbi dc7405226be28cc6 | |||||
890 1370 7765944081683497 modbus_crc.pbi 9b76681ddf289794 |
@@ -21,8 +21,11 @@ rule browsedata | |||||
#Build steps | #Build steps | ||||
build dma.pbi : index dma.xcl | build dma.pbi : index dma.xcl | ||||
build flash_save.pbi : index flash_save.xcl | |||||
build gpio.pbi : index gpio.xcl | build gpio.pbi : index gpio.xcl | ||||
build main.pbi : index main.xcl | build main.pbi : index main.xcl | ||||
build modbus_crc.pbi : index modbus_crc.xcl | |||||
build modbus_log.pbi : index modbus_log.xcl | |||||
build stm32f4xx_hal_msp.pbi : index stm32f4xx_hal_msp.xcl | build stm32f4xx_hal_msp.pbi : index stm32f4xx_hal_msp.xcl | ||||
build stm32f4xx_hal_timebase_tim.pbi : index stm32f4xx_hal_timebase_tim.xcl | build stm32f4xx_hal_timebase_tim.pbi : index stm32f4xx_hal_timebase_tim.xcl | ||||
build stm32f4xx_it.pbi : index stm32f4xx_it.xcl | build stm32f4xx_it.pbi : index stm32f4xx_it.xcl | ||||
@@ -67,14 +70,15 @@ build app_hooks.pbi : index app_hooks.xcl | |||||
build os_cpu_c.pbi : index os_cpu_c.xcl | build os_cpu_c.pbi : index os_cpu_c.xcl | ||||
build os_dbg.pbi : index os_dbg.xcl | build os_dbg.pbi : index os_dbg.xcl | ||||
build ucos_ii.pbi : index ucos_ii.xcl | build ucos_ii.pbi : index ucos_ii.xcl | ||||
build test.1_part0.pbi : link dma.pbi gpio.pbi main.pbi stm32f4xx_hal_msp.pbi stm32f4xx_hal_timebase_tim.pbi stm32f4xx_it.pbi tim.pbi | |||||
build test.1_part1.pbi : link usart.pbi system_stm32f4xx.pbi stm32f4xx_hal.pbi stm32f4xx_hal_cortex.pbi stm32f4xx_hal_crc.pbi stm32f4xx_hal_dma.pbi stm32f4xx_hal_dma_ex.pbi | |||||
build test.1_part2.pbi : link stm32f4xx_hal_exti.pbi stm32f4xx_hal_flash.pbi stm32f4xx_hal_flash_ex.pbi stm32f4xx_hal_flash_ramfunc.pbi stm32f4xx_hal_gpio.pbi stm32f4xx_hal_i2c.pbi stm32f4xx_hal_i2c_ex.pbi | |||||
build test.1_part3.pbi : link stm32f4xx_hal_pwr.pbi stm32f4xx_hal_pwr_ex.pbi stm32f4xx_hal_rcc.pbi stm32f4xx_hal_rcc_ex.pbi stm32f4xx_hal_sram.pbi stm32f4xx_hal_tim.pbi stm32f4xx_hal_tim_ex.pbi | |||||
build test.1_part4.pbi : link stm32f4xx_hal_uart.pbi stm32f4xx_hal_usart.pbi stm32f4xx_hal_wwdg.pbi stm32f4xx_ll_crc.pbi stm32f4xx_ll_dac.pbi stm32f4xx_ll_dma.pbi stm32f4xx_ll_exti.pbi | |||||
build test.1_part5.pbi : link stm32f4xx_ll_gpio.pbi stm32f4xx_ll_i2c.pbi stm32f4xx_ll_pwr.pbi stm32f4xx_ll_rcc.pbi stm32f4xx_ll_rng.pbi stm32f4xx_ll_spi.pbi stm32f4xx_ll_tim.pbi | |||||
build test.1_part6.pbi : link stm32f4xx_ll_usart.pbi app_hooks.pbi os_cpu_c.pbi os_dbg.pbi ucos_ii.pbi | |||||
build test.1.pbd : link test.1_part0.pbi test.1_part1.pbi test.1_part2.pbi test.1_part3.pbi test.1_part4.pbi test.1_part5.pbi test.1_part6.pbi | |||||
build test.1_part0.pbi : link dma.pbi flash_save.pbi gpio.pbi main.pbi modbus_crc.pbi modbus_log.pbi stm32f4xx_hal_msp.pbi | |||||
build test.1_part1.pbi : link stm32f4xx_hal_timebase_tim.pbi stm32f4xx_it.pbi tim.pbi usart.pbi system_stm32f4xx.pbi stm32f4xx_hal.pbi stm32f4xx_hal_cortex.pbi | |||||
build test.1_part2.pbi : link stm32f4xx_hal_crc.pbi stm32f4xx_hal_dma.pbi stm32f4xx_hal_dma_ex.pbi stm32f4xx_hal_exti.pbi stm32f4xx_hal_flash.pbi stm32f4xx_hal_flash_ex.pbi stm32f4xx_hal_flash_ramfunc.pbi | |||||
build test.1_part3.pbi : link stm32f4xx_hal_gpio.pbi stm32f4xx_hal_i2c.pbi stm32f4xx_hal_i2c_ex.pbi stm32f4xx_hal_pwr.pbi stm32f4xx_hal_pwr_ex.pbi stm32f4xx_hal_rcc.pbi stm32f4xx_hal_rcc_ex.pbi | |||||
build test.1_part4.pbi : link stm32f4xx_hal_sram.pbi stm32f4xx_hal_tim.pbi stm32f4xx_hal_tim_ex.pbi stm32f4xx_hal_uart.pbi stm32f4xx_hal_usart.pbi stm32f4xx_hal_wwdg.pbi stm32f4xx_ll_crc.pbi | |||||
build test.1_part5.pbi : link stm32f4xx_ll_dac.pbi stm32f4xx_ll_dma.pbi stm32f4xx_ll_exti.pbi stm32f4xx_ll_gpio.pbi stm32f4xx_ll_i2c.pbi stm32f4xx_ll_pwr.pbi stm32f4xx_ll_rcc.pbi | |||||
build test.1_part6.pbi : link stm32f4xx_ll_rng.pbi stm32f4xx_ll_spi.pbi stm32f4xx_ll_tim.pbi stm32f4xx_ll_usart.pbi app_hooks.pbi os_cpu_c.pbi os_dbg.pbi | |||||
build test.1_part7.pbi : link ucos_ii.pbi | |||||
build test.1.pbd : link test.1_part0.pbi test.1_part1.pbi test.1_part2.pbi test.1_part3.pbi test.1_part4.pbi test.1_part5.pbi test.1_part6.pbi test.1_part7.pbi | |||||
build test.1.pbw : browsedata test.1.pbd | build test.1.pbw : browsedata test.1.pbd | ||||
@@ -1,12 +1,19 @@ | |||||
main.pbi: \ | main.pbi: \ | ||||
e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\Core\Inc\dma.h \ | e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\Core\Inc\dma.h \ | ||||
e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\Core\Inc\usart.h \ | e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\Core\Inc\usart.h \ | ||||
e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\Core\Inc\modbus_log.h \ | |||||
e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\Core\Inc\flash_save.h \ | |||||
e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\Core\Inc\modbus_crc.h \ | |||||
E:\Software\IAR\arm\inc\c\DLib_Product_stdlib.h \ | |||||
E:\Software\IAR\arm\inc\c\ycheck.h E:\Software\IAR\arm\inc\c\stdlib.h \ | |||||
E:\Software\IAR\arm\inc\c\ctype.h \ | |||||
E:\Software\IAR\arm\inc\c\DLib_Product_string.h \ | |||||
E:\Software\IAR\arm\inc\c\string.h \ | |||||
e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\Core\Inc\tim.h \ | e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\Core\Inc\tim.h \ | ||||
e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\UCOS\Source\os_trace.h \ | e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\UCOS\Source\os_trace.h \ | ||||
e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\UCOS\Ports\os_cpu.h \ | e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\UCOS\Ports\os_cpu.h \ | ||||
e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\UCOS\Config\os_cfg.h \ | e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\UCOS\Config\os_cfg.h \ | ||||
E:\Software\IAR\arm\inc\c\ycheck.h E:\Software\IAR\arm\inc\c\stdio.h \ | |||||
E:\Software\IAR\arm\inc\c\stdarg.h \ | |||||
E:\Software\IAR\arm\inc\c\stdio.h E:\Software\IAR\arm\inc\c\stdarg.h \ | |||||
e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\UCOS\Config\app_cfg.h \ | e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\UCOS\Config\app_cfg.h \ | ||||
e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\UCOS\Source\ucos_ii.h \ | e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\UCOS\Source\ucos_ii.h \ | ||||
e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\Core\Inc\gpio.h \ | e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\Core\Inc\gpio.h \ | ||||