0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT-Thread Nano入门:独立看门狗(IWDT)

CHANBAEK 来源:MrZhou的技术栈 作者: zzx_mcu 2023-11-22 11:04 次阅读

本文主要介绍怎么用RT-Thread Nano实现独立看门狗IWDT驱动,创建一个喂狗线程,实现定时喂狗功能。

一、准备工作

1.硬件准备:

STM32F103RCT6(本人使用正点原子的MINI板)

ST-LINK

USB转TTL模块

2.软件准备:

KEIL5 MDK

STM32CubeMX

二、使用STM32CubeMX生成MDK工程

使用STM32CubeMX创建STM32F103RBT6的对应工程,配置时钟源,使能GPIO、UART、IWDT,配置时钟树。

配置预览效果,配置PA8引脚为推挽输出,用于LED灯闪烁。

图片

STM32F103RBT6的最大主频为72M,配置PLL选择外部时钟。

图片

生成KEIL MDK工程。

图片

二、添加RT-Thread Nano到工程

打开MDK工程,添加RT-Thread Nano组件,具体可参考官方《基于Keil MDK移植RT-Thread Nano》文档,链接为https://www.rt-thread.org/document/site/tutorial/nano/nano-port-keil/an0039-nano-port-keil/。

主要分为以下几个步骤:

  1. 注释掉STM32CubeMX生成的PendSV,HardFault,SysTick。
  2. 将main.c中的板级初始化函数,系统时钟配置函数移到board.c中,替换RTT的配置。
  3. 移植FinSH,实现rt_hw_console_output()函数。
void rt_hw_console_output(const char *str)
{
   /* empty console output */
   rt_size_t i = 0, size = 0;
   char a = 'r';

//   __HAL_UNLOCK(&huart1);
   rt_enter_critical();
   size = rt_strlen(str);
   for (i = 0; i < size; i++)
    {
       if (*(str + i) == 'n')
       {
           HAL_UART_Transmit(&huart1, (uint8_t *)&a, 1, 1);
       }
       HAL_UART_Transmit(&huart1, (uint8_t *)(str + i), 1, 1);
    }
       rt_exit_critical();

}

三、编写代码

主要实现两个功能,LED闪烁和IWDG喂狗。

  1. 在main函数中创建两个线程。
tid1 = rt_thread_create("iwdg",
                        iwdg_thread_entry,
                        RT_NULL,
                        THREAD_STACK_SIZE,
                        THREAD_PRIORITY,
                        THREAD_TIMESLICE);
if(tid1!= RT_NULL)
{
     rt_thread_startup(tid1);
}


       tid2= rt_thread_create("led",
                              led_thread_entry,
                              RT_NULL,
                              THREAD_STACK_SIZE,
                              THREAD_PRIORITY- 1,
                              THREAD_TIMESLICE);

if(tid2!= RT_NULL)
{
    rt_thread_startup(tid2);
}

2.LED线程

static void led_thread_entry(void *param)
{
       MX_GPIO_Init();
       while(1)
       {
              HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8, GPIO_PIN_RESET);
              rt_thread_mdelay(500);
              HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8, GPIO_PIN_SET);
              rt_thread_mdelay(500);
//            rt_kprintf("hello,ledn");
       }

}

3.IWDG线程

static void iwdg_thread_entry(void *param)
{
       MX_IWDG_Init();
       while(1)
       {
              HAL_IWDG_Refresh(&hiwdg);
              rt_kprintf("feediwdgn");
              rt_thread_mdelay(1000);
       }
}

注意计算iwdg的溢出时间,本文设置的溢出时间约为3.276s,预分频值为32,看门狗时钟为40kHz。

计算看门狗溢出时间:

1.方式一

分频后的频率:IWDG时钟/分频值 = 40KHz/32= 1.25KHz

溢出时间:设置的装填值/分频后的频率 = 4095/1.25KHz = 3276ms=3.276s

2.方式二

用户手册的公式给定公式,看门狗溢出时间:

Tout=((4×2^prer)×rlr)/40KHz。

其中Tout 为看门狗溢出时间(单位为ms),prer为看门狗时钟预分频值(IWDG_PR值),范围为0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值)。

我们在STM32CubeMX中设置分频值为32,相当(4×2^prer=32),prer = 3,rlr = 4095,故有

Tout=((4×2^prer) ×rlr) /40KHz =((4×2^3) ×4095) /40KHz = 3276ms。

其实也很好理解,看门狗定时器是一个递减的定时器,从给定的计算值递减到0时就会产生看门狗复位(如果不喂狗),我们设置的计数值4095,看门狗计一次数的时间为32/40kHz,故总时间就等于计数值*一次计数的时间。

四、下载验证

现象:

1.看门狗每1s喂一次狗。

图片

2.led灯以1Hz的频率闪烁。

图片

