基于STM32F407ZGT6的EC11旋钮编码器配置和使用

不讲基本原理,只给直接使用的代码。亲测可直接移植使用,IO口可自行另外配置。

Encoder.c

#include "Encoder.h"
#include "usart.h"	

void Encoder_Init(void)
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; // 速度MHz
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10; // 添加PD10配置
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; // 速度MHz
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10; // 添加PD10配置
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
    
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource8);
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource9);
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource10); // 配置PD10

    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line = EXTI_Line8 | EXTI_Line9 | EXTI_Line10; // 添加PD10配置
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 配置下降沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
    
    EXTI_InitStructure.EXTI_Line = EXTI_Line10; // 添加PD10配置
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 配置下降沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
    
    
    
    

    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; // 添加PD10配置
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; // 设置PD10的子优先级为2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

int16_t Encoder_Get(void)
{
    int16_t Temp;
    Temp = Encoder_Count;
    Encoder_Count = 0;
    return Temp;
}

void EXTI9_5_IRQHandler(void)
{

    if (EXTI_GetITStatus(EXTI_Line8) != RESET)
    {
     delay_us(4500);
        if (GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_8) == 0)
        {
            
            if (GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_9) == 1)
            {
               
                Encoder_Count--;
            }
        }
        EXTI_ClearITPendingBit(EXTI_Line8);
    }

    if (EXTI_GetITStatus(EXTI_Line9) != RESET)
    {
      delay_us(4500);
        if (GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_9) == 0)
        {
            
            if (GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_8) == 1)
            {
                
                
                Encoder_Count++;
            }
        }
        EXTI_ClearITPendingBit(EXTI_Line9);
    }
}

void EXTI15_10_IRQHandler(void) // 添加PD10配置的中断处理函数
{
    // PD10上升沿触发的操作
    delay_ms(5);
    if (EXTI_GetITStatus(EXTI_Line10) != RESET)
    {
        if (GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_10) != 0)
        {
            // TODO: 添加你需要的操作代码
            
            printf("按键按下");
            Encoder_Count+=100;
            
        }
        EXTI_ClearITPendingBit(EXTI_Line10);
    }
}



Encoder.h

#ifndef  __ENCODE_H
#define  __ENCODE_H

#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_exti.h"
#include "delay.h"
#include "stdint.h"
#include "misc.h"


extern uint16_t Encoder_Count;


void Encoder_Init(void);
int16_t Encoder_Get(void);


#endif  /*__DIY_H*/

main.c

#include "sys.h"


uint16_t Encoder_Count = 0;
uint16_t  Encoder_KEY_NUMBERS = 0;
uint16_t  CH[24] = {0};

int main(void)
{

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
    delay_init(168);        //初始化延时函数
    uart_init(115200);		//初始化串口波特率为115200
    Encoder_Init();         //旋钮编码器

    while(1)
    {
          Encoder_KEY_NUMBERS += (uint16_t)Encoder_Get();//限制为0~65535

                CH[0] = Encoder_KEY_NUMBERS;
                 printf("%d", (uint16_t)*CH);  //输出到串口






    }

}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
基于STM32F407ZGT6的示波器是一款使用STM32F407ZGT6微控制器作为核心芯片的示波器设备。STM32F407ZGT6是一款高性能32位ARM Cortex-M4微控制器,具有丰富的外设和强大的处理能力,非常适合用于设计和开发示波器。 基于STM32F407ZGT6的示波器通过连接外部传感器,可以测量和显示电压波形和信号的变化情况。它可以采集高精度的模拟信号,并通过STM32F407ZGT6的AD转换功能将模拟信号转换为数字信号进行处理。示波器可以根据采样率和触发设置,实时显示波形图像,让用户直观地观察和分析信号的变化。 基于STM32F407ZGT6的示波器具有便捷的操作界面和丰富的功能设置。用户可以通过触控屏幕或按键进行操作,选择不同的触发方式、采样率和时间范围,以及调整波形显示的亮度和对比度等参数。此外,示波器还可以存储和回放采集到的波形数据,方便用户进行离线分析和比较。 基于STM32F407ZGT6的示波器在设计上考虑了性能和可靠性的因素。它具有稳定的电源供应和抗干扰能力,能够正常工作在工业环境下。同时,示波器还支持固件升级和扩展模块接口,可以根据用户的需求进行功能扩展和升级。 总的来说,基于STM32F407ZGT6的示波器是一款高性能、可靠稳定的示波器设备,适用于各种电子设备的测试和调试应用。它具有丰富的功能和操作界面,方便用户进行信号分析和调试工作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桂北研猛男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值