STM8S 长按键识别

2019-12-03来源: eefocus关键字:STM8S  长按键识别

最近学习开发STM8S003 MCU,,刚入手这颗MCU,对很多功能不太了解,只能一边开发学习,记录一下学习过程。


目前,需要实现KEY1按键长按3s进行关机,Linux下直接获取按键的开始时间戳和结束时间戳,可以直接确定按键的触发时间,目前MCU采用的是按键中断的方式,在中断触发后直接进入进入中断函数进行处理,根据定时器的特性,现在是采用方法如下: 

将Tim1进行16分频,即频率为1Mhz,然后设置ARR(预装载计数器)为60000,即每次产生溢出时间为60ms, RCR(重复计数寄存器)为50,即 50 * 60 = 3000ms = 3s 后产生一个更新事件,而在按键中断函数中,在按键释放后,判断是否由此更新事件表示,如果有,则判断为按键触发大于3s,即可实现关机功能。


在实际测试过程中,通过打印的方式进行测试,发现并不是准确的3s产生一个更新事件,有时候2s多,有时候3s多,一直没有找到原因,难道是因为内部的时钟不准?感觉这个可能性比较小,现在还在查找原因,如果有了解原因的,麻烦告知一下^_^


代码如下: 

按键配置


#define KEY1_PORT GPIOC


#define KEY1_PIN   GPIO_PIN_3 //KEY1 PC3


#define KEY1  GPIO_ReadInputPin(KEY1_PORT, KEY1_PIN)


GPIO_Init(KEY1_PORT, (GPIO_Pin_TypeDef)KEY1_PIN,GPIO_MODE_IN_PU_IT); //KEY1


TIM1配置


    TIM1_DeInit();

    TIM1_TimeBaseInit(15,TIM1_COUNTERMODE_UP,60000,30);

    TIM1_ARRPreloadConfig(ENABLE);//使能自动重装

    TIM1_Cmd(ENABLE);//开定时器


中断函数


INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 5)

{

  /* In order to detect unexpected events during development,

     it is recommended to set a breakpoint on the following instruction.

  */

    //key1

    if(RESET == KEY1)

    {

        Delay(50); //按键消抖

        if(RESET == KEY1)                        //确认按下

        {   

                //do something for key1


                key_start_detect();


                while(RESET == KEY1)  //释放检测

                {

                    if (key_stop_detect()) //MODE_SHUT

                    {

                        stop();                                        

                    }  

                }


        }

    }  

}


void key_start_detect()

{

    TIM1_Cmd(DISABLE);

    TIM1_ClearFlag(TIM1_FLAG_UPDATE);

    TIM1_SetCounter(0);  //开始检测,计数清零

    TIM1_Cmd(ENABLE);

}


uint8_t key_stop_detect()

{

    //判断是否有更新事件标志

    if (TIM1_GetFlagStatus(TIM1_FLAG_UPDATE) != RESET)

    {

        TIM1_ClearFlag(TIM1_FLAG_UPDATE);

        return 1;

    }


    return 0;

}


关键字:STM8S  长按键识别 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic481830.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:stm8 内部EEPROM
下一篇:STM8L读写EEPROM(24LC64)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8S开发环境搭建IAR For STM8
/************************************************************************************************************************************ Name    : STM8S开发环境搭建IAR For STM8* Author  : MingMing* Release : 2013/12/29* Update  : 2013/12/29* E-mail  : clint.wang@foxmail.com
发表于 2019-12-05
STM8S开发环境搭建IAR For STM8
STM8S内部时钟切换问题解决
/************************************************************************************************************************************ Name    : STM8S内部时钟切换问题解决* Author  : MingMing* Release : 2013/12/28* Update  : 2013/12/29* E-mail  : clint.wang@foxmail.com
发表于 2019-12-05
STM8S内部时钟切换问题解决
STM8S存储器的读写操作
/************************************************************************************************************************************ Name    : STM8S存储器的读写操作* Author  : MingMing* Release : 2014/1/2* Update  : 2014/1/2* E-mail  : clint.wang@foxmail.com
发表于 2019-12-05
stm8s iar printf打印信息
串口通信正常我在程序中#include <stdio.h>int fputc(int ch, FILE *f)//STM8S105,printf函数重定向 {   while (!(UART2->SR&0x80));   UART2->DR=ch;  return ch; } 同时需要修改IAR的Projec t- >Options -> General Options -> Library Configuration中的Library 项由"Normal"改为"
发表于 2019-12-03
stm8s iar printf打印信息
stm8s 定时器2测量脉冲宽度(单位 us)
void Init_Timer2(void){  GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_IN_PU_NO_IT);//输入 无中断  TIM2_TimeBaseInit(TIM2_PRESCALER_16,65536-1);       //16分频, 65ms 溢出  TIM2_Cmd(ENABLE);  }uint16_t TIM2_GetCapture(void){  /* Get the Capture  Register value */  uint16_t tmpccr = 0;&n
发表于 2019-12-02
STM8S---外部中断应用之长按键识别
; {0x82, NonHandledInterrupt}, /* irq26 */    {0x82, NonHandledInterrupt}, /* irq27 */    {0x82, NonHandledInterrupt}, /* irq28 */    {0x82, NonHandledInterrupt}, /* irq29 */};外部中断长按键识别相关配置  STM8S为外部中断事件专门分配了五个中断向量:PortA 口的5个引脚:PA[6:2]PortB 口的8个引脚:PB[7:0]PortC 口的8个引脚:PC[7:0]PortD 口的7个引脚
发表于 2018-07-24
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved