Bläddra i källkod

完成modbus协议相关功能的移植,以及掉电保护功能的修改

master
JIU JIALIN 2 dagar sedan
förälder
incheckning
2da331cf42
100 ändrade filer med 3724 tillägg och 2870 borttagningar
  1. +2
    -0
      PLSR/PLSR/Core/Inc/stm32f4xx_hal_conf.h
  2. +1
    -0
      PLSR/PLSR/Core/Inc/stm32f4xx_it.h
  3. +18
    -13
      PLSR/PLSR/Core/Inc/tim.h
  4. +67
    -1
      PLSR/PLSR/Core/Inc/usart.h
  5. +17
    -4
      PLSR/PLSR/Core/Src/gpio.c
  6. +23
    -23
      PLSR/PLSR/Core/Src/main.c
  7. +21
    -6
      PLSR/PLSR/Core/Src/stm32f4xx_it.c
  8. +401
    -208
      PLSR/PLSR/Core/Src/tim.c
  9. +574
    -3
      PLSR/PLSR/Core/Src/usart.c
  10. +20
    -20
      PLSR/PLSR/EWARM/settings/Project.wsdt
  11. +3
    -3
      PLSR/PLSR/EWARM/settings/test.1.dbgdt
  12. +13
    -13
      PLSR/PLSR/EWARM/settings/test.1.dnx
  13. +348
    -760
      PLSR/PLSR/EWARM/test.1.dep
  14. +9
    -0
      PLSR/PLSR/EWARM/test.1.ewp
  15. +9
    -0
      PLSR/PLSR/EWARM/test.1.ewt
  16. +1418
    -1084
      PLSR/PLSR/EWARM/test.1/Exe/test.1.hex
  17. Binär
      PLSR/PLSR/EWARM/test.1/Exe/test.1.out
  18. Binär
      PLSR/PLSR/EWARM/test.1/Exe/test.1.sim
  19. +699
    -579
      PLSR/PLSR/EWARM/test.1/List/test.1.map
  20. +60
    -143
      PLSR/PLSR/EWARM/test.1/Obj/.ninja_log
  21. Binär
      PLSR/PLSR/EWARM/test.1/Obj/app_hooks.o
  22. Binär
      PLSR/PLSR/EWARM/test.1/Obj/app_hooks.pbi
  23. +12
    -8
      PLSR/PLSR/EWARM/test.1/Obj/build.ninja
  24. Binär
      PLSR/PLSR/EWARM/test.1/Obj/dma.o
  25. Binär
      PLSR/PLSR/EWARM/test.1/Obj/dma.pbi
  26. Binär
      PLSR/PLSR/EWARM/test.1/Obj/gpio.o
  27. Binär
      PLSR/PLSR/EWARM/test.1/Obj/gpio.pbi
  28. Binär
      PLSR/PLSR/EWARM/test.1/Obj/main.o
  29. Binär
      PLSR/PLSR/EWARM/test.1/Obj/main.pbi
  30. +9
    -2
      PLSR/PLSR/EWARM/test.1/Obj/main.pbi.dep
  31. Binär
      PLSR/PLSR/EWARM/test.1/Obj/os_cpu_a.o
  32. Binär
      PLSR/PLSR/EWARM/test.1/Obj/os_cpu_c.o
  33. Binär
      PLSR/PLSR/EWARM/test.1/Obj/os_cpu_c.pbi
  34. Binär
      PLSR/PLSR/EWARM/test.1/Obj/os_dbg.o
  35. Binär
      PLSR/PLSR/EWARM/test.1/Obj/os_dbg.pbi
  36. Binär
      PLSR/PLSR/EWARM/test.1/Obj/startup_stm32f407xx.o
  37. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal.o
  38. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal.pbi
  39. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_cortex.o
  40. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_cortex.pbi
  41. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_crc.o
  42. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_crc.pbi
  43. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_dma.o
  44. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_dma.pbi
  45. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_dma_ex.o
  46. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_dma_ex.pbi
  47. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_exti.o
  48. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_exti.pbi
  49. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_flash.o
  50. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_flash.pbi
  51. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_flash_ex.o
  52. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_flash_ex.pbi
  53. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_flash_ramfunc.o
  54. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_flash_ramfunc.pbi
  55. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_gpio.o
  56. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_gpio.pbi
  57. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_i2c.o
  58. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_i2c.pbi
  59. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_i2c_ex.o
  60. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_i2c_ex.pbi
  61. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_msp.o
  62. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_msp.pbi
  63. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_pwr.o
  64. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_pwr.pbi
  65. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_pwr_ex.o
  66. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_pwr_ex.pbi
  67. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_rcc.o
  68. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_rcc.pbi
  69. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_rcc_ex.o
  70. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_rcc_ex.pbi
  71. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_sram.o
  72. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_sram.pbi
  73. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_tim.o
  74. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_tim.pbi
  75. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_tim_ex.o
  76. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_tim_ex.pbi
  77. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_timebase_tim.o
  78. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_timebase_tim.pbi
  79. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_uart.o
  80. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_uart.pbi
  81. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_usart.o
  82. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_usart.pbi
  83. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_wwdg.o
  84. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_wwdg.pbi
  85. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_it.o
  86. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_it.pbi
  87. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_crc.o
  88. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_dac.o
  89. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_dma.o
  90. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_exti.o
  91. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_gpio.o
  92. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_i2c.o
  93. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_pwr.o
  94. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_rcc.o
  95. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_rng.o
  96. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_spi.o
  97. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_tim.o
  98. Binär
      PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_usart.o
  99. Binär
      PLSR/PLSR/EWARM/test.1/Obj/system_stm32f4xx.o
  100. Binär
      PLSR/PLSR/EWARM/test.1/Obj/system_stm32f4xx.pbi

