【专题简介】(啰嗦,可跳过)
该专题暂不做深入研究,而是为路过的朋友指导开发的方向,或者告诉你该在哪里找到答案。需要咨询也可留言问我。
话说很久很久以前,我是用STM32平台,燃鹅自从跟外国友人关系破裂后STM32价格翻倍时不得不降级用51,经过三年多磨难其实也准备过上滋润的日子,结果没曾想,上了LLCC68模块后发现厂家都不提供51例程?可是“我想踢球啊”!于是上了NUVOTON的船,但是仍然无法顺利使用LLCC68,不得不低头参考厂家资料,于是接触到了雅特力的AT32F421芯片。就因为在看到雅特力的资料里面竟然提供了烧录器的程序,有点感动,这才是钻研技术该有的态度,于是决定吃一餐螃蟹。可能有人会觉得参照STM32就行了,其实差异很多,AT32F413可能可以兼容,但是F421比较难,我是按雅特力的BSP包的风格开发的。
【复位简介】
复位,最常见的应该是看门狗跑飞之后复位。但是很多时候程序在某些情况下需要软件执行复位,比如无线通信收发时,主机方要求客户机方重启,以便于同步时间戳之类,或者主机方强制要求客户机重启(就是喜欢这种霸道)。
AT32F421的复位方式据文件介绍有6种(不用再介绍了吧?),这里主要介绍2看门狗复位和软件复位。
1、看门狗复位
在AT32F421的BSP固件里面有,位置在
AT32F421_Firmware_Library_V2.1.2\project\at_start_f421\examples\wdt\wdt_reset\
以下截取部分源码,原理就是打开看门狗,设置个定时时间,一旦不喂狗就复位:
int main(void)
{
system_clock_config();
at32_board_init();
if(crm_flag_get(CRM_WDT_RESET_FLAG) != RESET)
{
/* reset from wdt */
crm_flag_clear(CRM_WDT_RESET_FLAG);
at32_led_on(LED4);
}
else
{
/* reset from other mode */
at32_led_off(LED4);
}
/* disable register write protection */
wdt_register_write_enable(TRUE);
/* set the wdt divider value */
wdt_divider_set(WDT_CLK_DIV_4);
/* set reload value
timeout = reload_value * (divider / lick_freq ) (s)
lick_freq = 40000 Hz
divider = 4
reload_value = 3000
timeout = 3000 * (4 / 40000 ) = 0.3s = 300ms
*/
wdt_reload_value_set(3000 - 1);
/* reload wdt counter */
wdt_counter_reload();
/* enable wdt */
wdt_enable();
while(1)
{
/* reload wdt counter */
wdt_counter_reload();
at32_led_toggle(LED3);
delay_ms(200);
if(at32_button_press() == USER_BUTTON)
{
while(1);
}
}
}
2、软件复位
软件复位厂家没有例程(或者仅仅因为我没有找到),经过摸索和到处找资料,发现在
AT32F421_Firmware_Library_V2.1.2\libraries\drivers\src\at32f421_misc.c
里面有个函数可以直接调用,一行代码搞定:
nvic_system_reset();
这个函数本质是调用了“NVIC_SystemReset()”,应该是M4内核标准的一种调用方法。
以上就是常见的2种软件形式的复位,介绍到这里结束,希望帮助了你。