Explorar el Código

2025.08.11

实现与上位机的基本通信
脉冲直线加减速
master
Chiri hace 2 días
padre
commit
a76d8e5656
Se han modificado 20 ficheros con 2342 adiciones y 2093 borrados
  1. +2
    -1
      Core/Inc/main.h
  2. +63
    -41
      Core/Src/main.c
  3. +8
    -7
      Core/Src/stm32f4xx_it.c
  4. +635
    -612
      EWARM/PLSR.dep
  5. +1319
    -1317
      EWARM/PLSR.ewp
  6. +3
    -0
      EWARM/PLSR.ewt
  7. +80
    -38
      EWARM/settings/PLSR.dbgdt
  8. +11
    -4
      EWARM/settings/PLSR.dnx
  9. +18
    -19
      EWARM/settings/Project.wsdt
  10. +26
    -0
      Hardware/BitSet.c
  11. +9
    -0
      Hardware/BitSet.h
  12. +54
    -26
      Hardware/PLSR.c
  13. +5
    -5
      Hardware/PLSR.h
  14. +45
    -15
      Hardware/modbus.c
  15. +4
    -2
      Hardware/modbus.h
  16. +1
    -1
      Hardware/sram.c
  17. +1
    -1
      Hardware/sram.h
  18. +58
    -4
      Words/流程图.md
  19. BIN
      Words/设计方案书 .doc
  20. BIN
      Words/需求规格书.doc

+ 2
- 1
Core/Inc/main.h Ver fichero

