本文主要介紹怎么用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/。
主要分為以下幾個步驟:
- 注釋掉STM32CubeMX生成的PendSV,HardFault,SysTick。
- 將main.c中的板級初始化函數,系統時鐘配置函數移到board.c中,替換RTT的配置。
- 移植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喂狗。
- 在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
+關注
關注
4文章
209瀏覽量
32105 -
線程
+關注
關注
0文章
505瀏覽量
19715 -
RT-Thread
+關注
關注
31文章
1300瀏覽量
40264 -
stm32cubemx
+關注
關注
5文章
283瀏覽量
14871 -
獨立看門狗
+關注
關注
0文章
24瀏覽量
3863
發布評論請先 登錄
相關推薦
評論