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

描述

本文主要介绍怎么用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中的独立看门狗就讲解结束。

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分