@@ -39,7 +39,8 @@ extern "C" {
extern uint8_t ArrFlag; /* 加速度Flag */
extern float Acc; /* 加速度 */
extern uint8_t PulseNum; /* 脉冲段计数 */
extern uint32_t AllPulseCNT;
extern int32_t AllPulseCNT;
extern int32_t BaseCNT;

extern uint8_t EndFlag;
extern uint8_t FullFlag;


+ 63
- 41
Core/Src/main.c Ver fichero

@@ -28,16 +28,21 @@
#include "PLSR.h"
#include "includes.h"
#include "modbus.h"
#include "bitset.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
uint8_t ArrFlag = 0; /* 加速度Flag */
float Acc; /* 加速度 */
uint32_t AllPulseCNT = 0;
int32_t AllPulseCNT = 0;
int32_t BaseCNT = 0;

uint8_t EndFlag = 0;
uint8_t FullFlag = 0;

extern uint8_t Register_H[16384]; ///<寄存器的高字节
extern uint8_t Register_L[16384]; ///<寄存器的低字节
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
@@ -72,7 +77,7 @@ void PVD_Init(void);

/* 任务堆栈大小 */
#define Task_Y1Direction_SIZE 256
#define Task_PulseStart_SIZE 256
#define Task_PulseStart_SIZE 512
#define Task_DirOutput_SIZE 256

/* 任务控制块 */
@@ -99,7 +104,7 @@ void DirOutput(void *p_arg);
int main(void)
{
/* USER CODE BEGIN 1 */
OS_ERR err;
OS_ERR err;
/* USER CODE END 1 */

/* MCU Configuration--------------------------------------------------------*/
@@ -127,26 +132,28 @@ int main(void)
MX_TIM10_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
PulseBaseInit(0, 0, 200);//设置为第0段脉冲开始,相对模式, 最大脉冲为0
AccCount = 50;
PulseInit(0, 1, 5, 0); //第几段脉冲,频率,数量,下一段脉冲
AddPulse(1, 100, -200, 0);
AddPulse(2, 1, 55, 0);

// PulseBaseInit(0, 0, 200);//设置为第0段脉冲开始,相对模式, 最大脉冲为0
// PulseInit(0, 1, 5, 0); //第几段脉冲,频率,数量,下一段脉冲
// AddPulse(1, 100, 200, 0);
// AddPulse(2, 1, 55, 0);
// Options.AccUpTime = 50;
BSP_Init();
OSInit(&err);
CPU_SR_ALLOC();
CPU_CRITICAL_ENTER();///进入临界区
/* 任务1 */
OSTaskCreate((OS_TCB * )&Y1Direction_Tsk, /* 任务控制块 */
(CPU_CHAR* )"Y1Direction", /* 任务名字 */
(OS_TASK_PTR)Y1Direction, /* 任务函数 */
(void * )0, /* 传递给任务函数的参数 */
(OS_PRIO )TASK_Y1Direction, /* 任务优先级 */
(CPU_STK * )&Task_Y1Direction_STK[0], /* 任务堆栈基地址 */
OSTaskCreate((OS_TCB * )&Y1Direction_Tsk, /* 任务控制块 */
(CPU_CHAR* )"Y1Direction", /* 任务名字 */
(OS_TASK_PTR)Y1Direction, /* 任务函数 */
(void * )0, /* 传递给任务函数的参数 */
(OS_PRIO )TASK_Y1Direction, /* 任务优先级 */
(CPU_STK * )&Task_Y1Direction_STK[0], /* 任务堆栈基地址 */
(CPU_STK_SIZE)Task_Y1Direction_SIZE/10, /* 任务堆栈深度限位 */
(CPU_STK_SIZE)Task_Y1Direction_SIZE, /* 任务堆栈大小 */
(OS_MSG_QTY)0, /* 任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息 */
@@ -183,8 +190,12 @@ int main(void)
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
/* 掉电数据读取 */
ModbusLoadSRAM();
CPU_CRITICAL_EXIT() ; ///退出临界区
OSStart(&err);

/* USER CODE END 2 */

/* Infinite loop */
@@ -259,8 +270,9 @@ void Y1Direction(void *p_arg)
/* 脉冲加减速 */
if (ArrFlag == 1)
{
if(TIM2->CNT < AccCount)
if(TIM2->CNT < Options.AccUpTime)
{
if(TIM2->CNT == 0) PulseStart(); /* 开始产生脉冲 */
SetFrequency(0, PulseOutput[PrePulse].Frequency + TIM2->CNT * Acc);
}
else
@@ -270,29 +282,32 @@ void Y1Direction(void *p_arg)
}
}
/* 获取总的脉冲数 */
if(EndFlag || FullFlag)
{
if(EndFlag)
{
AllPulseCNT = GetBase(NowPulse) + PulseOutput[NowPulse].PulseCount;
}
if(FullFlag)
{
AllPulseCNT = MAX_Pulse;
}
}
else
{
AllPulseCNT = TIM2->CNT + GetBase(NowPulse);
}
AllPulseCNT = BaseCNT + TIM2->CNT;
CountSave();
// /* 获取总的脉冲数 */
// if(EndFlag || FullFlag)
// {
// if(EndFlag)
// {
// AllPulseCNT = GetBase(NowPulse) + PulseOutput[NowPulse].PulseCount;
// }
// if(FullFlag)
// {
// AllPulseCNT = MAX_Pulse;
// }
//
// }
// else
// {
// AllPulseCNT = TIM2->CNT + GetBase(NowPulse);
// }
OSTimeDly(100, OS_OPT_TIME_DLY, &err); // 延时 100 个节拍
}
}

/**
* @brief 任务2,脉冲开始
* @brief 任务2,脉冲开始,数据处理
* @return 无
*/
void PulseStartTsk(void *p_arg)
@@ -300,17 +315,22 @@ void PulseStartTsk(void *p_arg)
p_arg = p_arg;
OS_ERR err;
uint8_t EN = 1;
while(1)
{
if(Register_L[3000] == 0x01 && EN == 1)
if(Register_L[0x3000] == 0x01 && EN == 1)
{
PulseStart();
EN = 0;
}
else if(Register_L[3000] == 0x02 && EN == 0)
else if(Register_L[0x3000] == 0x02 && EN == 0)
{
EN = 1;
}
PLSRPluseLoad(); //读取脉冲设置
PLSROptionLoad(); //读取脉冲基础设置
ModbusSaveSRAM();
OSTimeDly(100, OS_OPT_TIME_DLY, &err); // 延时 100 个节拍
}
}
@@ -370,6 +390,9 @@ void DirOutput(void *p_arg)
HAL_GPIO_WritePin(GPIOH, Y15_Pin, GPIO_PIN_RESET);
}
}
OSTimeDly(100, OS_OPT_TIME_DLY, &err); // 延时 100 个节拍
}
}
@@ -472,11 +495,10 @@ void HAL_PWR_PVDCallback(void)
// 检查电压是否低于阈值
if (__HAL_PWR_GET_FLAG(PWR_FLAG_PVDO))
{
HAL_GPIO_TogglePin(GPIOH, Y12_Pin);
/* 掉电处理内容 */
PLSRSramSave();
ModbusSaveSRAM();
}

