@@ -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; | |||
@@ -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); | |||
@@ -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();/* 设置下一次进入中断的脉冲数 */ | |||
@@ -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> | |||
@@ -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> | |||
@@ -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); | |||
} |
@@ -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 |
@@ -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; | |||
} |
@@ -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 |
@@ -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); | |||
} |
@@ -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,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) | |||
@@ -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) ; | |||
@@ -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[结束] | |||
``` | |||