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