中断驱动的自行车码表



 

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值