至此,RTT中的独立看门狗就讲解结束。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • MDK
    MDK
    +关注

    关注

    4

    文章

    208

    浏览量

    31770
  • 线程
    +关注

    关注

    0

    文章

    489

    浏览量

    19495
  • RT-Thread
    +关注

    关注

    31

    文章

    1148

    浏览量

    38875
  • stm32cubemx
    +关注

    关注

    5

    文章

    260

    浏览量

    14447
  • 独立看门狗
    +关注

    关注

    0

    文章

    23

    浏览量

    3649
收藏 人收藏

    评论

    相关推荐

    RT-Thread最新推出Nano极简版

    RT-Thread适时推出第一个RT-Thread Nano极简版,适用于家电、消费电子、医疗设备、工控等领域大量使用的32位ARM入门级MCU的场合,支持多任务处理、信号量和邮箱等相
    发表于 07-31 11:35 5170次阅读

    从安装到使用,RT-Thread Nano最全教程看完不信你还不会使用

    RT-Thread Nano发布以来,小编收到不少开发者询问RT-Thread Nano的配套教程实例,幸得RT-Thread开发者燕十三
    的头像 发表于 09-26 06:39 4.7w次阅读
    从安装到使用,<b class='flag-5'>RT-Thread</b> <b class='flag-5'>Nano</b>最全教程看完不信你还不会使用

    RT-Thread Nano 简介

    RT-Thread Nano 是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小,功能包括
    发表于 05-14 10:22

    独立看门狗的原理是什么?如何去使用独立看门狗

    为什么需要看门狗独立看门狗的原理是什么?独立看门狗的特点有哪些?如何去使用独立
    发表于 07-26 13:59

    怎样去搭建一种基于RT-Thread实时操作系统的STM32开发环境?

    怎样去搭建一种基于RT-Thread实时操作系统的STM32开发环境?怎样去搭建一种IWDT独立看门狗的环境?如何去编写IWDT
    发表于 07-27 07:19

    独立看门狗的使用

    0、独立看门狗的使用独立看门狗基于低速内部RC振荡器(LSI)运行。若LSI运行正常,当主程序发生错误时,无法重置看门狗计数器,
    发表于 08-02 10:31

    实现独立看门狗IWDT驱动

    实现独立看门狗IWDT驱动,创建喂狗线程,实现喂狗功能工程环境:stm32cubeIDE开发板:STM32 F103 ZET6最小系统仿真器:st-link V2cubeIDE 基于eclipse
    发表于 08-03 06:30

    如何利用stm32cubeIDE实现独立看门狗IWDT驱动,创建喂狗线程实现喂狗功能?

    如何利用stm32cubeIDE实现独立看门狗IWDT驱动,创建喂狗线程实现喂狗功能?
    发表于 10-12 08:35

    RT-Thread Nano的相关资料下载

    RT-Thread Nano入门学习笔记作者:Linkk更新时间:2021.02.17学习过程中使用的芯片:stm32f103c8t6库函数:标准库资料获取RT-Thread官网:ht
    发表于 12-09 06:59

    rt-thread是不是用了RTOS后都不需要看门狗

    rt-thread与其他的RTOS一样,官方的例程里都没有使用看门狗,是不是用了RTOS后都不需要看门狗啊?
    发表于 04-19 12:01

    RT-Thread中怎样使用看门狗才能让程序正常运行呢

    目前如果要在 rt-thread 中使用看门狗让程序正常运行,则需要在空线程中喂狗,或者单独起一个线程喂狗。但是这个的设计是否能胜任要求稍微高一点的产品呢?看门狗是确保软件质量的关键模块,狗叫是确保软件正常运行的兜底功能,这样的
    发表于 09-29 11:43

    RT-Thread Nano入门学习笔记

    RT-Thread Nano入门学习笔记
    发表于 11-26 12:36 20次下载
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>Nano</b><b class='flag-5'>入门</b>学习笔记

    基于 Keil MDK 移植 RT-Thread Nano

    本文介绍如何基于 Keil MDK 移植 RT-Thread Nano ,并以一个 stm32f103 的基础工程作为示例进行讲解。 RT-Thread Nano 已集成在 Keil
    发表于 01-26 17:04 16次下载
    基于 Keil MDK 移植 <b class='flag-5'>RT-Thread</b> <b class='flag-5'>Nano</b>

    如何创建RT-Thread Nano工程

    本文将尝试使用国产的嵌入式实时操作系统RT-Thread,相比较于FreeRTOS,RT-Thread还是有很多有点的,比如有Fish命令行界面,国产开源免费,Nano版本代码量极小,移植起来非常
    的头像 发表于 03-19 12:13 3287次阅读

    瑞萨e2studio----独立看门狗IWDT

    概述本篇文章主要介绍如何使用e2studio对瑞萨进行独立看门狗IWDT配置,并且配置RTC时钟产生1s的周期中断,通过串口打印查看独立看门狗
    的头像 发表于 11-26 17:18 1134次阅读
    瑞萨e2studio----<b class='flag-5'>独立</b><b class='flag-5'>看门狗</b><b class='flag-5'>IWDT</b>