目录
1. 概述
本着由简入繁的原则,分析源码以STM32平台的看门狗源码为例,正好参考官方资料辅助学习下。
硬件平台及软件版本如下:
硬件平台:STM32F407ZG
RT-Thread版本:4.0.4
在分析源码前需要了解的基础知识如下:
自动初始化机制
I/O驱动模型
看门狗驱动框架
2. 原理解析
通过基础知识的准备,切回到我们的主题。那么在I/O设备模型下,使用watchdog驱动框架如何驱动硬件看门狗呢?
看下官方资料给出的流程图:
通过这张框图明确的流程是
1,创建看门狗设备,并实现底层驱动
2,注册看门狗设备到看门狗设备驱动框架
3,注册I/O设备到I/O设备管理器
4,应用程序使用看门狗
3. 源码解析
原则上说,分析源码是要明确框架才能进一步分析,但是为了方便与简化理解,不妨从设备驱动开始,往上层一步一步追踪来研究源码。
几个关键的RT-Thread的代码目录
设备的驱动代码在
libraries/HAL_Drivers
驱动框架
rt-thread/components/drivers
设备模型
rt-thread/src
3.1. 创建设备
按照上面的流程图理解,首先是要创建看门狗设备,这时看驱动文件drv_wdt.c。
看门狗设备的结构体定义如下,该看门狗设备采用静态初始化的方法,定义了看门狗设备对象及看门狗设备的操作方法。
struct stm32_wdt_obj
{
//看门狗设备定义
rt_watchdog_t watchdog;
//看门狗的硬件结构体定义
IWDG_HandleTypeDef hiwdg;
//是否初始化的标志
rt_uint16_t is_start;
};
//看门狗实例
static struct stm32_wdt_obj stm32_wdt;
//看门狗的操作方法
static struct rt_watchdog_ops ops;
其中使用了看门狗驱动框架的看门狗相关的结构体定义,后面在说。硬件结构体,就是stm32官方的定义,这个可以去看官方驱动示例。那么结合结构体的定义,看门狗的初始化如下,主要是配置硬件参数,然后向驱动框架中注册该设备,名字即为“wdt”。
int rt_wdt_init(void)
{
//看门狗硬件参数配置
#if d