单片机异常复位后如何保存变量数据


目录

1、理论

2、实践


1、理论

众所周知,单片机复位后变量数值会自动初始化,以华大半导体HC32L136为例,具有 7 个复位信号来源,每个复位信号都可以让 CPU 重新运行,绝大多数寄存器会被复位到复位值,程序会从复位向量处开始执行。

  • 数字区域上电掉电复位 POR
  • 外部 Reset PAD,低电平为复位信号
  • WDT 复位
  • PCA 复位
  • LVD 低电压复位
  • Cortex-M0+ SYSRESETREQ 软件复位
  • Cortex-M0+ LOCKUP 硬件复位

每个复位源由相应的复位标志进行指示,复位标志均由硬件置位,需要用户软件清零。

华大半导体各区域的复位来源如下图所示:

本篇博客主要讲授华大半导(STM32、C51等单片机均可适用)复位(以看门狗复位为例)后变量数据保存的方法。

这里将用到__not_init属性,其用于变量声明,可禁止系统启动时变量的初始化,有了__not_init属性,编译器只给指定变量分配空间,不会再初始化。

__not_init的两种定义方式如下所示:

 
  1. 方式1:不指定存储位置,由编译器分配

  2. __no_init 类型 变量名; ///< 例如:__no_init uint8_t cou_num;

  3. 方式2:指定存储位置

  4. __no_init 类型 变量名 @地址; ///< 例如:__no_init uint8_t cou_num @0x20000000;

2、实践

实践描述:使用__no_init属性创建一个变量cou_num,其将数据存储在SRAM中,每隔300毫秒自加1并通过串口打印输出数值,当检测到上电复位和按键复位后,变量cou_num数值置为0,在看门狗复位下变量cou_num数值不变。

第1步:配置串口引脚、串口使能和串口中断,代码如下所示:

 
  1. ///< 串口引脚配置

  2. static void App_PortInit(void)

  3. {

  4. stc_gpio_cfg_t stcGpioCfg;

  5. DDL_ZERO_STRUCT(stcGpioCfg);

  6. ///< 使能GPIO模块时钟

  7. Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);

  8. ///< 配置PA02端口为URART1_TX

  9. stcGpioCfg.enDir = GpioDirOut;

  10. Gpio_Init(GpioPortA, GpioPin2, &stcGpioCfg);

  11. Gpio_SetAfMode(GpioPortA, GpioPin2, GpioAf1);

  12. }

  13. ///< 串口配置

  14. static void App_UartCfg(void)

  15. {

  16. stc_uart_cfg_t stcCfg;

  17. DDL_ZERO_STRUCT(stcCfg);

  18. ///< 开启UART1外设时钟

  19. Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);

  20. ///< UART1初始化

  21. stcCfg.enRunMode = UartMskMode3; ///< 模式3

  22. stcCfg.enStopBit = UartMsk1bit; ///< 1bit停止位

  23. stcCfg.enMmdorCk = UartMskEven; ///< 偶检验

  24. stcCfg.stcBaud.u32Baud = 9600; ///< 波特率9600 注意误差

  25. stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; ///< 通道采样分频配置

  26. stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); ///< 获得外设时钟(PCLK)频率值

  27. Uart_Init(M0P_UART1, &stcCfg); ///< 串口初始化

  28. ///< UART1中断使能

  29. Uart_ClrStatus(M0P_UART1,UartTC); ///< 清发送请求

  30. Uart_EnableIrq(M0P_UART1,UartTxIrq); ///< 使能串口发送中断

  31. EnableNvic(UART1_IRQn, IrqLevel3, TRUE); ///< 系统中断使能

  32. }

  33. ///< UART1中断函数

  34. void Uart1_IRQHandler(void)

  35. {

  36. ///< UART1数据发送

  37. if(Uart_GetStatus(M0P_UART1, UartTC))

  38. {

  39. ///< 清中断状态位

  40. Uart_ClrStatus(M0P_UART1, UartTC);

  41. }

  42. }

。。。。。。。。。。。。。。。。。

版权原因,完整文章,请参考如下:单片机异常复位后如何保存变量数据

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值