[mw_shl_code=c,true]void Motor_Gpio_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |
GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; //外部有硬件下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
//外部有硬件下拉 GPIO_Init(GPIOB, &GPIO_InitStructure);
//SW_LR SW_UD??????
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12; //PA4 PA5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
//外部有硬件下拉 GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_1);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_1);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_1);
//GPIO_SetBits(GPIOA,GPIO_Pin_8 |GPIO_Pin_9 |GPIO_Pin_10 |GPIO_Pin_11);
NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void Motor_UD_TIM1_Init(uint8_t direct,uint16_t speed)
{
TIM1->ARR=32*speed/10-1; //?è?¨?????÷×?????×°?? arr=48000000/(psc+1)/(1000000/(8*speed))
TIM1->

SC=120-1; //?¤·????÷??·???
//MOTOR_UD TIM1 Configuration
TIM1->CCMR1|=3<<4; //CH1 ?????±·?×?
TIM1->CCMR1|=3<<12; //CH2 ?????±·?×?
TIM1->CCMR2|=3<<4; //CH3 ?????±·?×?
TIM1->CCMR2|=3<<12; //CH4 ?????±·?×?
TIM1->CCER|=1<<0; //OC1 ????????
TIM1->CCER|=1<<4; //OC2 ????????
TIM1->CCER|=1<<8; //OC3 ????????
TIM1->CCER|=1<<12; //OC4 ????????
TIM1->CR1 |=1<<7; //ARPE????
TIM1->DIER |=0x1F; //????TIM????/±???1 2 3 4????
if(direct==MOTOR_DIR_UP)
{
TIM1->CCR1=MOTOR_UP_BLUE_VALUE;
TIM1->CCR2=MOTOR_UP_BROWN_VALUE;
TIM1->CCR3=MOTOR_UP_YELLOW_VALUE;
TIM1->CCR4=MOTOR_UP_BLACK_VALUE;
printf("\r\r\n MOTOR_DIR_UP \r\r\n");
}
else if(direct==MOTOR_DIR_DOWN)
{
TIM1->CCR1=MOTOR_DOWM_BLUE_VALUE;
TIM1->CCR2=MOTOR_DOWM_BROWN_VALUE;
TIM1->CCR3=MOTOR_DOWM_YELLOW_VALUE;
TIM1->CCR4=MOTOR_DOWM_BLACK_VALUE;
printf("\r\r\n MOTOR_DIR_DOWN \r\r\n");
}
TIM1->CR1 |=0x01; //?????¨?±?÷1
TIM1->BDTR |=1<<15;
printf("\r\r\n Motor_UD_TIM1_Init \r\r\n");
}
void Motor_LR_TIM3_Init(uint8_t direct,uint16_t speed)
{
TIM3->ARR=32*speed/10-1; //?è?¨?????÷×?????×°?? arr=48000000/(psc+1)/(1000000/(8*speed))
TIM3->

SC=120-1;
//MOTOR_LR TIM3 Configuration
TIM3->CCMR1 |=3<<4; //CH1 ?????±·?×?
TIM3->CCMR1 |=3<<12; //CH2 ?????±·?×?
TIM3->CCMR2 |=3<<4; //CH3 ?????±·?×?
TIM3->CCMR2 |=3<<12; //CH4 ?????±·?×?
TIM3->CCER |=1<<0; //OC1 ????????
TIM3->CCER |=1<<4; //OC2 ????????
TIM3->CCER |=1<<8; //OC3 ????????
TIM3->CCER |=1<<12; //OC4 ????????
TIM3->CR1 |=1<<7; //ARPE????
TIM3->DIER |=0x1F; //????TIM????/±???1 2 3 4????
UART_send_byte(0xA);
if(direct==MOTOR_DIR_LEFT)
{
TIM3->CCR1=MOTOR_LEFT_BLUE_VALUE;
TIM3->CCR2=MOTOR_LEFT_BROWN_VALUE;
TIM3->CCR3=MOTOR_LEFT_YELLOW_VALUE;
TIM3->CCR4=MOTOR_LEFT_BLACK_VALUE;
UART_send_byte(0xB);
}
else if(direct==MOTOR_DIR_RIGHT)
{
TIM3->CCR1=MOTOR_RIGHT_BLUE_VALUE;
TIM3->CCR2=MOTOR_RIGHT_BROWN_VALUE;
TIM3->CCR3=MOTOR_RIGHT_YELLOW_VALUE;
TIM3->CCR4=MOTOR_RIGHT_BLACK_VALUE;
}
UART_send_byte(0xE);
TIM3->CR1 |=0x01; //?????¨?±?÷3
UART_send_byte(0xC); //这里不会打印
}
void Motor_LR_Stop(void)
{
TIM3->CR1 &=~(0x01); //??±??¨?±?÷3
}
void Motor_UD_Stop(void)
{
TIM1->CR1 &=~(0x01); //??±??¨?±?÷1
}
void Motor_LR_Start(uint8_t direct,uint16_t speed)
{
motor_dir=direct;
TIM_DeInit(TIM3);
Motor_LR_TIM3_Init(direct,speed);
UART_send_byte(0x0D);
}
void Motor_UD_Start(uint8_t direct,uint16_t speed)
{
motor_dir=direct;
TIM_DeInit(TIM1);
Motor_UD_TIM1_Init(direct,speed);
}
void TIM1_CC_IRQHandler(void)
{
uint16_t UD_capture1;
uint16_t UD_capture2;
uint16_t UD_capture3;
uint16_t UD_capture4;
if(TIM_GetITStatus(TIM1,TIM_IT_CC1)!=RESET)
{
UD_capture1=TIM_GetCapture1(TIM1);
switch(motor_dir)
{
case MOTOR_DIR_UP :
{
if(UD_capture1==MOTOR_UP_BLUE_VALUE)
TIM_SetCompare1(TIM1,MOTOR_UP_BLUE_VALUE+HIGH_DUTY_CYCLE);
else if(UD_capture1==(MOTOR_UP_BLUE_VALUE+HIGH_DUTY_CYCLE))
TIM_SetCompare1(TIM1,MOTOR_UP_BLUE_VALUE);
}break;
case MOTOR_DIR_DOWN :
{
if(UD_capture1==MOTOR_DOWM_BLUE_VALUE)
TIM_SetCompare1(TIM1,MOTOR_DOWM_BLUE_VALUE+HIGH_DUTY_CYCLE);
else if(UD_capture1==(MOTOR_DOWM_BLUE_VALUE+HIGH_DUTY_CYCLE))
TIM_SetCompare1(TIM1,MOTOR_DOWM_BLUE_VALUE);
}break;
}
TIM_ClearITPendingBit(TIM1,TIM_IT_CC1);
}
else if(TIM_GetITStatus(TIM1,TIM_IT_CC2)!=RESET)
{
UD_capture2=TIM_GetCapture2(TIM1);
switch(motor_dir)
{
case MOTOR_DIR_UP :
{
if(UD_capture2==MOTOR_UP_BROWN_VALUE)
TIM_SetCompare2(TIM1,MOTOR_UP_BROWN_VALUE+HIGH_DUTY_CYCLE);
else if(UD_capture2==(MOTOR_UP_BROWN_VALUE+HIGH_DUTY_CYCLE))
TIM_SetCompare2(TIM1,MOTOR_UP_BROWN_VALUE);
}break;
case MOTOR_DIR_DOWN :
{
if(UD_capture2==MOTOR_DOWM_BROWN_VALUE)
TIM_SetCompare2(TIM1,MOTOR_DOWM_BROWN_VALUE+HIGH_DUTY_CYCLE);
else if(UD_capture2==(MOTOR_DOWM_BROWN_VALUE+HIGH_DUTY_CYCLE))
TIM_SetCompare2(TIM1,MOTOR_DOWM_BROWN_VALUE);
}break;
}
TIM_ClearITPendingBit(TIM1,TIM_IT_CC2);
}
else if(TIM_GetITStatus(TIM1,TIM_IT_CC3)!=RESET)
{
UD_capture3=TIM_GetCapture3(TIM1);
switch(motor_dir)
{
case MOTOR_DIR_UP :
{
if(UD_capture3==MOTOR_UP_YELLOW_VALUE)
TIM_SetCompare3(TIM1,MOTOR_UP_YELLOW_VALUE+HIGH_DUTY_CYCLE);
else if(UD_capture3==(MOTOR_UP_YELLOW_VALUE+HIGH_DUTY_CYCLE))
TIM_SetCompare3(TIM1,MOTOR_UP_YELLOW_VALUE);
}break;
case MOTOR_DIR_DOWN :
{
if(UD_capture3==MOTOR_DOWM_YELLOW_VALUE)
TIM_SetCompare3(TIM1,MOTOR_DOWM_YELLOW_VALUE+HIGH_DUTY_CYCLE);
else if(UD_capture3==(MOTOR_DOWM_YELLOW_VALUE+HIGH_DUTY_CYCLE))
TIM_SetCompare3(TIM1,MOTOR_DOWM_YELLOW_VALUE);
}break;
}
TIM_ClearITPendingBit(TIM1,TIM_IT_CC3);
}
else if(TIM_GetITStatus(TIM1,TIM_IT_CC4)!=RESET)
{
UD_capture4=TIM_GetCapture4(TIM1);
switch(motor_dir)
{
case MOTOR_DIR_UP :
{
if(UD_capture4==MOTOR_UP_BLACK_VALUE)
TIM_SetCompare4(TIM1,MOTOR_UP_BLACK_VALUE+HIGH_DUTY_CYCLE-8*BEAT);
else if(UD_capture4==(MOTOR_UP_BLACK_VALUE+HIGH_DUTY_CYCLE-8*BEAT))
TIM_SetCompare4(TIM1,MOTOR_UP_BLACK_VALUE);
}break;
case MOTOR_DIR_DOWN :
{
if(UD_capture4==MOTOR_DOWM_BLACK_VALUE)
TIM_SetCompare4(TIM1,MOTOR_DOWM_BLACK_VALUE+2*BEAT);
else if(UD_capture4==(MOTOR_DOWM_BLACK_VALUE+2*BEAT))
TIM_SetCompare4(TIM1,MOTOR_DOWM_BLACK_VALUE+7*BEAT);
else if(UD_capture4==(MOTOR_DOWM_BLACK_VALUE+7*BEAT))
TIM_SetCompare4(TIM1,MOTOR_DOWM_BLACK_VALUE+2*BEAT);
}break;
}
TIM_ClearITPendingBit(TIM1,TIM_IT_CC4);
}
}
void TIM3_IRQHandler(void)
{
uint16_t LR_capture1;
uint16_t LR_capture2;
uint16_t LR_capture3;
uint16_t LR_capture4;
if(TIM_GetITStatus(TIM3,TIM_IT_CC1)!=RESET)
{
LR_capture1=TIM_GetCapture1(TIM3);
switch(motor_dir)
{
case MOTOR_DIR_LEFT :
{
if(LR_capture1==MOTOR_LEFT_BLUE_VALUE)
TIM_SetCompare1(TIM3,MOTOR_LEFT_BLUE_VALUE+HIGH_DUTY_CYCLE);
else if(LR_capture1==MOTOR_LEFT_BLUE_VALUE+HIGH_DUTY_CYCLE)
TIM_SetCompare1(TIM3,MOTOR_LEFT_BLUE_VALUE);
}break;
case MOTOR_DIR_RIGHT :
{
if(LR_capture1==MOTOR_RIGHT_BLUE_VALUE)
TIM_SetCompare1(TIM3,MOTOR_RIGHT_BLUE_VALUE+HIGH_DUTY_CYCLE);
else if(LR_capture1==MOTOR_RIGHT_BLUE_VALUE+HIGH_DUTY_CYCLE)
TIM_SetCompare1(TIM3,MOTOR_RIGHT_BLUE_VALUE);
}break;
}
TIM_ClearITPendingBit(TIM3,TIM_IT_CC1);
}
else if(TIM_GetITStatus(TIM3,TIM_IT_CC2)!=RESET)
{
LR_capture2=TIM_GetCapture2(TIM3);
switch(motor_dir)
{
case MOTOR_DIR_LEFT :
{
if(LR_capture2==MOTOR_LEFT_BROWN_VALUE)
TIM_SetCompare2(TIM3,MOTOR_LEFT_BROWN_VALUE+HIGH_DUTY_CYCLE);
else if (LR_capture2==MOTOR_LEFT_BROWN_VALUE+HIGH_DUTY_CYCLE)
TIM_SetCompare2(TIM3,MOTOR_LEFT_BROWN_VALUE);
}break;
case MOTOR_DIR_RIGHT :
{
if(LR_capture2==MOTOR_RIGHT_BROWN_VALUE)
TIM_SetCompare2(TIM3,MOTOR_RIGHT_BROWN_VALUE+HIGH_DUTY_CYCLE);
else if(LR_capture2==MOTOR_RIGHT_BROWN_VALUE+HIGH_DUTY_CYCLE)
TIM_SetCompare2(TIM3,MOTOR_RIGHT_BROWN_VALUE);
}break;
}
TIM_ClearITPendingBit(TIM3,TIM_IT_CC2);
}
else if(TIM_GetITStatus(TIM3,TIM_IT_CC3)!=RESET)
{
LR_capture3=TIM_GetCapture3(TIM3);
switch(motor_dir)
{
case MOTOR_DIR_LEFT :
{
if(LR_capture3==MOTOR_LEFT_YELLOW_VALUE)
TIM_SetCompare3(TIM3,MOTOR_LEFT_YELLOW_VALUE+HIGH_DUTY_CYCLE);
else if(LR_capture3==MOTOR_LEFT_YELLOW_VALUE+HIGH_DUTY_CYCLE)
TIM_SetCompare3(TIM3,MOTOR_LEFT_YELLOW_VALUE);
}break;
case MOTOR_DIR_RIGHT :
{
if(LR_capture3==MOTOR_RIGHT_YELLOW_VALUE)
TIM_SetCompare3(TIM3,MOTOR_RIGHT_YELLOW_VALUE+HIGH_DUTY_CYCLE);
else if(LR_capture3==MOTOR_RIGHT_YELLOW_VALUE+HIGH_DUTY_CYCLE)
TIM_SetCompare3(TIM3,MOTOR_RIGHT_YELLOW_VALUE);
}break;
}
TIM_ClearITPendingBit(TIM3,TIM_IT_CC3); //???ò????????
}
else if(TIM_GetITStatus(TIM3,TIM_IT_CC4)!=RESET)
{
LR_capture4=TIM_GetCapture4(TIM3);
switch(motor_dir)
{
case MOTOR_DIR_LEFT :
{
if(LR_capture4==MOTOR_LEFT_BLACK_VALUE)
TIM_SetCompare4(TIM3,MOTOR_LEFT_BLACK_VALUE+HIGH_DUTY_CYCLE-8*BEAT);
else if(LR_capture4==MOTOR_LEFT_BLACK_VALUE+HIGH_DUTY_CYCLE-8*BEAT)
TIM_SetCompare4(TIM3,MOTOR_LEFT_BLACK_VALUE);
}break;
case MOTOR_DIR_RIGHT :
{
if(LR_capture4==MOTOR_RIGHT_BLACK_VALUE)
TIM_SetCompare4(TIM3,MOTOR_RIGHT_BLACK_VALUE+2*BEAT);
else if(LR_capture4==MOTOR_RIGHT_BLACK_VALUE+2*BEAT)
TIM_SetCompare4(TIM3,MOTOR_RIGHT_BLACK_VALUE+7*BEAT);
else if(LR_capture4==MOTOR_RIGHT_BLACK_VALUE+7*BEAT)
TIM_SetCompare4(TIM3,MOTOR_RIGHT_BLACK_VALUE+2*BEAT);
}break;
}
TIM_ClearITPendingBit(TIM3,TIM_IT_CC4);
}
}
[/mw_shl_code]