rt_thread hc32f460开发五:wdt驱动移植

这篇博客介绍了STM32看门狗驱动的基本结构,包括wdt_init和wdt_control函数,以及HC32F460看门狗的时钟配置和计数器设置。在100MHz的处理器速度下,通过调整分频系数和计数器数值,可以实现约335ms的超时时间。驱动添加和使用步骤包括添加驱动文件、修改编译脚本、初始化和启动看门狗以及在主循环中喂狗。提供了HC32F460的相关开发资料链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看门狗驱动的代码结构和原理

参考STM32的看门狗驱动,RT-Thread中的看门狗驱动主要有两个函数组成wdt_init和wdt_control。 其中wdt_init提供看门狗初始化,主要就是初始化看门狗依赖的时钟,不过看门狗的功能比较简单,init函数一般空置。wdt_control根据命令字提供喂狗、设置超时时间、获取超时时间、启动看门狗的功能。由于大部分的处理器对于看门狗的设置是一次性的,因此大多数工作再start的时候一次做完就OK了。

hc32f460看门狗的时钟来自PLCK3,根据自己的频率设置分频系数和计数器的数值就可以了。hc32f60的计数器是16bit的,所以把看门狗的时钟分频道xKHZ的级别,一般就可以提供几十毫秒至几秒钟的时间。

我们的项目中处理器运行在100MHZ,PLCK3对应为25M,分频2048,计数器4096,大约提供335ms的超时时间。

驱动添加和使用方法

1、把驱动文件drv_wdt.c放入drivers目录

2、修改drivers/SConscript增加将wdt驱动加入编译

3、代码中查找名为wdt的看门狗设备,并试用rt_device_control的函数初始化并启动看门狗

4、主循环中不停的喂狗,不喂会复位的

开发资料

HC32F460用户手册

https://www.hdsc.com.cn/cn/Index/downloadFile/modelid/65/id/47/key/0

HC32F460数据手册

https://www.hdsc.com.cn/cn/Index/downloadFile/modelid/65/id/46/key/0

HC32F460驱动库

https://www.hdsc.com.cn/cn/Index/downloadFile/modelid/66/id/57/key/9

HC32F460驱动库帮助

https://www.hdsc.com.cn/cn/Index/downloadFile/modelid/66/id/57/key/8

HC32F460IDE支持包

https://www.hdsc.com.cn/cn/Index/downloadFile/modelid/66/id/58/key/2

### 配置HC32F460单片机RTC功能 #### RTC初始化设置 为了使RTC正常工作,在基于RT-Thread操作系统的环境下,需先完成基本的硬件与时钟源配置。对于HC32F460而言,如果遇到RTC停止计数的情况,可能是因为外部时钟源被禁用所致[^1]。 ```c void rtc_init(void) { /* 启用RTC模块 */ CRG_PeripClockCmd(CRG_PERIPH_RTC, ENABLE); /* 设置RTC预分频器值 */ RTC_SetPrescaler(32767); // 假设使用低速内部RC振荡器作为RTC时钟源 /* 初始化并启动RTC */ RTC_InitTypeDef RTC_InitStruct; RTC_StructInit(&RTC_InitStruct); RTC_Init(&RTC_InitStruct); /* 更新当前时间 */ RTC_DateTypeDef sDate; RTC_TimeTypeDef sTime; sDate.WkDay = RTC_WEEKDAY_MONDAY; sDate.Month = RTC_MONTH_JANUARY; sDate.Date = 1; sDate.Year = 0; sTime.Hours = 0; sTime.Minutes = 0; sTime.Seconds = 0; RTC_SetDate(RTC_FORMAT_BIN, &sDate); RTC_SetTime(RTC_FORMAT_BIN, &sTime); } ``` #### 时间读取函数实现 当需要获取当前的时间信息时,可通过定义特定接口来访问RTC寄存器中的数据,并将其转换成易于理解的形式输出到控制台或其他显示设备上。这里给出一段用于读取时间和日期的例子: ```c #include <stdio.h> #include "hc32f4xx_rtc.h" char* get_current_time_string() { static char time_str[20]; RTC_DateTypeDef date; RTC_TimeTypeDef time; RTC_GetDate(RTC_FORMAT_BIN, &date); RTC_GetTime(RTC_FORMAT_BIN, &time); sprintf(time_str, "%04d-%02d-%02dT%02d:%02d:%02d", ((uint16_t)(date.Year)+2000), (uint8_t)date.Month, (uint8_t)date.Date, (uint8_t)time.Hours, (uint8_t)time.Minutes, (uint8_t)time.Seconds); return time_str; } // 打印时间字符串至串口或调试终端 printf("Current Time: %s\n",get_current_time_string()); ``` 此部分逻辑类似于通过STM32平台下的DS1302芯片获取时间的方式[^2],不过具体API调用会有所不同,因为这里是针对HC32F460内置RTC的操作。 #### 调整系统时钟配置 考虑到不同应用场景下对外部晶振的需求差异较大,因此有必要调整默认的系统时钟参数以适应实际需求。下面展示了如何修改`SystemClock_Config()`函数内的PLL设定,从而改变CPU运行频率的同时不影响RTC的工作状态[^3]。 ```c static void SystemClock_Config(void) { ... /* 主PLL(MPLL)配置 */ stcMpllInit.PLLCFGR_f.PLLM = 3UL - 1UL; // 输入除法因子=3 stcMpllInit.PLLCFGR_f.PLLN = 100UL - 1UL; // 反馈乘法因子=100 stcMpllInit.PLLCFGR_f.PLLP = 2UL - 1UL; // 输出除法因子(P)=2 stcMpllInit.PLLCFGR_f.PLLQ = 2UL - 1UL; // 输出除法因子(Q)=2 stcMpllInit.PLLCFGR_f.PLLR = 2UL - 1UL; // 输出除法因子(R)=2 ... } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值