检测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
五、一波三折