本文主要介绍怎么用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/。
主要分为以下几个步骤:
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喂狗。
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中的独立看门狗就讲解结束。
全部0条评论
快来发表一下你的评论吧 !