本文主要介紹怎么用RT-Thread Nano實(shí)現(xiàn)獨(dú)立看門狗IWDT驅(qū)動(dòng),創(chuàng)建一個(gè)喂狗線程,實(shí)現(xiàn)定時(shí)喂狗功能。
一、準(zhǔn)備工作
1.硬件準(zhǔn)備:
STM32F103RCT6(本人使用正點(diǎn)原子的MINI板)
ST-LINK
USB轉(zhuǎn)TTL模塊
2.軟件準(zhǔn)備:
KEIL5 MDK
STM32CubeMX
二、使用STM32CubeMX生成MDK工程
使用STM32CubeMX創(chuàng)建STM32F103RBT6的對(duì)應(yīng)工程,配置時(shí)鐘源,使能GPIO、UART、IWDT,配置時(shí)鐘樹。
配置預(yù)覽效果,配置PA8引腳為推挽輸出,用于LED燈閃爍。
STM32F103RBT6的最大主頻為72M,配置PLL選擇外部時(shí)鐘。
生成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/。
主要分為以下幾個(gè)步驟:
- 注釋掉STM32CubeMX生成的PendSV,HardFault,SysTick。
- 將main.c中的板級(jí)初始化函數(shù),系統(tǒng)時(shí)鐘配置函數(shù)移到board.c中,替換RTT的配置。
- 移植FinSH,實(shí)現(xiàn)rt_hw_console_output()函數(shù)。
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();
}
三、編寫代碼
主要實(shí)現(xiàn)兩個(gè)功能,LED閃爍和IWDG喂狗。
- 在main函數(shù)中創(chuàng)建兩個(gè)線程。
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);
}
}
注意計(jì)算iwdg的溢出時(shí)間,本文設(shè)置的溢出時(shí)間約為3.276s,預(yù)分頻值為32,看門狗時(shí)鐘為40kHz。
計(jì)算看門狗溢出時(shí)間:
1.方式一
分頻后的頻率:IWDG時(shí)鐘/分頻值 = 40KHz/32= 1.25KHz
溢出時(shí)間:設(shè)置的裝填值/分頻后的頻率 = 4095/1.25KHz = 3276ms=3.276s
2.方式二
用戶手冊(cè)的公式給定公式,看門狗溢出時(shí)間:
Tout=((4×2^prer)×rlr)/40KHz。
其中Tout 為看門狗溢出時(shí)間(單位為ms),prer為看門狗時(shí)鐘預(yù)分頻值(IWDG_PR值),范圍為0~7;rlr 為看門狗的重裝載值(IWDG_RLR 的值)。
我們?cè)赟TM32CubeMX中設(shè)置分頻值為32,相當(dāng)(4×2^prer=32),prer = 3,rlr = 4095,故有
Tout=((4×2^prer) ×rlr) /40KHz =((4×2^3) ×4095) /40KHz = 3276ms。
其實(shí)也很好理解,看門狗定時(shí)器是一個(gè)遞減的定時(shí)器,從給定的計(jì)算值遞減到0時(shí)就會(huì)產(chǎn)生看門狗復(fù)位(如果不喂狗),我們?cè)O(shè)置的計(jì)數(shù)值4095,看門狗計(jì)一次數(shù)的時(shí)間為32/40kHz,故總時(shí)間就等于計(jì)數(shù)值*一次計(jì)數(shù)的時(shí)間。
四、下載驗(yàn)證
現(xiàn)象:
1.看門狗每1s喂一次狗。
2.led燈以1Hz的頻率閃爍。
至此,RTT中的獨(dú)立看門狗就講解結(jié)束。
-
MDK
+關(guān)注
關(guān)注
4文章
209瀏覽量
32063 -
線程
+關(guān)注
關(guān)注
0文章
504瀏覽量
19675 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1285瀏覽量
40079 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
283瀏覽量
14791 -
獨(dú)立看門狗
+關(guān)注
關(guān)注
0文章
24瀏覽量
3827
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論