OSIntExit(); /* 退出中断 */
}

@@ -490,7 +512,7 @@ void PVD_Init(void)
HAL_PWR_EnablePVD(); /* 使能PVD */
PvdStruct.PVDLevel = PWR_PVDLEVEL_3; /* PVD阈值3.1V */
PvdStruct.PVDLevel = PWR_PVDLEVEL_5; /* PVD阈值3.1V */
PvdStruct.Mode = PWR_PVD_MODE_IT_RISING; /* 检测掉电 */
HAL_PWR_ConfigPVD(&PvdStruct);


+ 8
- 7
Core/Src/stm32f4xx_it.c Ver fichero

@@ -218,8 +218,9 @@ void TIM2_IRQHandler(void)
/* USER CODE BEGIN TIM2_IRQn 1 */
PulseNum ++; /* 脉冲段数增加 */
BaseCNT += TIM2->ARR;

if(Options.RunMod == 0)
if (Options.RunMod == 0)
{
/* 如果之后还有脉冲 */
if(Options.AllPulse - PulseNum > 0)
@@ -231,16 +232,16 @@ void TIM2_IRQHandler(void)
}
else
{
NowPulse = PulseOutput[NowPulse].NextPulse; /* 进入下一段脉冲 */
NowPulse = PulseOutput[NowPulse].NextPulse - 1; /* 进入下一段脉冲 */
}
/* 准备加减速 */
Acc = GetAcc(PulseOutput[PrePulse].Frequency,
PulseOutput[NowPulse].Frequency, AccCount); /* 计算加速度 */
PulseOutput[NowPulse].Frequency, Options.AccUpTime); /* 计算加速度 */
ArrFlag = 1;
SetNextPulse();/* 设置下一次进入中断的脉冲数 */
PulseStart(); /* 开始产生脉冲 */
}
/* 如果之后没有脉冲 */
else
@@ -250,7 +251,7 @@ void TIM2_IRQHandler(void)
EndFlag = 1;
}
}
else
if(Options.RunMod == 1)
{
if(AllPulseCNT >= MAX_Pulse)
{
@@ -270,12 +271,12 @@ void TIM2_IRQHandler(void)
}
else
{
NowPulse = PulseOutput[NowPulse].NextPulse; /* 进入下一段脉冲 */
NowPulse = PulseOutput[NowPulse].NextPulse - 1; /* 进入下一段脉冲 */
}
/* 准备加减速 */
Acc = GetAcc(PulseOutput[PrePulse].Frequency,
PulseOutput[NowPulse].Frequency, AccCount); /* 计算加速度 */
PulseOutput[NowPulse].Frequency, Options.AccUpTime); /* 计算加速度 */
ArrFlag = 1;
SetNextPulse();/* 设置下一次进入中断的脉冲数 */


+ 635
- 612
EWARM/PLSR.dep
La diferencia del archivo ha sido suprimido porque es demasiado grande
Ver fichero


+ 1319
- 1317
EWARM/PLSR.ewp
La diferencia del archivo ha sido suprimido porque es demasiado grande
Ver fichero


+ 3
- 0
EWARM/PLSR.ewt Ver fichero

@@ -1283,6 +1283,9 @@
</group>
<group>
<name>Hardware</name>
<file>
<name>$PROJ_DIR$\..\Hardware\BitSet.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\Hardware\CRC.c</name>
</file>


+ 80
- 38
EWARM/settings/PLSR.dbgdt
La diferencia del archivo ha sido suprimido porque es demasiado grande
Ver fichero


+ 11
- 4
EWARM/settings/PLSR.dnx Ver fichero

