@@ -55,7 +55,6 @@ void SVC_Handler(void); | |||||
void DebugMon_Handler(void); | void DebugMon_Handler(void); | ||||
void PendSV_Handler(void); | void PendSV_Handler(void); | ||||
void SysTick_Handler(void); | void SysTick_Handler(void); | ||||
void TIM1_UP_TIM10_IRQHandler(void); | |||||
void TIM2_IRQHandler(void); | void TIM2_IRQHandler(void); | ||||
void USART1_IRQHandler(void); | void USART1_IRQHandler(void); | ||||
void DMA2_Stream2_IRQHandler(void); | void DMA2_Stream2_IRQHandler(void); | ||||
@@ -39,6 +39,7 @@ uint8_t ArrFlag = 0; /* | |||||
float Acc; /* 加速度 */ | float Acc; /* 加速度 */ | ||||
int32_t AllPulseCNT = 0; | int32_t AllPulseCNT = 0; | ||||
int32_t BaseCNT = 0; | int32_t BaseCNT = 0; | ||||
int32_t CNT_Only[10] = {0}; | |||||
uint8_t AccITCount = 0; | uint8_t AccITCount = 0; | ||||
@@ -74,29 +75,34 @@ void PVD_Init(void); | |||||
/* USER CODE BEGIN 0 */ | /* USER CODE BEGIN 0 */ | ||||
/* 任务优先级 */ | /* 任务优先级 */ | ||||
#define TASK_Y1Direction 4 | |||||
#define TASK_PulseStart 3 | |||||
#define TASK_DirOutput 4 | |||||
#define TASK_Y1Direction 6 | |||||
#define TASK_PulseStart 5 | |||||
#define TASK_DirOutput 6 | |||||
#define TASK_PulseGetCount 6 | |||||
/* 任务堆栈大小 */ | /* 任务堆栈大小 */ | ||||
#define Task_Y1Direction_SIZE 256 | #define Task_Y1Direction_SIZE 256 | ||||
#define Task_PulseStart_SIZE 512 | #define Task_PulseStart_SIZE 512 | ||||
#define Task_DirOutput_SIZE 256 | #define Task_DirOutput_SIZE 256 | ||||
#define Task_PulseGetCount_SIZE 256 | |||||
/* 任务控制块 */ | /* 任务控制块 */ | ||||
OS_TCB Y1Direction_Tsk; | OS_TCB Y1Direction_Tsk; | ||||
OS_TCB PulseStart_Tsk; | OS_TCB PulseStart_Tsk; | ||||
OS_TCB DirOutput_Tsk; | OS_TCB DirOutput_Tsk; | ||||
OS_TCB PulseGetCount_Tsk; | |||||
/* 任务栈 */ | /* 任务栈 */ | ||||
CPU_STK Task_Y1Direction_STK[Task_Y1Direction_SIZE]; | CPU_STK Task_Y1Direction_STK[Task_Y1Direction_SIZE]; | ||||
CPU_STK Task_PulseStart_STK[Task_PulseStart_SIZE]; | CPU_STK Task_PulseStart_STK[Task_PulseStart_SIZE]; | ||||
CPU_STK Task_DirOutput_STK[Task_DirOutput_SIZE]; | CPU_STK Task_DirOutput_STK[Task_DirOutput_SIZE]; | ||||
CPU_STK Task_PulseGetCount_STK[Task_PulseGetCount_SIZE]; | |||||
/* 任务函数 */ | /* 任务函数 */ | ||||
void Y1Direction(void *p_arg); | void Y1Direction(void *p_arg); | ||||
void PulseStartTsk(void *p_arg); | void PulseStartTsk(void *p_arg); | ||||
void DirOutput(void *p_arg); | void DirOutput(void *p_arg); | ||||
void PulseGetCount(void *p_arg); | |||||
/* USER CODE END 0 */ | /* USER CODE END 0 */ | ||||
@@ -194,7 +200,21 @@ int main(void) | |||||
(OS_TICK )0, | (OS_TICK )0, | ||||
(void * )0, | (void * )0, | ||||
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, | (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, | ||||
(OS_ERR * )&err); | |||||
(OS_ERR * )&err); | |||||
/* 任务4 */ | |||||
OSTaskCreate((OS_TCB * )&PulseGetCount_Tsk, | |||||
(CPU_CHAR* )"PulseGetCount_Tsk", | |||||
(OS_TASK_PTR)PulseGetCount, | |||||
(void * )0, | |||||
(OS_PRIO )TASK_PulseGetCount, | |||||
(CPU_STK * )&Task_PulseGetCount_STK[0], | |||||
(CPU_STK_SIZE)Task_PulseGetCount_SIZE/10, | |||||
(CPU_STK_SIZE)Task_PulseGetCount_SIZE, | |||||
(OS_MSG_QTY)0, | |||||
(OS_TICK )0, | |||||
(void * )0, | |||||
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, | |||||
(OS_ERR * )&err); | |||||
/* 掉电数据读取 */ | /* 掉电数据读取 */ | ||||
ModbusLoadSRAM(); | ModbusLoadSRAM(); | ||||
@@ -252,7 +272,7 @@ void SystemClock_Config(void) | |||||
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; | RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; | ||||
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; | RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; | ||||
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; | RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; | ||||
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; | |||||
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; | |||||
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) | if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) | ||||
{ | { | ||||
@@ -263,7 +283,7 @@ void SystemClock_Config(void) | |||||
/* USER CODE BEGIN 4 */ | /* USER CODE BEGIN 4 */ | ||||
/** | /** | ||||
* @brief 任务1,获取总脉冲数, 脉冲加减速 | |||||
* @brief 任务1, 脉冲加减速 | |||||
* @return 无 | * @return 无 | ||||
*/ | */ | ||||
void Y1Direction(void *p_arg) | void Y1Direction(void *p_arg) | ||||
@@ -308,10 +328,6 @@ void Y1Direction(void *p_arg) | |||||
} | } | ||||
} | } | ||||
} | } | ||||
AllPulseCNT = BaseCNT + TIM2->CNT; | |||||
CountSave(); | |||||
OSTimeDly(100, OS_OPT_TIME_DLY, &err); // 延时 100 个节拍 | OSTimeDly(100, OS_OPT_TIME_DLY, &err); // 延时 100 个节拍 | ||||
} | } | ||||
} | } | ||||
@@ -333,7 +349,7 @@ void PulseStartTsk(void *p_arg) | |||||
PLSROptionLoad(); //读取脉冲基础设置 | PLSROptionLoad(); //读取脉冲基础设置 | ||||
if(Register_L[0x3000] == 0x01 && EN == 1) | if(Register_L[0x3000] == 0x01 && EN == 1) | ||||
{ | |||||
{ | |||||
SetFrequency(Options.SentPost, PulseOutput[NowPulse].Frequency); | SetFrequency(Options.SentPost, PulseOutput[NowPulse].Frequency); | ||||
PulseStart(); | PulseStart(); | ||||
EN = 0; | EN = 0; | ||||
@@ -394,6 +410,7 @@ void DirOutput(void *p_arg) | |||||
while(1) | while(1) | ||||
{ | { | ||||
/* 根据当前的方向和输出的方向的端口进行输出的配置 */ | |||||
if (Options.DirPost == 0) | if (Options.DirPost == 0) | ||||
{ | { | ||||
if (Options.Dir == 1) | if (Options.Dir == 1) | ||||
@@ -438,13 +455,59 @@ void DirOutput(void *p_arg) | |||||
HAL_GPIO_WritePin(GPIOH, Y15_Pin, GPIO_PIN_RESET); | HAL_GPIO_WritePin(GPIOH, Y15_Pin, GPIO_PIN_RESET); | ||||
} | } | ||||
} | } | ||||
/* 预留时间给其他任务 */ | |||||
OSTimeDly(100, OS_OPT_TIME_DLY, &err); // 延时 100 个节拍 | OSTimeDly(100, OS_OPT_TIME_DLY, &err); // 延时 100 个节拍 | ||||
} | } | ||||
} | } | ||||
/** | |||||
* @brief 任务4,脉冲计数 | |||||
* @return 无 | |||||
*/ | |||||
void PulseGetCount(void *p_arg) | |||||
{ | |||||
p_arg = p_arg; | |||||
OS_ERR err; | |||||
while(1) | |||||
{ | |||||
/* 根据当前脉冲的方向设置输出的方向 */ | |||||
if(PulseOutput[NowPulse].PulseCount < 0) | |||||
{ | |||||
Options.Dir = 1; | |||||
} | |||||
else | |||||
{ | |||||
Options.Dir = 0; | |||||
} | |||||
// if(Options.Dir == 0) | |||||
// { | |||||
// AllPulseCNT = BaseCNT + TIM2->CNT; | |||||
// } | |||||
// else if(Options.Dir == 1) | |||||
// { | |||||
// AllPulseCNT = BaseCNT - TIM2->CNT; | |||||
// } | |||||
if(TIM2->CNT != 0) | |||||
{ | |||||
if (Options.Dir == 1) | |||||
{ | |||||
CNT_Only[NowPulse] = 0 - (TIM2->CNT); | |||||
} | |||||
else if (Options.Dir == 0) | |||||
{ | |||||
CNT_Only[NowPulse] = TIM2->CNT; | |||||
} | |||||
} | |||||
AllPulseCNT = CNT_Only[0] + CNT_Only[1] + CNT_Only[2] + CNT_Only[3] + | |||||
CNT_Only[4] + CNT_Only[5] + CNT_Only[6] + CNT_Only[7] + | |||||
CNT_Only[8] + CNT_Only[9]; | |||||
CountSave(); | |||||
OSTimeDly(10, OS_OPT_TIME_DLY, &err); | |||||
} | |||||
} | |||||
/* USER CODE END 4 */ | /* USER CODE END 4 */ | ||||
@@ -61,7 +61,6 @@ | |||||
/* External variables --------------------------------------------------------*/ | /* External variables --------------------------------------------------------*/ | ||||
extern TIM_HandleTypeDef htim2; | extern TIM_HandleTypeDef htim2; | ||||
extern TIM_HandleTypeDef htim10; | |||||
extern DMA_HandleTypeDef hdma_usart1_rx; | extern DMA_HandleTypeDef hdma_usart1_rx; | ||||
extern DMA_HandleTypeDef hdma_usart1_tx; | extern DMA_HandleTypeDef hdma_usart1_tx; | ||||
extern UART_HandleTypeDef huart1; | extern UART_HandleTypeDef huart1; | ||||
@@ -207,20 +206,6 @@ void SysTick_Handler(void) | |||||
/* please refer to the startup file (startup_stm32f4xx.s). */ | /* please refer to the startup file (startup_stm32f4xx.s). */ | ||||
/******************************************************************************/ | /******************************************************************************/ | ||||
/** | |||||
* @brief This function handles TIM1 update interrupt and TIM10 global interrupt. | |||||
*/ | |||||
void TIM1_UP_TIM10_IRQHandler(void) | |||||
{ | |||||
/* USER CODE BEGIN TIM1_UP_TIM10_IRQn 0 */ | |||||
/* USER CODE END TIM1_UP_TIM10_IRQn 0 */ | |||||
HAL_TIM_IRQHandler(&htim10); | |||||
/* USER CODE BEGIN TIM1_UP_TIM10_IRQn 1 */ | |||||
/* USER CODE END TIM1_UP_TIM10_IRQn 1 */ | |||||
} | |||||
/** | /** | ||||
* @brief This function handles TIM2 global interrupt. | * @brief This function handles TIM2 global interrupt. | ||||
*/ | */ | ||||
@@ -234,7 +219,7 @@ void TIM2_IRQHandler(void) | |||||
HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */ | HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */ | ||||
PulseNum ++; /* 脉冲段数增加 */ | PulseNum ++; /* 脉冲段数增加 */ | ||||
BaseCNT += TIM2->ARR; | |||||
if (Options.RunMod == 0) | if (Options.RunMod == 0) | ||||
{ | { | ||||
@@ -250,7 +235,8 @@ void TIM2_IRQHandler(void) | |||||
{ | { | ||||
NowPulse = PulseOutput[NowPulse].NextPulse - 1; /* 进入下一段脉冲 */ | NowPulse = PulseOutput[NowPulse].NextPulse - 1; /* 进入下一段脉冲 */ | ||||
} | } | ||||
BaseCNT += PulseOutput[PrePulse].PulseCount; | |||||
/* 准备加减速 */ | /* 准备加减速 */ | ||||
if(PulseOutput[PrePulse].Frequency <= PulseOutput[NowPulse].Frequency) | if(PulseOutput[PrePulse].Frequency <= PulseOutput[NowPulse].Frequency) | ||||
{ | { | ||||
@@ -271,6 +257,7 @@ void TIM2_IRQHandler(void) | |||||
{ | { | ||||
PulseCount = 0; | PulseCount = 0; | ||||
ArrFlag = 0; | ArrFlag = 0; | ||||
BaseCNT += PulseOutput[NowPulse].PulseCount; | |||||
HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */ | HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */ | ||||
} | } | ||||
} | } | ||||
@@ -280,10 +280,6 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) | |||||
/* USER CODE END TIM10_MspInit 0 */ | /* USER CODE END TIM10_MspInit 0 */ | ||||
/* TIM10 clock enable */ | /* TIM10 clock enable */ | ||||
__HAL_RCC_TIM10_CLK_ENABLE(); | __HAL_RCC_TIM10_CLK_ENABLE(); | ||||
/* TIM10 interrupt Init */ | |||||
HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 0, 0); | |||||
HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn); | |||||
/* USER CODE BEGIN TIM10_MspInit 1 */ | /* USER CODE BEGIN TIM10_MspInit 1 */ | ||||
/* USER CODE END TIM10_MspInit 1 */ | /* USER CODE END TIM10_MspInit 1 */ | ||||
@@ -441,9 +437,6 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) | |||||
/* USER CODE END TIM10_MspDeInit 0 */ | /* USER CODE END TIM10_MspDeInit 0 */ | ||||
/* Peripheral clock disable */ | /* Peripheral clock disable */ | ||||
__HAL_RCC_TIM10_CLK_DISABLE(); | __HAL_RCC_TIM10_CLK_DISABLE(); | ||||
/* TIM10 interrupt Deinit */ | |||||
HAL_NVIC_DisableIRQ(TIM1_UP_TIM10_IRQn); | |||||
/* USER CODE BEGIN TIM10_MspDeInit 1 */ | /* USER CODE BEGIN TIM10_MspDeInit 1 */ | ||||
/* USER CODE END TIM10_MspDeInit 1 */ | /* USER CODE END TIM10_MspDeInit 1 */ | ||||
@@ -63,7 +63,7 @@ void MX_USART1_UART_Init(void) | |||||
/* USER CODE END USART1_Init 1 */ | /* USER CODE END USART1_Init 1 */ | ||||
huart1.Instance = USART1; | huart1.Instance = USART1; | ||||
huart1.Init.BaudRate = 19200; | |||||
huart1.Init.BaudRate = 9600; | |||||
huart1.Init.WordLength = UART_WORDLENGTH_9B; | huart1.Init.WordLength = UART_WORDLENGTH_9B; | ||||
huart1.Init.StopBits = UART_STOPBITS_1; | huart1.Init.StopBits = UART_STOPBITS_1; | ||||
huart1.Init.Parity = UART_PARITY_ODD; | huart1.Init.Parity = UART_PARITY_ODD; | ||||
@@ -20,15 +20,15 @@ | |||||
<LeaveTargetRunning>_ 0</LeaveTargetRunning> | <LeaveTargetRunning>_ 0</LeaveTargetRunning> | ||||
</StLinkDriver> | </StLinkDriver> | ||||
<DebugChecksum> | <DebugChecksum> | ||||
<Checksum>3456179106</Checksum> | |||||
<Checksum>2527891484</Checksum> | |||||
</DebugChecksum> | </DebugChecksum> | ||||
<Exceptions> | <Exceptions> | ||||
<StopOnUncaught>_ 0</StopOnUncaught> | <StopOnUncaught>_ 0</StopOnUncaught> | ||||
<StopOnThrow>_ 0</StopOnThrow> | <StopOnThrow>_ 0</StopOnThrow> | ||||
</Exceptions> | </Exceptions> | ||||
<Disassembly> | <Disassembly> | ||||
<MixedMode>1</MixedMode> | |||||
<InstrCount>0</InstrCount> | <InstrCount>0</InstrCount> | ||||
<MixedMode>1</MixedMode> | |||||
</Disassembly> | </Disassembly> | ||||
<CodeCoverage> | <CodeCoverage> | ||||
<Enabled>0</Enabled> | <Enabled>0</Enabled> | ||||
@@ -74,8 +74,9 @@ | |||||
<watch_formats> | <watch_formats> | ||||
<Fmt0>{W}1:AccITCount 3 0</Fmt0> | <Fmt0>{W}1:AccITCount 3 0</Fmt0> | ||||
<Fmt1>{W}1:AllPulseCNT 3 0</Fmt1> | <Fmt1>{W}1:AllPulseCNT 3 0</Fmt1> | ||||
<Fmt2>{W}1:c 4 0</Fmt2> | |||||
<Fmt3>{W}1:datCount 3 0</Fmt3> | |||||
<Fmt2>{W}1:DatL 3 0</Fmt2> | |||||
<Fmt3>{W}1:c 4 0</Fmt3> | |||||
<Fmt4>{W}1:datCount 3 0</Fmt4> | |||||
</watch_formats> | </watch_formats> | ||||
<Trace2> | <Trace2> | ||||
<Enabled>0</Enabled> | <Enabled>0</Enabled> | ||||
@@ -30,8 +30,8 @@ int32_t PulseCount = 0; | |||||
*/ | */ | ||||
void SetFrequency(uint8_t SentPost, uint32_t Frequency) | void SetFrequency(uint8_t SentPost, uint32_t Frequency) | ||||
{ | { | ||||
Frequency_Change_PSC_And_ARR(Frequency, &psc, &arr); | |||||
printf("Fre=%d,",Frequency); | |||||
CalculatePSCARR(Frequency, 72000000, 65535, &psc, &arr); | |||||
//printf("Fre=%d,",Frequency); | |||||
switch(SentPost) | switch(SentPost) | ||||
{ | { | ||||
case 0: TIM10->ARR = arr, TIM10->PSC = psc, TIM10->CCR1 = arr / 2; break; | case 0: TIM10->ARR = arr, TIM10->PSC = psc, TIM10->CCR1 = arr / 2; break; | ||||
@@ -80,7 +80,14 @@ void PulseBaseInit(uint8_t StartPulse, uint8_t PulseMod, int32_t MAX_Pulse) | |||||
*/ | */ | ||||
void PulseStart(void) | void PulseStart(void) | ||||
{ | { | ||||
TIM2->ARR = PulseOutput[NowPulse].PulseCount; | |||||
if(PulseOutput[NowPulse].PulseCount >= 0) | |||||
{ | |||||
TIM2->ARR = PulseOutput[NowPulse].PulseCount; | |||||
} | |||||
else | |||||
{ | |||||
TIM2->ARR = - PulseOutput[NowPulse].PulseCount; | |||||
} | |||||
switch(Options.SentPost) | switch(Options.SentPost) | ||||
{ | { | ||||
@@ -178,7 +185,15 @@ void SetNextPulse(void) | |||||
if(Options.RunMod == 0) /* 如果是相对模式 */ | if(Options.RunMod == 0) /* 如果是相对模式 */ | ||||
{ | { | ||||
TIM2->ARR = PulseOutput[NowPulse].PulseCount; | |||||
if(PulseOutput[NowPulse].PulseCount > 0) | |||||
{ | |||||
TIM2->ARR = PulseOutput[NowPulse].PulseCount; | |||||
} | |||||
else | |||||
{ | |||||
TIM2->ARR = - PulseOutput[NowPulse].PulseCount; | |||||
} | |||||
} | } | ||||
else /* 如果是绝对模式 */ | else /* 如果是绝对模式 */ | ||||
{ | { | ||||
@@ -281,8 +296,8 @@ void CountSave(void) | |||||
memcpy(&temp_Count, &AllPulseCNT, 4); | memcpy(&temp_Count, &AllPulseCNT, 4); | ||||
DatH = temp_Count / 0xffff; | |||||
DatL = temp_Count % 0xffff; | |||||
DatH = (temp_Count >> 16); | |||||
DatL = (temp_Count & 0x0000ffff); | |||||
Register_H[0x2001] = (DatH >> 8); | Register_H[0x2001] = (DatH >> 8); | ||||
Register_L[0x2001] = (DatH & 0x00ff); | Register_L[0x2001] = (DatH & 0x00ff); | ||||
Register_H[0x2000] = (DatL >> 8); | Register_H[0x2000] = (DatL >> 8); | ||||
@@ -1,7 +1,7 @@ | |||||
#include "PSCARR.h" | #include "PSCARR.h" | ||||
uint16_t psc; | |||||
uint16_t arr; | |||||
uint16_t psc = 0; | |||||
uint16_t arr = 0; | |||||
const unsigned short ARRPSC[1098][2] = {\ | const unsigned short ARRPSC[1098][2] = {\ | ||||
0x465,0xFA00,0x240,0xF424,0x177,0xFA00,0x120,0xF424,0xE1,0xFA00,0xC0,0xF424,0x161,0x71D2,0x90,0xF424,0x7D,0xFA00,0x78,0xEA60,\ | 0x465,0xFA00,0x240,0xF424,0x177,0xFA00,0x120,0xF424,0xE1,0xFA00,0xC0,0xF424,0x161,0x71D2,0x90,0xF424,0x7D,0xFA00,0x78,0xEA60,\ | ||||
@@ -138,3 +138,57 @@ void Frequency_Change_PSC_And_ARR(uint32_t Frequency, uint16_t* psc, uint16_t* a | |||||
} | } | ||||
} | } | ||||
/** | |||||
* @brief 计算PSC和ARR值以产生指定频率 | |||||
* @param[in] desired_freq 期望的频率(Hz) | |||||
* @param[in] timer_clk 定时器时钟频率(Hz), 通常为72MHz | |||||
* @param[in] max_arr ARR的最大值(通常是16位定时器的65535) | |||||
* @param[out] psc 预分频器值 | |||||
* @param[out] arr 自动重装载值 | |||||
* @return 0-成功, 1-频率太低, 2-频率太高 | |||||
*/ | |||||
uint8_t CalculatePSCARR(uint32_t desired_freq, uint32_t timer_clk, uint16_t max_arr, | |||||
uint16_t *psc, uint16_t *arr) { | |||||
uint32_t psc_candidate, arr_candidate; | |||||
uint32_t clock_div; | |||||
if (desired_freq == 0) { | |||||
return 1; // 频率太低 | |||||
} | |||||
// 计算所需的总分频系数 | |||||
clock_div = timer_clk / desired_freq; | |||||
if (clock_div == 0) { | |||||
return 2; // 频率太高 | |||||
} | |||||
// 初始尝试: 将ARR设为最大值,计算PSC | |||||
psc_candidate = (clock_div - 1) / max_arr; | |||||
arr_candidate = clock_div / (psc_candidate + 1) - 1; | |||||
// 如果PSC太大,则减少PSC并增加ARR | |||||
if (psc_candidate > max_arr) { | |||||
psc_candidate = max_arr; | |||||
arr_candidate = clock_div / (psc_candidate + 1) - 1; | |||||
if (arr_candidate > max_arr) { | |||||
return 2; // 频率太高 | |||||
} | |||||
} | |||||
// 确保结果在有效范围内 | |||||
if (psc_candidate > max_arr || arr_candidate > max_arr) { | |||||
return 2; // 频率太高 | |||||
} | |||||
if (arr_candidate == 0) { | |||||
return 1; // 频率太低 | |||||
} | |||||
*psc = (uint16_t)psc_candidate; | |||||
*arr = (uint16_t)arr_candidate; | |||||
return 0; // 成功 | |||||
} |
@@ -2,6 +2,7 @@ | |||||
#define __PSCARR_H__ | #define __PSCARR_H__ | ||||
#include "stdint.h" | #include "stdint.h" | ||||
#include "math.h" | |||||
extern const unsigned short ARRPSC[1098][2]; | extern const unsigned short ARRPSC[1098][2]; | ||||
@@ -10,5 +11,7 @@ extern uint16_t psc; | |||||
extern uint16_t arr; | extern uint16_t arr; | ||||
void Frequency_Change_PSC_And_ARR(uint32_t Frequency, uint16_t* psc, uint16_t* arr); /* 输出要配置的PSC和ARR */ | void Frequency_Change_PSC_And_ARR(uint32_t Frequency, uint16_t* psc, uint16_t* arr); /* 输出要配置的PSC和ARR */ | ||||
uint8_t CalculatePSCARR(uint32_t desired_freq, uint32_t timer_clk, uint16_t max_arr, | |||||
uint16_t *psc, uint16_t *arr); | |||||
#endif | #endif |
@@ -83,7 +83,6 @@ NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false | |||||
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 | NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 | ||||
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false | NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false | ||||
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false | NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false | ||||
NVIC.TIM1_UP_TIM10_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true | |||||
NVIC.TIM2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true | NVIC.TIM2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true | ||||
NVIC.USART1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true | NVIC.USART1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true | ||||
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false | NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false | ||||
@@ -166,7 +165,8 @@ RCC.AHBFreq_Value=72000000 | |||||
RCC.APB1CLKDivider=RCC_HCLK_DIV2 | RCC.APB1CLKDivider=RCC_HCLK_DIV2 | ||||
RCC.APB1Freq_Value=36000000 | RCC.APB1Freq_Value=36000000 | ||||
RCC.APB1TimFreq_Value=72000000 | RCC.APB1TimFreq_Value=72000000 | ||||
RCC.APB2Freq_Value=72000000 | |||||
RCC.APB2CLKDivider=RCC_HCLK_DIV2 | |||||
RCC.APB2Freq_Value=36000000 | |||||
RCC.APB2TimFreq_Value=72000000 | RCC.APB2TimFreq_Value=72000000 | ||||
RCC.CortexFreq_Value=72000000 | RCC.CortexFreq_Value=72000000 | ||||
RCC.EthernetFreq_Value=72000000 | RCC.EthernetFreq_Value=72000000 | ||||
@@ -176,7 +176,7 @@ RCC.HCLKFreq_Value=72000000 | |||||
RCC.HSE_VALUE=12000000 | RCC.HSE_VALUE=12000000 | ||||
RCC.HSI_VALUE=16000000 | RCC.HSI_VALUE=16000000 | ||||
RCC.I2SClocksFreq_Value=192000000 | RCC.I2SClocksFreq_Value=192000000 | ||||
RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQCLKFreq_Value,PLLSourceVirtual,RCC_RTC_Clock_Source,RCC_RTC_Clock_SourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S | |||||
RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQCLKFreq_Value,PLLSourceVirtual,RCC_RTC_Clock_Source,RCC_RTC_Clock_SourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S | |||||
RCC.LSE_VALUE=32768 | RCC.LSE_VALUE=32768 | ||||
RCC.LSI_VALUE=32000 | RCC.LSI_VALUE=32000 | ||||
RCC.MCO2PinFreq_Value=72000000 | RCC.MCO2PinFreq_Value=72000000 | ||||
@@ -217,7 +217,7 @@ TIM13.Channel=TIM_CHANNEL_1 | |||||
TIM13.IPParameters=Channel | TIM13.IPParameters=Channel | ||||
TIM14.Channel=TIM_CHANNEL_1 | TIM14.Channel=TIM_CHANNEL_1 | ||||
TIM14.IPParameters=Channel | TIM14.IPParameters=Channel | ||||
USART1.BaudRate=19200 | |||||
USART1.BaudRate=9600 | |||||
USART1.IPParameters=VirtualMode,BaudRate,Parity,WordLength | USART1.IPParameters=VirtualMode,BaudRate,Parity,WordLength | ||||
USART1.Parity=PARITY_ODD | USART1.Parity=PARITY_ODD | ||||
USART1.VirtualMode=VM_ASYNC | USART1.VirtualMode=VM_ASYNC | ||||