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

编码器驱动

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

举报

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

用的话更方便;
294479435@qq.co 回答时间: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)


我写了一个编码器程序,编译出错了。能不能告诉我这是什么问题引起的错误
294479435@qq.co 回答时间: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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版