完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
工程师朋友在做产品的时候,有些特殊的场合对单片机有重启(复位)的需要,以达到保证产品的功能可以正常的实现。重启可以通过硬件和软件两种方法来实现。对于华大单片机大家都知道硬件的重启,只要把RESET引脚给一个20us以上的低电平,再拉高就可以实现,或者直接断电单片机的供电重新上电, 也可以实现单片机的重新运行。可以看出来,硬件的重启需要手工操作来实现,或者搭配额外的电路来实现,硬件操作相对来说不是很方便。软件重启只要通过在程序中写入相应的代码,当条件发生的时候单片机就可以自动完成重启的动作,这样相对来说会方便很多。本篇文章就介绍下如何用软件的方法来实现华大单片机的重启。 以华大单片机HC32L136为例,我们看其用户手册会发现,该产品的复位方式介绍如下: 本产品具有 7 个复位信号来源,每个复位信号都可以让 CPU 重新运行,绝大多数寄存器会被复位到复位值,程序会从复位向量处开始执行。
看到介绍我们用明白了如果用寄存器操作的方法来实现只要使用下面的代码就可以: SCB->AIRCR = 0X05FA0004; while(1){ _NOP();}12345代码中在操作AIRCR寄存器后面加入的死循环的目的是等待作用,等待单片机完成复位,而不要再去做其它的工作。 其实SYSRESETREQ 软件复位的代码,在ARM的内核代码中已经为大家提供了,大家在使用的时候只在调用就可以。在core_cm0plus.h文件中相关的代码如下 : #define NVIC_SystemReset __NVIC_SystemReset/** brief System Reset details Initiates a system reset request to reset the MCU. */__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void){ __DSB(); /* Ensure all outstanding memory accesses included buffered write are completed before reset */ SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | SCB_AIRCR_SYSRESETREQ_Msk); __DSB(); /* Ensure completion of memory access */ for(;;) /* wait until reset */ { __NOP(); }}12345678910111213141516171819由上面的代码可以知道,我们在自己的程序中果要想实现SYSRESETREQ 软件复位软件复位的话只要如下的代码就可以实现: NVIC_SystemReset(); |
|
|
|
只有小组成员才能发言,加入小组>>
2513 浏览 0 评论
1083浏览 2评论
700浏览 1评论
452浏览 0评论
193浏览 0评论
329浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 06:07 , Processed in 1.130778 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号