MyException - 我的异常网
当前位置:我的异常网» 单片机 » 基于ARM内核的STM32寄存器检测有人做过吗?解决方案

基于ARM内核的STM32寄存器检测有人做过吗?解决方案

www.MyException.Cn  网友分享于:2013-06-20  浏览:2次
基于ARM内核的STM32寄存器检测有人做过吗?
我现在做的这个项目是以STM32的库函数来编写的,现在做的这个模块程序是为了矫正寄存器配置在程序运行中发生错误时,可以自动改正。如:


 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
 GPIO_Init(GPIOE, &GPIO_InitStructure);


其中比如说程序在运行时,将GPIO_Mode一不小心改成了GPIO_Mode_IPD或其他,可通过读取寄存器的值来查看正确与否,如果发现错误就改正。

大家有这么写过的吗?还是有其他寄存器配置检测的方法呢?
先谢谢了。

------解决方案--------------------
没有这么写过
首先,我理解的这个问题是你的运行程序存在BUG,能够‘一不小心’修改寄存器的值,至于你检测错误在修改又是另外一码事
我觉得从根本上解决问题要比采取补救措施更实际
抱歉没有帮到你
------解决方案--------------------
感觉没有必要

某些寄存器是只能写或者只读的 

建议楼主可以看看调试部分的实现方法
------解决方案--------------------
刚接触一点,也不是很清楚。坐等大牛~
------解决方案--------------------
什么情况下寄存器会被所谓的误改动???

求解
------解决方案--------------------
STM32里GPIO寄存器一共有7个,每个寄存器是4字节。
楼主所说的端口mode最终会被写到寄存器GPIOx_CRL(P0~P7)或者GPIOx_CRH(P8~P15)中,
GPIO_InitStructure这个结构体只是为了配置GPIO口用的,和GPIO口的寄存器并没有一一对应的关系。
贴一下GPIO_InitStructure的定义。

typedef struct
{
  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.
                                      This parameter can be any value of @ref GPIO_pins_define */

  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.
                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */

  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.
                                      This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;

    GPIO_Pin这个变量是为了批量配置GPIO用的,比如说P1和P2有相同的速度和模式,就可以把GPIO_Pin的bit1和bit2置1,P1和P2就会在一次配置中完成。
    可以说要配置一次GPIO口,就会定义一个GPIO_InitStructure变量,我再配置一次GPIO口变量就会再定义一个GPIO_InitStructure变量。
    楼主说的这个保护是很难通过GPIO_Mode实现的。必须建立和STM32的GPIO口一一对应的数据结构才行。
楼主可以试试在主程序循环里调用这个,理论上不改变GPIO口配置情况只会打印一次。

void GPIO_protect(void)
{
    static int preCRL = 0;

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有