EC11编码器HAL库

检测EC11编码器的正反转;

实现原理参考:

EC11旋转编码器、stm32f103驱动程序_白二河的博客-CSDN博客_ec11 stm32例程

一、电路实现

原理图:上拉电阻加1级RC滤波

实物图未加RC滤波


 

二、代码实现

自己用HAL库实现(第一次使用HAL库与标准库用法不一样,如配置IO口输出通过两个配置实现,外部中断时钟的配置、以及中断函数的配置都与标准库有差异)

贴出函数;

main

#include "system.h"
#include "SysTick.h"
#include "ec11.h"
#include "exti.h"
#include "usart.h"
#include "led.h"


/*******************************************************************************
* 函 数 名         : main
* 函数功能		   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
int main()
{
	u8 i=0;
	
	HAL_Init();                     //初始化HAL库 
	SystemClock_Init(RCC_PLL_MUL9); //设置时钟,72M
	SysTick_Init(72);

	USART1_Init(115200);
	printf("OK\r\n");
	LED_Init();
	EC11_Init();
	EXTI_Init();

	
	while(1)
	{
		delay_ms(1000);
		LED = !LED;
	}
}

EC11

#include "ec11.h"

void EC11_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	__HAL_RCC_GPIOB_CLK_ENABLE();
	
	GPIO_InitStructure.Pin = EC11A_PIN;
	GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
	GPIO_InitStructure.Pull = GPIO_PULLDOWN;
	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_MEDIUM;
	
	HAL_GPIO_Init(EC11A_PORT,&GPIO_InitStructure);
	
	GPIO_InitStructure.Pin = EC11B_PIN;
	HAL_GPIO_Init(EC11B_PORT,&GPIO_InitStructure);
}

外部中断

#include "exti.h"
#include "SysTick.h"
#include "ec11.h"
#include "usart.h"

//外部中断初始化
void EXTI_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure;
    
    __HAL_RCC_GPIOB_CLK_ENABLE();               //开启GPIOB时钟

    
    GPIO_Initure.Pin=GPIO_PIN_0;                //PB0
    GPIO_Initure.Mode=GPIO_MODE_IT_RISING;      //上升沿触发
    GPIO_Initure.Pull=GPIO_PULLDOWN;
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);
    
    
    //中断线1-PB1
    HAL_NVIC_SetPriority(EXTI1_IRQn,2,0);       //抢占优先级为2,子优先级为0
    HAL_NVIC_EnableIRQ(EXTI0_IRQn);             //使能中断线0
    
}


//中断服务函数
void EXTI0_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);		//调用中断处理公用函数
}

//中断服务程序中需要做的事情
//在HAL库中所有的外部中断服务函数都会调用此函数
//GPIO_Pin:中断引脚号
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    delay_ms(1);      //消抖
    switch(GPIO_Pin)
    {
        case GPIO_PIN_0:
            if(EC11A==1) 
            {
				if(EC11B == 1)
				{
					printf("正转\r\n");
				}
				else
				{
					printf("反转\r\n");
				}
	
            }
            break;
      
    }
}

三、效果

四、keil软件

在用5.14旧版时新固件的ST-link一直无法识别报错:通过以下方法

1;升级ST-link版本具体升级教程参考

ST-Link该如何升级?_strongerHuang的博客-CSDN博客

升级多次后问题依旧,用曾工高版本的KEIL可以识别出。

2;排除ST-LINK问题,就是KEIL版本问题,

升级KEIL,在升级KEIL时先卸载旧的软件,但一直无法找到卸载向导没有uninstall.exe文件,最后删除keil整文件,再删除KEIL的注册列表;

卸载参考文章:

彻底卸载Keil4和Keil5_unique-R的博客-CSDN博客_keil卸载

安装5.37的最新keil 最新的KEIL为推广AC6编译器(编译更快)没有内置AC5编译器,以前的工程文件都是AC5编译的所以需要再安装AC5编译器,才能编译.

软件安装参考:

STM32入门基础教程-4-KEIL安装AC5编译器_哔哩哔哩_bilibili

 五、一波三折

猜你喜欢

转载自blog.csdn.net/qq_45803449/article/details/127392788