中级会员
 
- 积分
- 317
- 金钱
- 317
- 注册时间
- 2015-11-4
- 在线时间
- 51 小时
|
10金钱
我现在遇到一个奇葩问题,我在主函数定义一个全局变量,在中断服务函数里面修改,然后发现他的值不知道飞哪里去了。。。
我是用的TIM5作为编码器模式,TIM7来定时算速度,就是那个rcnt5这个值
TIM5如下:void TIM5_Configuration(void){
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM5);
TIM_TimeBaseStructure.TIM_Period = 720;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
TIM_EncoderInterfaceConfig(TIM5, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 6;
TIM_ICInit(TIM5, &TIM_ICInitStructure);
TIM_ClearFlag(TIM5, TIM_FLAG_Update);
TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);
TIM5->CNT = 0;
TIM_Cmd(TIM5, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void TIM5_IRQHandler(void)
{
if (TIM5 -> CR1 & 0X0010)
{
rcnt5 -= 1;
}
else rcnt5 += 1;
TIM_ClearITPendingBit(TIM5, TIM_IT_Update);
}
TIM7如下:void TIM7_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7,ENABLE);
TIM_TimeBaseInitStructure.TIM_Period = 5000-1;
TIM_TimeBaseInitStructure.TIM_Prescaler=8400-1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
//TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM7,&TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);
TIM_UpdateRequestConfig(TIM7,TIM_UpdateSource_Regular);
TIM_Cmd(TIM7,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel=TIM7_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void TIM7_IRQHandler(void)
{
get_encoder_FOU();//这个函数中只是把rcnt5拿来用了一下,没有改;
TIM_ClearITPendingBit(TIM7,TIM_FLAG_Update);
}
主函数:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init(168);
uart_init(19200);
LED_Init();
TIM5_Configuration();
TIM7_Configuration();
while(1)
{
delay_ms(500);
printf("\r\n iμÄÖμ %d\r\n",rcnt5);
}
结果就像那个图
|
-
|