2152|2

1704

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

中科蓝讯AB32VG1开发板---基于RT-Thread系统--按键喂狗分享 [复制链接]

 

转载来源:https://blog.bruceou.cn/tag/ab32vg1/

开发环境:RT-Thread版本:4.0.3
操作系统:Windows 10

RT-Thread Studio版本:2.0.0
开发板MCU:AB5301A

 

1.按键简介
前面一讲讲看门狗使用了起来,本文将使用按键来喂狗。按键电路如下:

 

 

本文使用S2。从图中可以看出,按键是共地的,因此我们需要检测下降沿即可判断按键是被按下。

 

2.按键喂狗代码实现


按键一般通过循环扫描和中断方式实现,AB32VG1寄存器不全,官方也为给出中断的实现,本文直接使用扫描的方式实现。代码如下:

【task.c】
 

/**
  ******************************************************************************
  * [url=home.php?mod=space&uid=1307177]@File[/url]                task.c
  * [url=home.php?mod=space&uid=1315547]@author[/url]              BruceOu
  * @LIB version         V3.5.0
  * @version V1.0
  * @date 2021-03-20
  * @blog https://blog.bruceou.cn/
  * @official Accounts   嵌入式实验楼
  * @brief RTT任务
  ******************************************************************************
  */
/*Includes**********************************************************************/
#include "task.h"

static rt_device_t wdg_dev;         /* 看门狗设备句柄 */

/**
  * [url=home.php?mod=space&uid=159083]@brief[/url]  wdt_init
  * @param  None
  * @retval ret
  */
int wdt_init(void)
{
    rt_err_t ret = RT_EOK;
    rt_uint32_t timeout = 5;        /* 溢出时间,4096ms 单位:秒 */
    char device_name[RT_NAME_MAX];

    rt_strncpy(device_name, WDT_DEVICE_NAME, RT_NAME_MAX);

    /* 根据设备名称查找看门狗设备,获取设备句柄 */
    wdg_dev = rt_device_find(device_name);
    if (!wdg_dev)
    {
        rt_kprintf("find %s failed!\n", device_name);
        return RT_ERROR;
    }

    /* 设置看门狗溢出时间 */
    ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
    if (ret != RT_EOK)
    {
        rt_kprintf("set %s timeout failed!\n", device_name);
        return RT_ERROR;
    }
    /* 启动看门狗 */
    ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
    if (ret != RT_EOK)
    {
        rt_kprintf("start %s failed!\n", device_name);
        return -RT_ERROR;
    }

    return ret;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(wdt_init, wdt sample);

static rt_thread_t tid_key = RT_NULL;

/**
  * @brief  read_key
  * @param  key
  * @retval int
  */
int read_key(uint8_t key)
{
    return rt_pin_read(key);
}

/**
  * @brief  thread_key_entry
  * @param  parameter
  * @retval None
  */
static void thread_key_entry(void *parameter)
{
    uint8_t key = *(uint8_t *)parameter;

    while (1)
    {
        if (read_key(key) == PIN_LOW)
        {
            rt_thread_mdelay(50);
            if (read_key(key) == PIN_LOW)
            {
                /* 在空闲线程的回调函数里喂狗 */
                rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
                rt_kprintf("feed the dog");
            }
        }
        rt_thread_mdelay(100);
    }
}

/**
  * @brief  thread_key
  * @param  None
  * @retval None
  */
int thread_key(void)
{
    uint8_t key = rt_pin_get(KEY_PIN_NUM);

    // 设置按键为上拉输入模式
    rt_pin_mode(key, PIN_MODE_INPUT_PULLUP );

    /* 创建线程  */
    tid_key = rt_thread_create("thread key",
                            thread_key_entry,
                            &key,
                            512,
                            8, 5);

    if (tid_key != RT_NULL)
        rt_thread_startup(tid_key);

    rt_thread_mdelay(300);

    return 0;
}

/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(thread_key, thread key sample);

【task.h】
 

#ifndef _TASK_H_
#define _TASK_H_

/* Standard includes. */
#include <stdio.h>

/* rtthread includes. */
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

#define WDT_DEVICE_NAME    "wdt"    /* 看门狗设备名称 */
#define KEY_PIN_NUM  "PF.1"

int thread_key(void);
int wdt_init(void);

#endif

代码很简单,在按键线程中,通过按下按键来喂狗,如果超时喂狗,则系统复位。

值得注意的是,这里的超时时间在drv_wdt.h定义。

3 .按键实验现象


编译无误,下载程序,先输入thread_key, 再输入wdt_init,现象如下

 按下按键S2,会有打印信息,说明看门狗工作正常,如果不喂狗,系统将复位。
 

最新回复

寄存器不全是个什么意思?芯片还能这样?   详情 回复 发表于 2021-8-24 17:11

赞赏

1

查看全部赞赏

点赞(2) 关注
 
 

回复
举报

1942

帖子

2

TA的资源

版主

沙发
 

还不错,RTThread确实好用!

 
 
 

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

板凳
 

寄存器不全是个什么意思?芯片还能这样?

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表