首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

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

2013-06-19 
基于ARM内核的STM32寄存器检测有人做过吗?我现在做的这个项目是以STM32的库函数来编写的,现在做的这个模块

基于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;


    static int preCRH = 0;

    GPIO_TypeDef* pGPIOx = GPIOC;

    if(pGPIOx->CRL != preCRL)
    {
        preCRL = pGPIOx->CRL;
        printf("GPIOx_CRL changed, %x -> %x\r\n", preCRL, pGPIOx->CRL);
    }

    if(pGPIOx->CRH != preCRH)
    {
        preCRH = pGPIOx->CRH;
        printf("GPIOx_CRH changed, %x -> %x\r\n", preCRH, pGPIOx->CRH);
    }
}




[解决办法]
如果曾经这个片子没遇到过寄存器乱的(包括别人),建议不要想的太多,
不然你得判断所有的寄存器,如果只判断部分也是也会有意外出现的...

如果你实在是很怕,那就不管它变不变,直接定时写吧!(只要不影响他正常工作就行)

C8051的片子有遇到过寄存器乱的情况(ADC配置在ADC输入端口加干扰信号时会乱),这个就需要定时判断设置位了。

[解决办法]
引用:
引用:如果曾经这个片子没遇到过寄存器乱的(包括别人),建议不要想的太多,
不然你得判断所有的寄存器,如果只判断部分也是也会有意外出现的...

如果你实在是很怕,那就不管它变不变,直接定时写吧!(只要不影响他正常工作就行)

C8051的片子有遇到过寄存器乱的情况(ADC配置在ADC输入端口加干扰信号时会乱),这个就需要定时判断设……


如果是这样的话你就读相应的配置寄存器,然后根据你的要求判断就是了,反正你也没法验证它的作用!
[解决办法]
1. 每隔一定时间对有可能被修改的寄存器进行校验一次,如读取结果与原先设定值不一致,重新设一遍该寄存器值;在程序运行过程中,寄存器值被修改掉的可能性不大,即使真有,可找厂家人员确认;
[解决办法]
可以直接对寄存器操作,进行读 - 判断 - 写!

热点排行