你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

编码器驱动

[复制链接]
lugf 提问时间:2019-8-17 16:26 /
请问各位大神:STM8如何驱动编码电位器,需要中断吗?我是初学者,请各位大神多多指教
收藏 评论9 发布时间:2019-8-17 16:26

举报

9个回答
mmuuss586 回答时间:2019-8-19 10:05:38
用不用中断都可以;

用的话更方便;
00-405686 回答时间:2019-8-19 10:59:52
一般用中断,数个数就好了
lugf 回答时间:2019-8-19 11:43:50
00-405686 发表于 2019-8-19 10:59
一般用中断,数个数就好了


----------- Project led1 - STM8 Cosmic - Configuration Debug -------------

Compiling src\encode.c...
cxstm8 -i..\..\stvd\en.stsw-stm8023\an3279\libraries\stm8_touchsensing_driver\inc -i..\stvd.h\stm8s_stdperiph_driver\inc -i..\..\stvd\en.stsw-stm8023\an3279\project\discover\inc -iinc -i..\123 -i..\库文件\stm8_touchsensing_driver\inc -i..\库文件\stm8s_stdperiph_driver\inc -i..\..\stvd库文件\en.stsw-stm8023\an3279\libraries\stm8s_stdperiph_driver\inc -i..\..\stvd库文件\en.stsw-stm8023\an3279\project\discover\inc +debug -pxp -no -l +mods0 -pp -i"C:\Program Files (x86)\COSMIC\CXSTM8\Hstm8" -i"C:\Program Files (x86)\STMicroelectronics\st_toolset\include"  -clDebug\ -coDebug\ src\encode.c
src\encode.c:

Running Linker
clnk -m Debug\led1.map -l"C:\Program Files (x86)\COSMIC\CXSTM8\Lib" -l"C:\Program Files (x86)\COSMIC\CXSTM8\Lib"  -o Debug\led1.sm8 Debug\led1.lkf
#error clnk Debug\led1.lkf:1 symbol _EXTI_SetExtIntSensitivity not defined (Debug\main.o )
#error clnk Debug\led1.lkf:1 symbol _EXTI_DeInit not defined (Debug\main.o )
The command: "clnk -m Debug\led1.map -l"C:\Program Files (x86)\COSMIC\CXSTM8\Lib" -l"C:\Program Files (x86)\COSMIC\CXSTM8\Lib"  -o Debug\led1.sm8 Debug\led1.lkf " has failed, the returned value is: 1
exit code=1.

led1.elf - 4 error(s), 0 warning(s)


我写了一个编码器程序,编译出错了。能不能告诉我这是什么问题引起的错误
00-405686 回答时间:2019-8-19 13:22:31
#error clnk Debug\led1.lkf:1 symbol _EXTI_SetExtIntSensitivity not defined (Debug\main.o )
#error clnk Debug\led1.lkf:1 symbol _EXTI_DeInit not defined (Debug\main.o )
这里两个函数未定义;你直接把代码贴出来吧
lugf 回答时间:2019-8-19 15:54:43



/*********************************************************
TMA-1A控制程序
功能:键盘和编码电位器
**********************************************************/

#include "stm8s.h"
#include "encode.h"
#include "led.h"
#include "exti.h"



unsigned char ENCODE_LED_State=0;                //编码电位器LED状态
unsigned char ENCODE_LEDTIME=0;        //编码电位器LED计时

u8 RotaryEncoder_STATE = DISABLE;
unsigned char RotaryEncoderData=0;



void RotaryEncoder_Handler(void)
{
        unsigned char a,b,c,d;
        delay_ms(1);        //滤除干扰信号
        a=RotaryEncoder1;
        b=RotaryEncoder2;
       
        if(a == 0) RotaryEncoderData = RotaryEncoderData << 1;
        else RotaryEncoderData = (RotaryEncoderData<<1)|0x01;
       
        if(b == 0) RotaryEncoderData = RotaryEncoderData << 1;
        else RotaryEncoderData = (RotaryEncoderData<<1)|0x01;
       
        switch(RotaryEncoderData)
        {
                case 0x4B:
                        RotaryEncoder_STATE = RIGHT;
                        RotaryEncoderData = 0;
                        break;
                       
                case 0x87:
                        RotaryEncoder_STATE = LEFT;
                        RotaryEncoderData = 0;
                        break;
                       
                default :
                                break;
        }       
}