@@ -20,7 +20,7 @@
<LeaveTargetRunning>_ 0</LeaveTargetRunning>
</StLinkDriver>
<DebugChecksum>
<Checksum>1004691111</Checksum>
<Checksum>2315233233</Checksum>
</DebugChecksum>
<Exceptions>
<StopOnUncaught>_ 0</StopOnUncaught>
@@ -60,12 +60,19 @@
<regBase0>TIM2_CNT 10</regBase0>
</Registers>
<struct_types>
<Fmt0>Pulse-Frequency 3 0</Fmt0>
<Fmt1>Pulse-NextPulse 3 0</Fmt1>
<Fmt2>Pulse-PulseCount 3 0</Fmt2>
<Fmt0>Option-AccUpTime 3 0</Fmt0>
<Fmt1>Option-InitSpeed 3 0</Fmt1>
<Fmt2>Pulse-Frequency 3 0</Fmt2>
<Fmt3>Pulse-NextPulse 3 0</Fmt3>
<Fmt4>Pulse-PulseCount 3 0</Fmt4>
</struct_types>
<array_types>
<Fmt0>uint8_t[10000] 4 0</Fmt0>
</array_types>
<watch_formats>
<Fmt0>{W}1:AllPulseCNT 3 0</Fmt0>
<Fmt1>{W}1:c 4 0</Fmt1>
<Fmt2>{W}1:datCount 3 0</Fmt2>
</watch_formats>
<Trace2>
<Enabled>0</Enabled>


+ 18
- 19
EWARM/settings/Project.wsdt
La diferencia del archivo ha sido suprimido porque es demasiado grande
Ver fichero


+ 26
- 0
Hardware/BitSet.c Ver fichero

@@ -0,0 +1,26 @@
#include "Bitset.h"
#include "string.h"

void Set8_16(uint16_t *Dat , uint8_t *BufferH, uint8_t *BufferL)
{
uint16_t temp_dat;
uint8_t temp_BufferH, temp_BufferL;
temp_BufferH = *BufferH;
temp_BufferL = *BufferL;
temp_dat = (temp_BufferH << 8)|temp_BufferL;
memcpy(Dat, &temp_dat, 2);
}

void Set16_32(uint32_t *Dat , uint16_t *BufferH, uint16_t *BufferL)
{
uint32_t temp_dat;
uint16_t temp_BufferH, temp_BufferL;
temp_BufferH = *BufferH;
temp_BufferL = *BufferL;
temp_dat = (temp_BufferH << 16)|temp_BufferL;
memcpy(Dat, &temp_dat, 4);
}

+ 9
- 0
Hardware/BitSet.h Ver fichero

@@ -0,0 +1,9 @@
#ifndef __BITSET_H__
#define __BITSET_H__
#include "stdint.h"

void Set8_16(uint16_t *Dat , uint8_t *BufferH, uint8_t *BufferL);
void Set16_32(uint32_t *Dat , uint16_t *BufferH, uint16_t *BufferL);


#endif

+ 54
- 26
Hardware/PLSR.c Ver fichero

@@ -4,6 +4,7 @@
#include "sram.h"
#include <string.h>
#include "modbus.h"
#include "bitset.h"

Pulse PulseOutput[10]; // 十段脉冲的配置
Option Options;
@@ -195,45 +196,72 @@ uint32_t GetBase(uint8_t NowPulseNUM)
return temp;
}

/**
* @brief 数据掉电保存
* @return 无
*/
void PLSRSramSave(void)
{
uint32_t temp[80] = {0}; //一共4 * 80 = 320

Write_Backup_SRAM(temp, 80);
}

/**
* @brief 数据上电读取
* @return 无
*/
void PLSRSramRead(void)
{
uint32_t temp[80] = {0};
Read_Backup_SRAM(temp, 80);

}

