RT-Thread看门狗驱动流程

文章目录

  • 1、配置STM32CubeMX
  • 2、配置Kconfig
  • 3、代码测试

1、配置STM32CubeMX

RT-Thread看门狗驱动流程_第1张图片
首先要使能HAL库的看门狗功能。

另外一种方法是,找到stm32fxx_hal_conf.h文件,接着就将对应的宏打开。这样就可以不用开打STM32CubeMX。不过,下次配置STM32CubeMX时候要小心,你重新生成的工程会将你直接在文件打开的宏给注释掉,因为你没有在STM32CubeMX上使能。
RT-Thread看门狗驱动流程_第2张图片

2、配置Kconfig

仿照上面的语法来写
RT-Thread看门狗驱动流程_第3张图片
写的时候怎么知道对应的 宏定义(BSP_USING_WDT)呢??
首先,打开drv_wdt.c文件
RT-Thread看门狗驱动流程_第4张图片
我可以很清楚地看到它所定义的宏,当宏被定义了,看门狗才能真正被打开。之前由于写错Kconfig,导致调用rt_device_find()时候,返回错误。
RT-Thread看门狗驱动流程_第5张图片

3、代码测试

/*
 * Copyright (c) 2006-2018, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2018-11-06     SummerGift   first version
 */

#include 
#include 
#include 

/* defined the LED0 pin: PB1 */
#define LED0_PIN    GET_PIN(C, 0)
int wdt_sample();

int main(void)
{
    int count = 1;

    /* set LED0 pin mode to output */
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
	wdt_sample();
    while (count++)			
    {
        rt_pin_write(LED0_PIN, PIN_HIGH);		//点灯
        rt_thread_mdelay(500);
        rt_pin_write(LED0_PIN, PIN_LOW);
        rt_thread_mdelay(500);
    }

    return RT_EOK;
}


/*
 * 程序清单:这是一个独立看门狗设备使用例程
 * 例程导出了 wdt_sample 命令到控制终端
 * 命令调用格式:wdt_sample wdt
 * 命令解释:命令第二个参数是要使用的看门狗设备名称,为空则使用例程默认的看门狗设备。
 * 程序功能:程序通过设备名称查找看门狗设备,然后初始化设备并设置看门狗设备溢出时间。
 *           然后设置空闲线程回调函数,在回调函数里会喂狗。
*/

#include 
#include 

#define WDT_DEVICE_NAME    "wdt"    /* 看门狗设备名称 */

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

static void idle_hook(void)
{
    /* 在空闲线程的回调函数里喂狗 */
    rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
    rt_kprintf("feed the dog!\n ");//正式使用时去掉
}

int wdt_sample(void)
{
    rt_err_t ret = RT_EOK;
    rt_uint32_t timeout = 1;        /* 溢出时间,单位:秒 */
    char device_name[RT_NAME_MAX]=WDT_DEVICE_NAME;

    /* 根据设备名称查找看门狗设备,获取设备句柄 */
    wdg_dev = rt_device_find(device_name);
    if (!wdg_dev)
    {
        rt_kprintf("find %s failed!\n", device_name);
        return RT_ERROR;
    }
    /* 初始化设备 */
    ret = rt_device_init(wdg_dev);
    if (ret != RT_EOK)
    {
        rt_kprintf("initialize %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;
    }
    /* 设置空闲线程回调函数 */
    rt_thread_idle_sethook(idle_hook);

    return ret;
}

RT-Thread看门狗驱动流程_第6张图片

你可能感兴趣的:(RT-Thread)