写STM32代码时遇到的问题
PWM** PWM::initTim(unsigned int tim,unsigned int psc,unsigned int arr,const char* choice){
TIM_HandleTypeDef *htim = new TIM_HandleTypeDef;
unsigned int channel_num=0;
switch(tim){
case 1:{__HAL_RCC_TIM1_CLK_ENABLE();break;}
case 2:{__HAL_RCC_TIM2_CLK_ENABLE();break;}
case 3:{__HAL_RCC_TIM3_CLK_ENABLE();break;}
default:{__HAL_RCC_TIM1_CLK_ENABLE();break;}
}
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
htim->Instance = TIMS[tim-1];
htim->Init.Prescaler = psc;
htim->Init.CounterMode = TIM_COUNTERMODE_UP;
htim->Init.Period = arr;
htim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim->Init.RepetitionCounter = 0;
htim->Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_PWM_Init(htim)!= HAL_OK)
Error_Handler();
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(htim, &sMasterConfig) != HAL_OK)
Error_Handler();
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = arr+1;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
for(int i=0;i<4;i++)
if(choice[i]=='1'){
if(HAL_TIM_PWM_ConfigChannel(htim, &sConfigOC, CHANNELS[i]) != HAL_OK)
Error_Handler();
channel_num++;
}
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = 0;
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
if (HAL_TIMEx_ConfigBreakDeadTime(htim, &sBreakDeadTimeConfig) != HAL_OK)
Error_Handler();
GPIO_Init(tim,choice);
PWM** pwm_arr = new PWM *[channel_num];
int p=0;
for(int i=0;i<4;i++)
if(choice[i]=='1'){
pwm_arr[p++]= new PWM(htim,CHANNELS[i]);
}
return pwm_arr;
}
经过尝试发现问题出现在以下代码中,但不知道原因
PWM** pwm_arr = new PWM *[channel_num];
int p=0;
for(int i=0;i<4;i++)
if(choice[i]=='1'){
pwm_arr[p++]= new PWM(htim,CHANNELS[i]);
}
return pwm_arr;
该代码的作用在于用类似于PWM** motor= PWM::initTim(2,71,999,"1111");的形式获取一个可供操纵的motor数组,
其中参数1代表TIM2,参数2代表psc=71,参数3代表arr=999,参数4代表四个通道都获取。
已经验证单个定时器没有问题
我理想的情况是无论开启多少个定时器都能使用,而现实是
PWM** motor= PWM::initTim(2,71,999,"1111");
PWM** motor= PWM::initTim(3,71,999,"1111");
此时两个定时器都没有反应了
我想知道原因与修改办法