STM32学习(四)旋转编码器 新手入门及常见问题解决

本文详细描述了如何使用STM32F10x的GPIO和EXTI模块配置双通道编码器中断,初始化GPIO、设置中断触发方式,以及处理中断以实现计数功能,提醒读者注意中断函数执行时的潜在问题。
摘要由CSDN通过智能技术生成
#include "stm32f10x.h"                  // Device header
  
int16_t encoder_count;
  
  
void encoder_Init(void)
{
 GPIO_InitTypeDef  GPIO_InitStructure;
 EXTI_InitTypeDef EXTI_INitstructure;
 NVIC_InitTypeDef  NVIC_InitStruct;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);	 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);  //开启AFIO的时钟 EXTI是CPU的内置部分 是一直开启状态 NVIC同理
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;				 //LED0-->PB.5 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 		 //上拉输出 (在EXTI中上拉 下拉 浮空 都是可以的)
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB.5
	
 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//配置数据选择器 配置我们要中断的引脚
	//GPIO_PinRemapConfig-引脚重映射
	//外部中断的配置

	
 EXTI_INitstructure.EXTI_Line = EXTI_Line0 | EXTI_Line1 ; //指定要配置的中断线
 EXTI_INitstructure.EXTI_Mode = EXTI_Mode_Interrupt;
 EXTI_INitstructure.EXTI_Trigger = EXTI_Trigger_Falling;
 EXTI_INitstructure.EXTI_LineCmd =  ENABLE; //中断线状态
 EXTI_Init(&EXTI_INitstructure);
//NVIC在misc.h中 配置
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设定分组
  
 NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; 
 NVIC_Init(&NVIC_InitStruct);
 
 NVIC_InitStruct.NVIC_IRQChannel = EXTI1_IRQn;
 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; 
 NVIC_Init(&NVIC_InitStruct);
	
}

void EXTI0_IRQHandler(void)//中断函数的配置
{
  if(EXTI_GetITStatus(EXTI_Line0) == SET)
  {
      EXTI_ClearITPendingBit(EXTI_Line0);
  }
  if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0)
  {
    encoder_count--;
  }

}

void EXTI1_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line1) == SET)
  {
      EXTI_ClearITPendingBit(EXTI_Line1);
  }
  if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) == 0)//判断另一个引脚
  {
    encoder_count++;
  }

}
int16_t get_count(void)//返回count 的变化值
{
   int16_t temp;
   temp = encoder_count;
   encoder_count = 0;
   return temp;

}
//注意事项
//中断函数执行不宜过长 否则会形成堵塞 在主程序和中断程序里,不要操作同一会发生冲突的硬件
//可以在中断里 操作变量 或者 标志位

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值