开发环境:

RT-Thread版本:4.0.3

操作系统:Windows 10

RT-Thread Studio版本:2.0.0

开发板MCU:AB5301A

5.1按键简介

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

《嵌入操作系统 - 玩转中科蓝讯(AB32VG1)开发板(基于RT-Thread系统)》第5章 按键喂狗_按键

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

5.2按键喂狗代码实现

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

【task.c】

/**
******************************************************************************
* @file task.c
* @author 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; /* 看门狗设备句柄 */

/**
* @brief 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​​定义。

《嵌入操作系统 - 玩转中科蓝讯(AB32VG1)开发板(基于RT-Thread系统)》第5章 按键喂狗_AB5301A_02

5.3按键实验现象

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

《嵌入操作系统 - 玩转中科蓝讯(AB32VG1)开发板(基于RT-Thread系统)》第5章 按键喂狗_#include_03

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





资源获取方法

1.长按下面二维码,关注公众号[嵌入式实验楼]

2.在公众号回复关键词[AB32VG1]获取资料

《嵌入操作系统 - 玩转中科蓝讯(AB32VG1)开发板(基于RT-Thread系统)》第5章 按键喂狗_RT-Thread_04





欢迎访问我的网站

​BruceOu的哔哩哔哩​

​BruceOu的主页​

​BruceOu的博客​

​BruceOu的简书​

​BruceOu的知乎​