| @@ -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[结束] | |||
| ``` | |||