void EncodeFunctionsCheck(void)
{
        if(RotaryEncoderIRQ == DISABLE) return;
       
        RotaryEncoder_Handler();
       
        if(RotaryEncoder_STATE != DISABLE)
        {
                switch(RotaryEncoder_STATE)
                {
                        case LEFT:
                                //ENCODE_LED_State = ENABLE;
                                //ENCODE_LEDTIME=0;
                GPIO_WriteReverse(GPIOD, GPIO_PIN_7);


                                break;
                               
                        case RIGHT:
                                //ENCODE_LED_State = ENABLE;
                                //ENCODE_LEDTIME=0;
                GPIO_WriteReverse(GPIOD, GPIO_PIN_7);

                                break;
                               
                        default :
                                break;
                }
                RotaryEncoder_STATE = DISABLE;
        }
        RotaryEncoderIRQ = DISABLE;
        RotaryEncoder_IRQ_ENABLE;
}
lugf 回答时间:2019-8-19 15:55:07
#ifndef  __ENCODE_H
#define  __ENCODE_H

#include "exti.h"
#include "stm8s.h"
#include "led.h"

void EncodeFunctionsCheck(void);



/**********************************************************
*                                                         *
* 编码电位器控制引脚定义                                                                                                                                  *
*                                                         *
**********************************************************/

#define ENABLE 1
#define DISABLE 0
#define RUN 2
#define TRUE 1
#define FALSE 0
#define HIGH 1
#define LOW 0
#define PASS 1
#define FAIL 0
#define LEFT 1
#define RIGHT 2

//#define LED1_Port         GPIOD                //定义ENCODE数据端口
//#define LED1_PIN                        GPIO_PIN_7



#define RotaryEncoderPort         GPIOB                //定义ENCODE数据端口

//#define PWM2_PORT         GPIOE
#define RotaryEncoder_EXTI_PORT EXTI_PORT_GPIOB

#define RotaryEncoder1_PIN                        GPIO_PIN_6
#define RotaryEncoder2_PIN                        GPIO_PIN_7

#define RotaryEncoder1         GPIO_ReadInputPin(RotaryEncoderPort, RotaryEncoder1_PIN)                //定义编码电位器引脚
#define RotaryEncoder2         GPIO_ReadInputPin(RotaryEncoderPort, RotaryEncoder2_PIN)                //定义编码电位器引脚

#define RotaryEncoder_IRQ_DISABLE  GPIO_Init(RotaryEncoderPort, (RotaryEncoder1_PIN|RotaryEncoder2_PIN), GPIO_MODE_IN_PU_NO_IT);
#define RotaryEncoder_IRQ_ENABLE   GPIO_Init(RotaryEncoderPort, (RotaryEncoder1_PIN|RotaryEncoder2_PIN), GPIO_MODE_IN_PU_IT);




lugf 回答时间:2019-8-19 15:55:48


#include "stm8s.h"
#include "exti.h"
#include "encode.h"
#include "led.h"


FunctionalState RotaryEncoderIRQ = DISABLE;
/*****************
@far @interrupt void KEY_IRQ(void)
{
        if(KEY_DOWN == DISABLE)        KEY_DOWN = ENABLE;
        GPIO_Init(BUTTONS_PORT,(Y0|Y1|Y2), GPIO_MODE_IN_PU_NO_IT);
}
**********************/

/**********************************************************

编码电位器中断

**********************************************************/
@far @interrupt void RotaryEncoder_IRQHandler(void)
{
        RotaryEncoderIRQ = ENABLE;
        RotaryEncoder_IRQ_DISABLE;
}
lugf 回答时间:2019-8-19 15:56:06
#ifndef __EXTI_H
#define __EXTI_H

/* Includes ------------------------------------------------------------------*/

#include "stm8s.h"
#include "encode.h"
#include "led.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
extern FunctionalState RotaryEncoderIRQ;

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/


/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/* Remote */
//@far @interrupt void GPIOB_IRQHandler(void);
@far @interrupt void RotaryEncoder_IRQHandler(void);
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */


#endif
lugf 回答时间:2019-8-19 15:56:47
帮我看一下哪里出问题,谢谢

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版