/**
* @brief 从寄存器读取设置参数
* @return 无
*/
void PLSROptionLoad(void)
{
/* 数据转换 */
uint32_t InitSpeed;
uint16_t tempH, tempL;
Set8_16(&tempH, &Register_H[0x1009], &Register_L[0x1009]);
Set8_16(&tempL, &Register_H[0x100A], &Register_L[0x100A]);
Set16_32(&InitSpeed, &tempH, &tempL);
/* 数据读取 */
Options.SentPost = Register_L[0x1000];
Options.DirPost = Register_L[0x1001];
Options.EXT = Register_L[0x1002];
Options.DirDelay = Register_L[0x1003]; //可能更大。
Options.DirDelay = Register_L[0x1003]; //可能更大。
Options.Dir = Register_L[0x1004];
Options.AccMod = Register_L[0x1005];
Options.RunMod = Register_L[0x1006];
Options.AllPulse = Register_L[0x1007];
Options.StartPulse = Register_L[0x1008];
Options.InitSpeed = Register_L[0x1009]; //需要修改。
Options.InitSpeed = InitSpeed;
Options.AccUpTime = Register_L[0x100B];
Options.AddDownTime = Register_L[0x100C];
Options.AccDownTime = Register_L[0x100C];
}

void PLSRPluseLoad(void)
{
uint32_t temp_Frequency, temp_PulseCount;
uint16_t FrequencyDatH, FrequencyDatL, PulseCountDatH, PulseCountDatL;
for (int i = 0; i < 10; i++)
{
Set8_16(&FrequencyDatH, &Register_H[0x1100 + 0x10 * i]
, &Register_L[0x1100 + 0x10 * i]);
Set8_16(&FrequencyDatL, &Register_H[0x1101 + 0x10 * i]
, &Register_L[0x1101 + 0x10 * i]);
Set16_32(&temp_Frequency, &FrequencyDatL, &FrequencyDatH);
Set8_16(&PulseCountDatH, &Register_H[0x1102 + 0x10 * i]
, &Register_L[0x1102 + 0x10 * i]);
Set8_16(&PulseCountDatL, &Register_H[0x1103 + 0x10 * i]
, &Register_L[0x1103 + 0x10 * i]);
Set16_32(&temp_PulseCount, &PulseCountDatL, &PulseCountDatH);
PulseOutput[i].Frequency = temp_Frequency;
PulseOutput[i].PulseCount = temp_PulseCount;
PulseOutput[i].EXT = Register_L[0x1104 + 0x10 * i];
PulseOutput[i].NextPulse = Register_L[0x1105 + 0x10 * i];
}
}

void CountSave(void)
{
int32_t temp_Count = 0;
uint16_t DatH, DatL;
memcpy(&temp_Count, &AllPulseCNT, 4);
DatH = temp_Count / 0xffff;
DatL = temp_Count % 0xffff;
Register_H[0x2001] = DatH / 0xff;
Register_L[0x2001] = DatH % 0xff;
Register_H[0x2000] = DatL / 0xff;
Register_L[0x2000] = DatL % 0xff;
}

+ 5
- 5
Hardware/PLSR.h Ver fichero

@@ -25,8 +25,8 @@ typedef struct
uint8_t AllPulse; ///<<脉冲总段数
uint8_t StartPulse; ///<<起始执行段数
uint32_t InitSpeed; ///<<脉冲默认速度
uint8_t AddUpTime; ///<<脉冲默认速度加速时间
uint8_t AddDownTime; ///<<脉冲默认速度减速时间
uint8_t AccUpTime; ///<<脉冲默认速度加速时间
uint8_t AccDownTime; ///<<脉冲默认速度减速时间
} Option;

/* 变量声明 */
@@ -51,11 +51,11 @@ float GetAcc(int32_t Start, int32_t End, int32_t AccCount);
void AddPulse(uint8_t Pulse, uint32_t Ferquency, int32_t Count, int8_t NextPulse);
void PulseInit(uint8_t Pulse, uint32_t Ferquency, int32_t Count, int8_t NextPulse);
void SetNextPulse(void);
void PLSROptionLoad(void);
void PLSRPluseLoad(void);
void CountSave(void);

uint32_t GetBase(uint8_t NowPulseNUM);

//掉电保持
void PLSRSramSave(void);
void PLSRSramRead(void);

#endif

+ 45
- 15
Hardware/modbus.c Ver fichero