+ 2
- 0
PLSR/PLSR/Core/Inc/stm32f4xx_hal_conf.h Visa fil

@@ -64,7 +64,9 @@
/* #define HAL_MMC_MODULE_ENABLED */
/* #define HAL_SPI_MODULE_ENABLED */
#define HAL_TIM_MODULE_ENABLED
#ifndef HAL_UART_MODULE_ENABLED
#define HAL_UART_MODULE_ENABLED
#endif
/* #define HAL_USART_MODULE_ENABLED */
/* #define HAL_IRDA_MODULE_ENABLED */
/* #define HAL_SMARTCARD_MODULE_ENABLED */


+ 1
- 0
PLSR/PLSR/Core/Inc/stm32f4xx_it.h Visa fil

@@ -58,6 +58,7 @@ void SysTick_Handler(void);
void TIM1_UP_TIM10_IRQHandler(void);
void USART1_IRQHandler(void);
void TIM6_DAC_IRQHandler(void);
void DMA2_Stream0_IRQHandler(void);
void DMA2_Stream2_IRQHandler(void);
void DMA2_Stream7_IRQHandler(void);
/* USER CODE BEGIN EFP */


+ 18
- 13
PLSR/PLSR/Core/Inc/tim.h Visa fil

@@ -32,7 +32,7 @@ extern "C" {

/* USER CODE END Includes */

extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim2; // TIM2恢复用于脉冲计数

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_PORT GPIOF

// 硬件计数器定义 (使用TIM2作为硬件计数器)
#define PLSR_COUNTER_PIN GPIO_PIN_5 // PA5 - TIM2_CH1 (外部时钟输入)
#define PLSR_COUNTER_PORT GPIOA
// TIM2硬件计数器已删除 - 改用TIM10中断计数

// 等待条件类型枚举
typedef enum {
@@ -83,8 +81,8 @@ typedef enum {
PLSR_STATE_ACCEL = 1, // 加速状态
PLSR_STATE_CONST = 2, // 匀速状态
PLSR_STATE_DECEL = 3, // 减速状态
PLSR_STATE_WAIT = 4, // 等待状态
PLSR_STATE_STOP = 5 // 停止状态
PLSR_STATE_WAIT = 4 // 等待状态
// 注意:移除了PLSR_STATE_STOP状态,减速到0频率时直接进入等待状态
} PLSR_RunState_t;

// 路径状态枚举
@@ -115,7 +113,7 @@ typedef enum {
} PLSR_Direction_t;
/* USER CODE END Private defines */

void MX_TIM2_Init(void);
void MX_TIM2_Init(void); // TIM2恢复用于脉冲计数
void MX_TIM6_Init(void);
void MX_TIM10_Init(void);
void MX_TIM11_Init(void);
@@ -147,7 +145,6 @@ typedef struct {
uint32_t target_pulse; // 目标脉冲数
uint8_t next_section; // 下一段号(0表示结束)
PLSR_SectionState_t section_state; // 段状态
PLSR_AccelConfig_t accel_config; // 加减速配置
PLSR_WaitCondition_t wait_condition; // 等待条件
} PLSR_SectionConfig_t;

@@ -164,6 +161,7 @@ typedef struct {
uint8_t output_port; // 输出端口选择
PLSR_Mode_t mode; // 模式(相对/绝对)
PLSR_Direction_t direction; // 方向
PLSR_AccelConfig_t accel_config; // 加减速配置
// 运行状态参数
PLSR_RunState_t run_state; // 运行状态
@@ -184,6 +182,7 @@ typedef struct {
#define PLSR_DEFAULT_ACT_TIME_MS 200 // 默认ACT时间200ms
#define PLSR_DEFAULT_WAIT_TIME_MS 200 // 默认等待时间200ms
#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_Stop(void);
void PLSR_PWM_SetFrequency(uint32_t frequency);
void PLSR_PWM_SetFrequency_Immediate(uint32_t frequency);

// ==================== 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_SetTarget(uint32_t target); //<考虑配置定时器2中断,中断触发后执行段切换
uint32_t PLSR_Counter_GetTarget(void); //<暂时无用
uint32_t PLSR_Counter_GetCount(void);

// ==================== PLSR TIM6频率配置函数 ====================
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);

// ==================== PLSR加减速算法函数 ====================
float PLSR_Accel_CalculateLinear(float progress);
float PLSR_Accel_CalculateCurve(float progress);
float PLSR_Accel_CalculateSine(float progress);
void PLSR_Accel_Process(PLSR_RouteConfig_t* route);
@@ -240,9 +241,13 @@ uint32_t PLSR_GetSystemTick(void);
uint32_t PLSR_PWM_GetFrequency(void);
void PLSR_PWM_SetDutyCycle(uint8_t duty_percent);

// UCOSII任务相关函数
uint8_t PLSR_CheckTaskNotification(void);
void PLSR_Task_SectionProcess(PLSR_RouteConfig_t* 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; // 外部事件标志
/* USER CODE END Prototypes */



+ 67
- 1
PLSR/PLSR/Core/Inc/usart.h Visa fil

@@ -29,19 +29,85 @@ extern "C" {
#include "main.h"

/* 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 */

extern UART_HandleTypeDef huart1;

/* 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 */

void MX_USART1_UART_Init(void);

/* 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 */

#ifdef __cplusplus


+ 17
- 4
PLSR/PLSR/Core/Src/gpio.c Visa fil

@@ -47,18 +47,31 @@ void MX_GPIO_Init(void)
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();

/*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.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);

}



+ 23
- 23
PLSR/PLSR/Core/Src/main.c Visa fil

@@ -27,6 +27,7 @@
#include "tim.h"
#include "usart.h"
#include "dma.h"
#include "flash_save.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
@@ -49,13 +50,13 @@
/* USER CODE BEGIN PV */
/* 任务堆栈定义 */
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 PLSR_AccelProfile_t motor_profile;
/* 任务函数声明 */
static void StartupTask(void *p_arg);
static void LedTask(void *p_arg);
static void MODBUSTask(void *p_arg);
static void KeyTask(void *p_arg);
/* USER CODE END PV */

@@ -97,11 +98,11 @@ int main(void)
/* USER CODE END SysInit */

/* Initialize all configured peripherals */
//MX_GPIO_Init();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_DMA_Init();
PLSR_PWM_Init();
PLSR_Route_Init(&g_plsr_route);
/* 初始化备份SRAM和DMA */
BackupSRAM_Init();
/* USER CODE BEGIN 2 */
/* 初始化uC/OS-II */
@@ -191,18 +192,23 @@ static void StartupTask(void *p_arg)
/* 初始化SysTick */
OS_CPU_SysTickInitFreq(SystemCoreClock);
PLSR_PWM_Init();
PLSR_Route_Init(&g_plsr_route);


/* 启用统计任务 */
#if OS_TASK_STAT_EN > 0u
OSStatInit();
#endif
/* 创建启动任务 */
err = OSTaskCreateExt(LedTask,
err = OSTaskCreateExt(MODBUSTask,
(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,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
/* 创建启动任务 */
@@ -224,22 +230,15 @@ static void StartupTask(void *p_arg)
/* 启动任务完成,删除自身 */
OSTaskDel(OS_PRIO_SELF);
}
static void LedTask(void *p_arg)
static void MODBUSTask(void *p_arg)
{
(void)p_arg;
uint8_t data = 0;
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);
while (1)
{

OSTimeDlyHMSM(0, 0, 0, 10); /* 延时10ms */
}
}
@@ -281,7 +281,7 @@ void Error_Handler(void)
* @param line: assert_param error line source number
* @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 can add his own implementation to report the file name and line number,


+ 21
- 6
PLSR/PLSR/Core/Src/stm32f4xx_it.c Visa fil

@@ -49,6 +49,7 @@ extern DMA_HandleTypeDef hdma_usart1_rx;
extern DMA_HandleTypeDef hdma_usart1_tx;
extern UART_HandleTypeDef huart1;
extern TIM_HandleTypeDef htim1;
extern DMA_HandleTypeDef hdma_backup;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
@@ -226,11 +227,16 @@ void TIM1_UP_TIM10_IRQHandler(void)
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */

OSIntEnter();
// 处理UART空闲中断
extern void USART1_IDLE_IRQHandler(void);
USART1_IDLE_IRQHandler();
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */

OSIntExit();
/* USER CODE END USART1_IRQn 1 */
}

@@ -254,11 +260,11 @@ void TIM6_DAC_IRQHandler(void)
void DMA2_Stream2_IRQHandler(void)
{
/* USER CODE BEGIN DMA2_Stream2_IRQn 0 */
OSIntEnter();
/* USER CODE END DMA2_Stream2_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_usart1_rx);
/* USER CODE BEGIN DMA2_Stream2_IRQn 1 */
OSIntExit();
/* USER CODE END DMA2_Stream2_IRQn 1 */
}

@@ -268,14 +274,23 @@ void DMA2_Stream2_IRQHandler(void)
void DMA2_Stream7_IRQHandler(void)
{
/* USER CODE BEGIN DMA2_Stream7_IRQn 0 */
OSIntEnter();
/* USER CODE END DMA2_Stream7_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_usart1_tx);
/* USER CODE BEGIN DMA2_Stream7_IRQn 1 */
OSIntExit();
/* 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 END 1 */

+ 401
- 208
PLSR/PLSR/Core/Src/tim.c Visa fil

@@ -24,14 +24,38 @@
/* USER CODE BEGIN 0 */
// ==================== 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; // 外部事件标志

// ==================== PLSR内部变量 ====================
static uint32_t s_tim6_update_freq_us = 1000; // TIM6更新频率(微秒)
static uint32_t s_current_pwm_freq = 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等待条件处理函数实现 ====================

/**
@@ -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_WaitCondition_t* wait_cond = &current_section->wait_condition;
// 记录当前时间作为起始时间
// 根据等待类型设置TIM6计时器
switch (wait_cond->wait_type) {
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;
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;
case PLSR_WAIT_CONDITION:
case PLSR_WAIT_EXT_EVENT:
case PLSR_WAIT_EXT_OR_END:
// 外部事件不需要计时器
// 这些条件不需要TIM6计时器
break;
default:
@@ -79,10 +108,16 @@ uint8_t PLSR_Wait_CheckTimeCondition(PLSR_RouteConfig_t* route)
{
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;
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)
{
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 */

TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim2; // TIM2恢复用于脉冲计数
TIM_HandleTypeDef htim6;
TIM_HandleTypeDef htim10;
TIM_HandleTypeDef htim11;
@@ -183,7 +295,6 @@ TIM_HandleTypeDef htim14;
/* TIM2 init function */
void MX_TIM2_Init(void)
{

/* USER CODE BEGIN TIM2_Init 0 */

/* USER CODE END TIM2_Init 0 */
@@ -195,19 +306,20 @@ void MX_TIM2_Init(void)

/* USER CODE END TIM2_Init 1 */
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;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
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)
{
Error_Handler();
@@ -219,9 +331,9 @@ void MX_TIM2_Init(void)
Error_Handler();
}
/* USER CODE BEGIN TIM2_Init 2 */
HAL_TIM_Base_Start(&htim2);
HAL_TIM_Base_MspInit(&htim2);

/* USER CODE END TIM2_Init 2 */

}
/* TIM6 init function */
void MX_TIM6_Init(void)
@@ -433,9 +545,6 @@ void MX_TIM14_Init(void)
*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
// 定义GPIO初始化结构体
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 根据定时器实例进行不同的初始化配置
if(tim_baseHandle->Instance==TIM2)
{
@@ -445,25 +554,25 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
// 使能TIM2时钟
__HAL_RCC_TIM2_CLK_ENABLE();

// 使能GPIOA时钟,用于配置PA15引脚
// 使能GPIOA时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
/**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 END TIM2_MspInit 1 */
}
else if(tim_baseHandle->Instance==TIM6)
if(tim_baseHandle->Instance==TIM6)
{
/* 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 */
}
else if(tim_baseHandle->Instance==TIM6)
if(tim_baseHandle->Instance==TIM6)
{
/* USER CODE BEGIN TIM6_MspDeInit 0 */

@@ -720,10 +829,12 @@ void PLSR_PWM_Init(void)
MX_TIM11_Init();
MX_TIM13_Init();
MX_TIM14_Init();
MX_TIM2_Init();
MX_TIM2_Init(); // TIM2恢复用于脉冲计数
MX_TIM6_Init();
// 停止PWM输出
HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);

BackupSRAM_RestoreData();
}


@@ -731,16 +842,19 @@ void PLSR_PWM_Init(void)
* @brief 启动PLSR PWM输出
* @param None
* @retval None
* @note 启动TIM10 PWM输出和TIM2计数器
* @note 启动TIM10 PWM输出和更新中断
*/
void PLSR_PWM_Start(void) //<后续加入启动通道选择
void PLSR_PWM_Start(void)
{
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);
// 停止TIM2计数器
HAL_TIM_Base_Stop(&htim2);
HAL_TIM_Base_Stop(&htim2); // TIM2恢复用于脉冲计数
s_pwm_running = 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) = 定时器时钟频率 / 目标频率
// 频率为0时的异常处理
// 频率为0时停止PWM输出
if (frequency == 0) {
PLSR_PWM_Stop(); // 直接停止PWM输出
*prescaler = 0;
*period = 0;
return;
@@ -795,7 +910,8 @@ static void PLSR_CalculateTimerParams(uint32_t frequency, uint16_t* prescaler, u
// 遍历所有可能的预分频器值,寻找合适的组合
// 预分频器范围: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;
@@ -838,6 +954,13 @@ static void PLSR_CalculateTimerParams(uint32_t frequency, uint16_t* prescaler, u
* 6. 状态恢复 - 如果之前在运行,重新启动PWM
* 7. 记录更新 - 更新当前频率记录
*/
/**
* @brief 安全设置PWM频率(通过中断更新)
* @param frequency 目标频率(Hz)
*
* 该函数不直接更新定时器参数,而是设置待更新的参数,
* 实际更新在TIM10中断中完成,确保原子性和波形连续性。
*/
void PLSR_PWM_SetFrequency(uint32_t frequency)
{
uint16_t prescaler = 0; // 预分频器值
@@ -852,18 +975,44 @@ void PLSR_PWM_SetFrequency(uint32_t frequency)
// 计算最佳定时器参数 - 根据目标频率计算预分频器和周期值
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;
}

@@ -873,17 +1022,7 @@ void PLSR_PWM_SetFrequency(uint32_t frequency)
* @brief 设置TIM6更新频率
* @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)
{
@@ -947,45 +1086,6 @@ void PLSR_TIM6_Stop(void)
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频率
@@ -1015,37 +1115,78 @@ void PLSR_PWM_SetDutyCycle(uint8_t duty_percent)
/**
* @brief 定时器周期结束中断回调函数
* @param htim 定时器句柄指针
*
* 该函数是HAL库的标准定时器中断回调函数,当定时器计数器溢出时被自动调用。
* 在PLSR系统中,主要用于TIM6的周期性中断处理,实现精确的时序控制。
*
* 处理流程:
* 1. 定时器识别 - 检查是否为TIM6中断
* 2. 路径处理 - 调用PLSR_Section_Process执行路径状态机
* 3. 时钟更新 - 递增系统时钟计数器
*
* @note TIM6中断频率由PLSR_TIM6_SetUpdateFreq函数设置,直接影响加减速算法的执行精度
* @note 该函数在中断上下文中执行,应保持处理时间尽可能短
*/
// 全局变量用于TIM10中断与任务通信
// 频率更新相关静态变量已在文件开头声明

#define PLSR_TASK_CHECK_INTERVAL 100 // 每100个脉冲通知任务一次

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)
{
// 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->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->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_Counter_Reset(); // 重置脉冲计数器
PLSR_PWM_Stop(); // 停止PWM输出
PLSR_TIM6_Stop(); // 停止TIM6定时器
}
@@ -1129,8 +1273,8 @@ void PLSR_Route_Start(PLSR_RouteConfig_t* route)
route->current_freq = route->start_freq; //< 设置当前频率为起始频率
route->pulse_count = 0; //< 清零脉冲计数
// 硬件资源初始化
PLSR_Counter_Reset(); //< 重置脉冲计数器
// 重置脉冲计数器 - 现在使用软件计数
route->pulse_count = 0; // 直接重置软件脉冲计数
// PWM输出初始化 - 根据起始频率决定是否启动
if (route->start_freq > 0) {
@@ -1165,7 +1309,7 @@ void PLSR_Route_Stop(PLSR_RouteConfig_t* route)
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->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;
@@ -1264,10 +1405,7 @@ void PLSR_Section_Process(PLSR_RouteConfig_t* route)
PLSR_Section_ProcessWait(route);
break;
case PLSR_STATE_STOP:
// 停止状态:立即停止路径执行
PLSR_Route_Stop(route);
break;

default:
// 未知状态:重置为空闲状态
@@ -1299,14 +1437,14 @@ static void PLSR_Section_StartNewSection(PLSR_RouteConfig_t* route)
// 目标频率大于当前频率:需要加速到目标频率
route->run_state = PLSR_STATE_ACCEL;
// 计算加速过程的步数和参数(参数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)
{
// 目标频率小于当前频率:需要减速到目标频率
route->run_state = PLSR_STATE_DECEL;
// 计算减速过程的步数和参数(参数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
{
@@ -1413,23 +1551,23 @@ void PLSR_Section_CalculateConstPulse(PLSR_RouteConfig_t* route)
// 参数有效性检查:路径指针不能为空
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加减速算法函数实现 ====================

/**
* @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 曲线加减速算法
* @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; // 总减速步数
// 获取当前段配置和初始化变量
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; // 新频率,默认为当前频率
uint8_t state_changed = 0; // 状态改变标志
// ==================== 加速处理 ====================
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; // 保存总加速步数
start_freq_accel = route->current_freq; // 保存加速起始频率
}
// 根据加速算法类型计算新频率
switch (current_section->accel_config.accel_algorithm)
switch (route->accel_config.accel_algorithm)
{
case PLSR_ACCEL_LINEAR:
{
@@ -1641,12 +1762,14 @@ void PLSR_Accel_Process(PLSR_RouteConfig_t* route)
// 根据算法类型计算频率比例
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); // 曲线算法
} else {
}
else
{
freq_ratio = PLSR_Accel_CalculateSine(progress); // 正弦算法
}
}
// 计算新频率 = 起始频率 + (频率范围 × 频率比例)
uint32_t freq_range = route->target_freq - start_freq_accel;
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;
route->run_state = PLSR_STATE_CONST;
state_changed = 1; // 标记状态已改变
// 重置加速相关的静态变量
total_accel_steps = 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:
{
// 直线减速:使用固定频率减量
@@ -1711,7 +1833,7 @@ void PLSR_Accel_Process(PLSR_RouteConfig_t* route)
// 根据算法类型计算频率比例
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); // 曲线算法
} else {
freq_ratio = PLSR_Accel_CalculateSine(progress); // 正弦算法
@@ -1738,10 +1860,17 @@ void PLSR_Accel_Process(PLSR_RouteConfig_t* route)
}
else
{
// 减速完成,设置为目标频率并切换到匀速状态
// 减速完成,设置为目标频率
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;
start_freq_decel = 0;
@@ -1749,16 +1878,20 @@ void PLSR_Accel_Process(PLSR_RouteConfig_t* route)
}
// ==================== 频率更新和状态检查 ====================
// 如果频率发生变化,更新PWM输出频率
// 如果频率发生变化,设置频率更新标志
if (new_freq != route->current_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;
// 更新脉冲计数
route->pulse_count = PLSR_Counter_GetCount();
// 脉冲计数已在TIM10中断中自动更新
// 检查是否需要进入减速或完成段
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);
}






+ 574
- 3
PLSR/PLSR/Core/Src/usart.c Visa fil

@@ -21,7 +21,30 @@
#include "usart.h"

/* 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 */

UART_HandleTypeDef huart1;
@@ -53,7 +76,14 @@ void MX_USART1_UART_Init(void)
Error_Handler();
}
/* 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 */

}
@@ -82,6 +112,9 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

/* DMA controller clock enable */
__HAL_RCC_DMA2_CLK_ENABLE();

/* USART1 DMA Init */
/* USART1_RX Init */
hdma_usart1_rx.Instance = DMA2_Stream2;
@@ -119,8 +152,16 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)

__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 */
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
HAL_NVIC_SetPriority(USART1_IRQn, 4, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
/* USER CODE BEGIN USART1_MspInit 1 */

@@ -159,4 +200,534 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)

/* 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 */

+ 20
- 20
PLSR/PLSR/EWARM/settings/Project.wsdt
Filskillnaden har hållits tillbaka eftersom den är för stor
Visa fil


+ 3
- 3
PLSR/PLSR/EWARM/settings/test.1.dbgdt Visa fil

@@ -163,11 +163,11 @@
<RecentlyUsedMenus>1</RecentlyUsedMenus>
<MenuShadows>1</MenuShadows>
<ShowAllMenusAfterDelay>1</ShowAllMenusAfterDelay>
<CommandsUsage>F402000013001386000009000000108600003801000023920000030000000F810000010000005F860000030000000C8100000F00000056860000AD00000000840000010000000E810000010000001A860000010000001F8100001700000009860000010000000B810000020000001486000015000000118600008B0000002781000006000000468100002F00000002810000010000000886000002000000</CommandsUsage>
<CommandsUsage>F502000013001386000009000000108600003801000023920000030000000F810000010000005F860000030000000C8100000F00000056860000AD00000000840000010000000E810000010000001A860000010000001F8100001700000009860000010000000B810000020000001486000015000000118600008B0000002781000006000000468100003000000002810000010000000886000002000000</CommandsUsage>
</MFCToolBarParameters>
<CommandManager>
<CommandsWithoutImages>0500FFFFFFFF838600005886000004DC000074860000</CommandsWithoutImages>
<MenuUserImages>2400578600001C00000002860000130000001386000031000000108600002F000000768600003B000000D9860000100000002392000000000000848600003C0000000A8600002D0000009A8600001A00000001860000120000005686000035000000008400007A000000D88600000F000000098600002C0000001A860000340000005E860000370000008E8600003D000000698600003A00000003860000140000001486000032000000558600000800000000860000110000001186000030000000DA860000060000000E8600001B00000046810000640000000B8600002E0000006086000039000000088600002B000000C386000004000000A18600003E0000005D860000360000001686000033000000C08600000E0000003787000003000000</MenuUserImages>
<MenuUserImages>240013860000310000000286000013000000578600001C000000768600003B000000108600002F000000848600003C0000002392000000000000D9860000100000000A8600002D000000568600003500000001860000120000009A8600001A000000008400007A000000D88600000F0000005E860000370000001A86000034000000098600002C0000008E8600003D00000014860000320000000386000014000000698600003A00000011860000300000000086000011000000558600000800000046810000640000000E8600001B000000DA8600000600000060860000390000000B8600002E0000005D86000036000000A18600003E000000C386000004000000088600002B0000003787000003000000C08600000E0000001686000033000000</MenuUserImages>
</CommandManager>
<Pane-59393>
<ID>0</ID>
@@ -1094,7 +1094,7 @@
</BasePane-34049>
<MFCToolBar-34050>
<Name>Main</Name>
<Buttons>00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000067000000FFFEFF000000000000000000000000000100000001000000018001E100000000000068000000FFFEFF000000000000000000000000000100000001000000018003E10000000000006A000000FFFEFF000000000000000000000000000100000001000000018000810000000000004B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006D000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018025E100000000000071000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040074000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040075000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005E000000FFFEFF000000000000000000000000000100000001000000018024E100000000000070000000FFFEFF000000000000000000000000000100000001000000018028E100000000040072000000FFFEFF000000000000000000000000000100000001000000018029E100000000000073000000FFFEFF000000000000000000000000000100000001000000018002810000000000004D000000FFFEFF0000000000000000000000000001000000010000000180298100000000000062000000FFFEFF0000000000000000000000000001000000010000000180278100000000000060000000FFFEFF0000000000000000000000000001000000010000000180288100000000000061000000FFFEFF00000000000000000000000000010000000100000001801D810000000004005A000000FFFEFF00000000000000000000000000010000000100000001801E810000000004005B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B8100000000040051000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000052000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000066000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F810000000000005C000000FFFEFF000000000000000000000000000100000001000000018020810000000000005D000000FFFEFF0000000000000000000000000001000000010000000180468100000000020064000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF020000</Buttons>
<Buttons>00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000066000000FFFEFF000000000000000000000000000100000001000000018001E100000000000067000000FFFEFF000000000000000000000000000100000001000000018003E100000000000069000000FFFEFF000000000000000000000000000100000001000000018000810000000000004A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006C000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006D000000FFFEFF000000000000000000000000000100000001000000018025E100000000000070000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040073000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040074000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000000FFFFFFFFFFFEFF0001000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005D000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006F000000FFFEFF000000000000000000000000000100000001000000018028E100000000040071000000FFFEFF000000000000000000000000000100000001000000018029E100000000000072000000FFFEFF000000000000000000000000000100000001000000018002810000000000004C000000FFFEFF0000000000000000000000000001000000010000000180298100000000000061000000FFFEFF000000000000000000000000000100000001000000018027810000000000005F000000FFFEFF0000000000000000000000000001000000010000000180288100000000000060000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040059000000FFFEFF00000000000000000000000000010000000100000001801E810000000004005A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B8100000000000050000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000051000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000065000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F810000000000005B000000FFFEFF000000000000000000000000000100000001000000018020810000000000005C000000FFFEFF0000000000000000000000000001000000010000000180468100000000020063000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF020000</Buttons>
</MFCToolBar-34050>
<Pane-34050>
<ID>34050</ID>


+ 13
- 13
PLSR/PLSR/EWARM/settings/test.1.dnx Visa fil

@@ -14,13 +14,13 @@
<StLinkDriver>
<stlinkserialNo>46232557</stlinkserialNo>
<stlinkfoundProbes />
<stlinkResetStyle>0</stlinkResetStyle>
<stlinkResetStrategy>2</stlinkResetStrategy>
<CStepIntDis>_ 0</CStepIntDis>
<LeaveTargetRunning>_ 0</LeaveTargetRunning>
<stlinkResetStyle>0</stlinkResetStyle>
<stlinkResetStrategy>2</stlinkResetStrategy>
</StLinkDriver>
<DebugChecksum>
<Checksum>154654718</Checksum>
<Checksum>3949072944</Checksum>
</DebugChecksum>
<Exceptions>
<StopOnUncaught>_ 0</StopOnUncaught>
@@ -84,6 +84,13 @@
<LogFile>_ ""</LogFile>
<Category>_ 0</Category>
</LogFile>
<DisassembleMode>
<mode>0</mode>
</DisassembleMode>
<Aliases>
<Count>0</Count>
<SuppressDialog>0</SuppressDialog>
</Aliases>
<Trace2>
<Enabled>0</Enabled>
<ShowSource>0</ShowSource>
@@ -129,6 +136,9 @@
<ShowTimeSum>1</ShowTimeSum>
<SumSortOrder>0</SumSortOrder>
</EventLog>
<Breakpoints2>
<Count>0</Count>
</Breakpoints2>
<DriverProfiling>
<Enabled>0</Enabled>
<Mode>3</Mode>
@@ -142,14 +152,4 @@
<CallStackStripe>
<ShowTiming>1</ShowTiming>
</CallStackStripe>
<DisassembleMode>
<mode>0</mode>
</DisassembleMode>
<Breakpoints2>
<Count>0</Count>
</Breakpoints2>
<Aliases>
<Count>0</Count>
<SuppressDialog>0</SuppressDialog>
</Aliases>
</settings>

+ 348
- 760
PLSR/PLSR/EWARM/test.1.dep
Filskillnaden har hållits tillbaka eftersom den är för stor
Visa fil


+ 9
- 0
PLSR/PLSR/EWARM/test.1.ewp Visa fil

@@ -1076,12 +1076,21 @@
<file>
<name>$PROJ_DIR$\..\Core\Src\dma.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\Core\Src\flash_save.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\Core\Src\gpio.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\Core\Src\main.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\Core\Src\modbus_crc.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\Core\Src\modbus_log.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\Core\Src\stm32f4xx_hal_msp.c</name>
</file>


+ 9
- 0
PLSR/PLSR/EWARM/test.1.ewt Visa fil

@@ -1200,12 +1200,21 @@
<file>
<name>$PROJ_DIR$\..\Core\Src\dma.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\Core\Src\flash_save.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\Core\Src\gpio.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\Core\Src\main.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\Core\Src\modbus_crc.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\Core\Src\modbus_log.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\Core\Src\stm32f4xx_hal_msp.c</name>
</file>


+ 1418
- 1084
PLSR/PLSR/EWARM/test.1/Exe/test.1.hex
Filskillnaden har hållits tillbaka eftersom den är för stor
Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Exe/test.1.out Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Exe/test.1.sim Visa fil


+ 699
- 579
PLSR/PLSR/EWARM/test.1/List/test.1.map
Filskillnaden har hållits tillbaka eftersom den är för stor
Visa fil


+ 60
- 143
PLSR/PLSR/EWARM/test.1/Obj/.ninja_log Visa fil

@@ -1,146 +1,63 @@
# 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
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
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

Binär
PLSR/PLSR/EWARM/test.1/Obj/app_hooks.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/app_hooks.pbi Visa fil


+ 12
- 8
PLSR/PLSR/EWARM/test.1/Obj/build.ninja Visa fil

@@ -21,8 +21,11 @@ rule browsedata

#Build steps
build dma.pbi : index dma.xcl
build flash_save.pbi : index flash_save.xcl
build gpio.pbi : index gpio.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_timebase_tim.pbi : index stm32f4xx_hal_timebase_tim.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_dbg.pbi : index os_dbg.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



Binär
PLSR/PLSR/EWARM/test.1/Obj/dma.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/dma.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/gpio.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/gpio.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/main.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/main.pbi Visa fil


+ 9
- 2
PLSR/PLSR/EWARM/test.1/Obj/main.pbi.dep Visa fil

@@ -1,12 +1,19 @@
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\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\..\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\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\Source\ucos_ii.h \
e:\Users\Mortal\Desktop\Train_Camp_PLSR\PLSR\PLSR\EWARM\..\Core\Inc\gpio.h \


Binär
PLSR/PLSR/EWARM/test.1/Obj/os_cpu_a.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/os_cpu_c.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/os_cpu_c.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/os_dbg.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/os_dbg.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/startup_stm32f407xx.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_cortex.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_cortex.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_crc.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_crc.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_dma.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_dma.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_dma_ex.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_dma_ex.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_exti.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_exti.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_flash.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_flash.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_flash_ex.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_flash_ex.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_flash_ramfunc.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_flash_ramfunc.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_gpio.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_gpio.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_i2c.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_i2c.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_i2c_ex.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_i2c_ex.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_msp.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_msp.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_pwr.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_pwr.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_pwr_ex.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_pwr_ex.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_rcc.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_rcc.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_rcc_ex.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_rcc_ex.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_sram.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_sram.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_tim.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_tim.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_tim_ex.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_tim_ex.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_timebase_tim.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_timebase_tim.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_uart.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_uart.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_usart.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_usart.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_wwdg.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_hal_wwdg.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_it.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_it.pbi Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_crc.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_dac.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_dma.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_exti.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_gpio.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_i2c.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_pwr.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_rcc.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_rng.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_spi.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_tim.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/stm32f4xx_ll_usart.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/system_stm32f4xx.o Visa fil


Binär
PLSR/PLSR/EWARM/test.1/Obj/system_stm32f4xx.pbi Visa fil


Vissa filer visades inte eftersom för många filer har ändrats

Laddar…
Avbryt
Spara