中断驱动的自行车码表

来源:互联网 发布:linux删除一个目录 编辑:程序博客网 时间:2024/04/28 10:04



 

PA11和PA12的GPIO设置:

  //main.c

 GPIO_InitStruct.Pin = GPIO_PIN_11;

 GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;//PA11下降沿触发中断

 GPIO_InitStruct.Pull = GPIO_PULLUP;

 GPIO_InitStruct.Speed = GPIO_SPEED_LOW;

 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 

 GPIO_InitStruct.Pin = GPIO_PIN_12;

 GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;//PA12下降沿触发中断

 GPIO_InitStruct.Pull = GPIO_PULLUP;

 GPIO_InitStruct.Speed = GPIO_SPEED_LOW;

 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 

 HAL_NVIC_SetPriority(EXTI15_10_IRQn,0,0);//设置中断优先级,enable中断向量表

  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

 

接下来需要在stm32f1xx_it.c中实现EXTI15_10_IRQHandler

void EXTI15_10_IRQHandler(void){

        if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11)!=0){

               HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);

        }

        if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12)!=0){

               HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);

        }

}

 

然后调用HAL_GPIO_EXTI_Callback来判断并处理中断,消除标志位:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){

        switch(GPIO_Pin){

               caseGPIO_PIN_11:

                       printf("Pressed\r\n");

                       mode=!mode;    //更改模式

                       break;

               caseGPIO_PIN_12:     //增加一圈距离

                       counter++;

                       break;

        }

}

 

定时器中断:

定时器初始化:

void MX_TIM3_Init(void)

{

 

 TIM_ClockConfigTypeDef sClockSourceConfig;

 TIM_MasterConfigTypeDef sMasterConfig;

 

 TIM_Handler.Instance = TIM3;

 TIM_Handler.Init.Prescaler = 48000;

 TIM_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;

 TIM_Handler.Init.Period = 199;         //200ms

 TIM_Handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

 HAL_TIM_Base_Init(&TIM_Handler);

 

 sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;

 HAL_TIM_ConfigClockSource(&TIM_Handler, &sClockSourceConfig);

 

 sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

 sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

 HAL_TIMEx_MasterConfigSynchronization(&TIM_Handler,&sMasterConfig);

}

 

计时器中断处理函数:

//stm32f1xx_it.c

void TIM3_IRQHandler(void)

{

 HAL_TIM_IRQHandler(&TIM_Handler);

}

 

//main.c

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){

   if(htim->Instance == TIM3){       

        timer_flag= 1;       //设置flag

       timer_counter++;

    }

 

 

0 0
原创粉丝点击