@@ -2,8 +2,8 @@
#include "PLSR.h"

uint8_t Coil[1250]; ///<存放线圈的数组
uint8_t Register_H[10000]; ///<寄存器的高字节
uint8_t Register_L[10000]; ///<寄存器的低字节
uint8_t Register_H[16384]; ///<寄存器的高字节
uint8_t Register_L[16384]; ///<寄存器的低字节
uint8_t EXRegister_H[10000]; ///<0x10000开始寄存器的高字节
uint8_t EXRegister_L[10000]; ///<0x10000开始寄存器的低字节

@@ -92,6 +92,8 @@ void ProcessModbusFrame(uint8_t buffer[], uint16_t longth)
;break;
case WRITE_MUL_EXREGISTER_CODE: WriteEXRegisterProcess(buffer, longth) /* 写0x10000处的寄存器 31*/
;break;
case WRITE_ONLY_REGISTER: WriteOnlyRegister(buffer, longth)
;break;
default :ErrorBack(buffer, longth); /* 无效指令码 */
;break;
@@ -576,13 +578,41 @@ void WriteCoilProcess(uint8_t buffer[], uint16_t longth)
/* 如果不是广播,发送返回消息 */
if(buffer[0] == SLAVES_ADDRES)
{
HAL_UART_Transmit_DMA(&huart1, buffer, longth);
memcpy(SentPocket, buffer, longth);
HAL_UART_Transmit_DMA(&huart1, SentPocket, longth);
}
}

}

/**
* @brief 0x06指令码的执行,写入单寄存器
* @param[in] buffer[] 预处理的数据
* @param[in] longth 数据的长度
* @return 无
*/
void WriteOnlyRegister(uint8_t buffer[], uint16_t longth)
{
uint16_t startPoint;
startPoint = (buffer[2] << 8 )| buffer[3]; /* 将8位数据组装位16位 */
if ((buffer[0] == SLAVES_ADDRES || buffer[0] == 0x00))/* 如果是与本设备通信 */
{
Register_H[startPoint] = buffer[4];
Register_L[startPoint] = buffer[5];
/* 如果不是广播,发送返回消息 */
if(buffer[0] == SLAVES_ADDRES)
{
memcpy(SentPocket, buffer, longth);
HAL_UART_Transmit_DMA(&huart1, SentPocket, longth);
}
}
}

/**
* @brief 指令码错误的返回报文
* @param[in] buffer[] 预处理的数据
@@ -668,13 +698,13 @@ void GetHistory(uint8_t buffer[], uint16_t longth)
*/
void ModbusLoadSRAM(void)
{
uint32_t temp[5];
Read_Backup_SRAM(temp,5);
memcpy(SramData, temp, 20);
for(int i = 0; i < 10; i++)
uint32_t temp[256] = {0};
Read_Backup_SRAM(temp,256);
memcpy(SramData, temp, 1024);
for(int i = 0; i < 512; i++)
{
Register_H[i] = SramData[i * 2];
Register_L[i] = SramData[i * 2 + 1];
Register_H[i + 4096] = SramData[i * 2];
Register_L[i + 4096] = SramData[i * 2 + 1];
}
}

@@ -684,12 +714,12 @@ void ModbusLoadSRAM(void)
*/
void ModbusSaveSRAM(void)
{
uint32_t temp[5];
for (int i = 0; i < 10; i++)
uint32_t temp[256] = {0};
for (int i = 0; i < 512; i++)
{
SramData[i * 2] = Register_H[i];
SramData[i * 2 + 1] = Register_L[i];
SramData[i * 2] = Register_H[i + 4096];
SramData[i * 2 + 1] = Register_L[i + 4096];
}
memcpy(temp, SramData, 20);
Write_Backup_SRAM(temp, 5);
memcpy(temp, SramData, 1024);
Write_Backup_SRAM(temp, 256);
}

+ 4
- 2
Hardware/modbus.h Ver fichero

@@ -19,6 +19,7 @@
#define WRITE_MUL_EXREGISTER_CODE 0x31
#define GET_HISTORY_CODE 0x55
#define READ_ODD_REGUSTER_CODE 0x33
#define WRITE_ONLY_REGISTER 0x06

