01.#define ROTATE_A PAin(2)
02.#define ROTATE_B PAin(3)
03.s16 DATA=0;
04.
05.void EXti2_IRQHandler(void)
06.{
07. IF(EXTI_GetITStatus(EXTI_Line2) != RESET)
08. {
09. if(ROTATE_A!=ROTATE_B)
10. {
11. DATA++;
12. }
13. else DATA--;
14. EXTI_ClearITPendingBit(EXTI_Line2);
15. }
16.}
17.
18.
19.void main(void)
20.{
21. SystemInit();
22. delay_init(72);
23. NVIC_Configuration();
24. KEY_Init();
25. while(1)
26. {
27. ;
28. }
29.}
大家可以观察图片,当顺时针时,A下降沿时, A!=B;当逆时针时,A下降沿时,A=B,从而来判断顺时针,还是逆时针。而且这样实现简单,只要一个中断就行了。
其实是在别的地方看的思路,然后复制过来改的。如果遇到AB 输出的编码器,大家可以参考下啊。
关键字:编码器程序 中断
引用地址:
比较精简的stm32编码器程序
推荐阅读最新更新时间:2024-11-17 01:19
基于STM32的停车锁系统
一.系统设计 停车场车位锁设计有蓝牙控制功能,可以通过蓝牙控制启动开锁,用步进电机模拟,开锁之后当车进行倒车的时候,可以将超声波采集到的距离数据发送给APP,另外当光敏电阻监测到比较暗的时候,会控制LED灯亮,给车照明。车停好之后可以远程控制车锁上,电机模拟。车锁之后如果光电管监测到有车要进入车位的时候,控制蜂鸣器报警提示。 图1 系统框图 二.硬件设计 系统内的主要电路有单片机最小系统电路,步进电机驱动电路、光敏检测电路、超声波测距电路,蓝牙通信电路、光电开关电路、电源电路、报警电路。 图2 硬件电路 三.软件设计 系统的软件逻辑清晰,首先先进行一次系统初始化,此时就开始进行超声波测距,光强检测,开始进行蓝牙通信,判断手
[单片机]
STM32内存分配解析及变量的存储位置
内存映射 在一些桌面程序中,整个内存映射是通过虚拟内存来进行管理的,使用一种称之为内存管理单元(MMU)的硬件结构来将程序的内存映射到物理RAM。在对于RAM紧缺的嵌入式系统中,是缺少MMU内存管理单元的。因此在一些嵌入式系统中,比如常用的STM32来讲,内存映射被划分为闪存段(也被称为Flash,用于存储代码和只读数据)和RAM段,用于存储读写数据。 STM32的Flash和RAM地址范围 标题中所说的内存是指STM32的Flash和RAM,下图是ARM Cortex M3的地址映射 从图中我们可以看出,RAM地址是从0x2000 0000开始的,Flash地址是从0x8000 0000开始的。 Flash 代码
[单片机]
AVR单片机中断应用设计要点
AVR的中断源比较多,尤其是ATmega128,一共有35个外部以及内部中断源。通常情况下,Flash程序存储器空间的最低位置(0x0000-0x0045)定义为复位和中断向量空间。完整的中断向量见第二章表2-23。在中断向量表中,处于低地址的中断向量所对应的中断拥有高优先级,所以,系统复位RESET拥有最高优先级。 A.中断设计注意点: 1.具备Bootloader功能的AVR,其中断向量区可以在Flash程序存储器空间最低位置和Bootloader区的头部来回迁移,这主要用于配合Bootloader程序的应用。如果不使用Bootloader功能,一般不要中断向量区进行迁移。 2.Flash较小的AVR芯片,其一个中断向量占
[单片机]
调试器不能连接到STM32的问题与解决办法
很多人都碰到过调试器不能连接到STM32的问题,不管是IAR的J-Link还是Keil的ULink,或者是ST的ST-Link。出现这个问题时,调试软件会提示不能建立与Cortex-M3的连接,或提示不能下载程序,或提示找不到要调试的设备等。 这样的问题都是发生在调试那些可以在CPU不干预的时候自动运行的模块、或在调试低功耗模式的程序的时候。 所谓 可以在CPU不干预的时候自动运行的模块 包括:DMA、定时器、连续转换模式下的ADC、看门狗等模块。 这个问题的根源是: 1)调试器需要在RAM内执行一段程序,对Flash进行擦写操作,如果不停止这些自动运行的模块,它们会干扰程序在RAM中的执行,致使下载失败。比如DMA模块被
[单片机]
基于STM32单片机高级控制定时器TIM1和TIM8的功能解析
高级控制定时器(TIM1 和TIM8) TIM1和TIM8定时器的功能包括: ● 16位向上、向下、向上/ 下自动装载计数器 ● 16位可编程( 可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535 之间的任意数值 ● 多达4个独立通道: ─ 输入捕获 ─ 输出比较 ─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出 ● 死区时间可编程的互补输出 ●使用外部信号控制定时器和定时器互联的同步电路 ● 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器 ● 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态 ● 如下事件发生时产生中断/DMA : ─ 更新:计数器向上溢出/ 向下溢出,计数器初始化(
[单片机]
51单片机-中断
#include <reg52.h> #include <intrins.h> unsigned int dd, i; void key() interrupt 0{ if(i == 0) P2 = dd; else{ dd = _crol_(dd,1); P2 = dd; } i++; } void main(){ EA = 1; //中断允许总控制位使能 EX0 = 1; //外部中断0中断允许位 IT0 = 1
[单片机]
配置STM32的PWM输出时没有波形输出的问题
以前在组织代码的时侯都是在初始化系统时钟时就一并初始化了各个外设,如 端口、定时器、串口等, 今天突发奇想,将各外设的初始化放到各外设的模块中去,这样的话没用到的外设就可以不用给时钟,降低能耗。 就这样问题出现了,PWM输出时没有波形输出。 反复检查对比了定时器的功能模块配置、输出IO的设置、RCC配置等,一直没有找到原因。 在准备放弃的时侯,有一搭没一搭的扫代码,突然一看,在设置输出IO代码之前没有给输出IO配置时钟,是在后配置的。 是不是这里的问题呢, 马上试试,果然。 这一记当头棒喝!! :) 所以, 在配置输出IO之前就要先配置IO时钟,谨记之!
[单片机]
带信号量和抢占式的中断调度的mini操作系统(基于8051)
做了7个文件,分别是 os_core.h //核心文件的参数定义 os_core.c //核心文件,包含进程的6种操作,系统级别的操作 task_switch.h //任务切换函数的定义 task_switch.c //任务切换函数的实现,采用抢占式中断调用(T2自动重载) sem.h //信号量的定义,其实也就是3个函数,创建信号量,发送一个信号量,接收信号量,在教材里面讲得那么复杂,差点把人搞晕了,实现起来不要太简单 sem.c //信号量实现 main.c //任务以及它的操作和主函数包括在这里 //--------------------------------------
[单片机]