#define SLAVES_ADDRES 0x01

@@ -34,6 +35,7 @@ void WriteCoilProcess(uint8_t buffer[], uint16_t longth);
void ReadOddRegisterProcess(uint8_t buffer[], uint16_t longth);
void ReadEXRegisterProcess(uint8_t buffer[], uint16_t longth);
void WriteEXRegisterProcess(uint8_t buffer[], uint16_t longth);
void WriteOnlyRegister(uint8_t buffer[], uint16_t longth);

void SaveHistory(uint8_t buffer[], uint16_t longth);
void LoadHistory(void);
@@ -48,7 +50,7 @@ extern uint8_t HistoryLocation; /*
extern uint8_t Flash_data[20]; /*存入flash的数据*/
extern uint8_t SaveFlag;

extern uint8_t Register_H[10000]; ///<寄存器的高字节
extern uint8_t Register_L[10000]; ///<寄存器的低字节
extern uint8_t Register_H[16384]; ///<寄存器的高字节
extern uint8_t Register_L[16384]; ///<寄存器的低字节

#endif

+ 1
- 1
Hardware/sram.c Ver fichero

@@ -1,7 +1,7 @@
#include "sram.h"


uint8_t SramData[20];
uint8_t SramData[1024];

// 写入数据到备份SRAM
void Write_Backup_SRAM(uint32_t* data, uint32_t size)


+ 1
- 1
Hardware/sram.h Ver fichero

@@ -6,7 +6,7 @@
#define BKP_SRAM_BASE 0x40024000 // F4系列备份SRAM基地址
#define DATA_SIZE 1024 // 要读写的数据量

extern uint8_t SramData[20];
extern uint8_t SramData[1024];

void Write_Backup_SRAM(uint32_t* data, uint32_t size);
void Read_Backup_SRAM(uint32_t* data, uint32_t size) ;


+ 58
- 4
Words/流程图.md Ver fichero

@@ -4,10 +4,12 @@

```mermaid
flowchart
A[开始] --> B(脉冲完成)
B --> C(中断)
C -->D(脉冲计数)
D --> E[结束]
A[开始] --> B(根据脉冲段的要求设置对应的ARR)
B -->|达到要求| C(进入中断)
C -->D{是否有下一段脉冲}
D --> |无下一段脉冲|E[结束]
D --> |有下一段脉冲|F(设置ARR为下一段脉冲的脉冲数)
F --> E[结束]
```

```mermaid
@@ -47,3 +49,55 @@ C --> E[结束]
D --> E[结束]
```

## PLSR多段脉冲输出功能实现流程图

```mermaid
flowchart
A[开始] --> B(根据频率设置对应的PSC和ARR)
B --> C(根据当前运行的脉冲设置计数定时器的ARR)
C -->|脉冲段结束| D{检查是否存在下一段}
D -->|有下一段脉冲| E(进行脉冲替换和脉冲加减速)
D -->|没有下一段脉冲|F(停止脉冲发送定时器)
E --> G[结束]
F --> G[结束]
```

## 掉电保存流程图

```mermaid
flowchart
A[开始] --> B(开始并使能Sram区域)
B --> C(创建掉电保存任务)
C --> D(每个一段时间保存对应的数据)
D --> E[结束]
```

```mermaid
flowchart
A[开始] --> B(从Sram区域读取保存的数据)
B --> C(将读取到的数据进行解析并存入结构体)
C --> D[结束]
```

## 系统结构图

```mermaid
flowchart
A[主控] --> B(脉冲计数)
A[主控] --> C(脉冲的加减速)
A[主控] --> D(脉冲的方向)
A[主控] --> E(运动模式切换)
A[主控] --> F(多段脉冲输出)
A[主控] --> G(掉电保存)
```

## 与上位机通信流程图

```mermaid
flowchart
A[开始] -->B(收到数据)
B --> C(解析并处理数据)
C --> D(根据数据进行相关处理)
D --> E[结束]
```


BIN
Words/设计方案书 .doc Ver fichero


BIN
Words/需求规格书.doc Ver fichero


Cargando…
Cancelar
Guardar