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

qingtian506 2013-03-21 09:57:10
我现在做的这个项目是以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或其他,可通过读取寄存器的值来查看正确与否,如果发现错误就改正。

大家有这么写过的吗?还是有其他寄存器配置检测的方法呢?
先谢谢了。
...全文
246 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
john_liqinghan 2013-04-12
  • 打赏
  • 举报
回复
可以直接对寄存器操作,进行读 - 判断 - 写!
ymm198606 2013-04-09
  • 打赏
  • 举报
回复
1. 每隔一定时间对有可能被修改的寄存器进行校验一次,如读取结果与原先设定值不一致,重新设一遍该寄存器值;在程序运行过程中,寄存器值被修改掉的可能性不大,即使真有,可找厂家人员确认;
nandou 2013-03-31
  • 打赏
  • 举报
回复
引用 13 楼 qingtian506 的回复:
引用 12 楼 nandou 的回复:如果曾经这个片子没遇到过寄存器乱的(包括别人),建议不要想的太多, 不然你得判断所有的寄存器,如果只判断部分也是也会有意外出现的... 如果你实在是很怕,那就不管它变不变,直接定时写吧!(只要不影响他正常工作就行) C8051的片子有遇到过寄存器乱的情况(ADC配置在ADC输入端口加干扰信号时会乱),这个就需要定时判断设……
如果是这样的话你就读相应的配置寄存器,然后根据你的要求判断就是了,反正你也没法验证它的作用!
qingtian506 2013-03-26
  • 打赏
  • 举报
回复
引用 12 楼 nandou 的回复:
如果曾经这个片子没遇到过寄存器乱的(包括别人),建议不要想的太多, 不然你得判断所有的寄存器,如果只判断部分也是也会有意外出现的... 如果你实在是很怕,那就不管它变不变,直接定时写吧!(只要不影响他正常工作就行) C8051的片子有遇到过寄存器乱的情况(ADC配置在ADC输入端口加干扰信号时会乱),这个就需要定时判断设置位了。
我刚刚接触这行,没碰到过这种情况。是我们老大让的。
qingtian506 2013-03-22
  • 打赏
  • 举报
回复
引用 1 楼 mome11 的回复:
没有这么写过 首先,我理解的这个问题是你的运行程序存在BUG,能够‘一不小心’修改寄存器的值,至于你检测错误在修改又是另外一码事 我觉得从根本上解决问题要比采取补救措施更实际 抱歉没有帮到你
一样谢谢。
qingtian506 2013-03-22
  • 打赏
  • 举报
回复
引用 6 楼 lbing7 的回复:
什么情况下寄存器会被所谓的误改动??? 求解
额。。。我也不清楚哦! 就等有做过这方面检测的专家解答
qingtian506 2013-03-22
  • 打赏
  • 举报
回复
引用 7 楼 wsyk1984 的回复:
STM32里GPIO寄存器一共有7个,每个寄存器是4字节。 楼主所说的端口mode最终会被写到寄存器GPIOx_CRL(P0~P7)或者GPIOx_CRH(P8~P15)中, GPIO_InitStructure这个结构体只是为了配置GPIO口用的,和GPIO口的寄存器并没有一一对应的关系。 贴一下GPIO_InitStructure的定义。 C/C++ code……
恩,你说的和我现在做的这些是一样的。我就是根据库函数的GPIO_InitStructure里面的寄存器配置,一个一个来查的。如果有错误,就printf。 英雄所见略同啊,哈哈。 不过还是坐等看看有没有其他方法啊!
nandou 2013-03-22
  • 打赏
  • 举报
回复
如果曾经这个片子没遇到过寄存器乱的(包括别人),建议不要想的太多, 不然你得判断所有的寄存器,如果只判断部分也是也会有意外出现的... 如果你实在是很怕,那就不管它变不变,直接定时写吧!(只要不影响他正常工作就行) C8051的片子有遇到过寄存器乱的情况(ADC配置在ADC输入端口加干扰信号时会乱),这个就需要定时判断设置位了。
wsyk1984 2013-03-22
  • 打赏
  • 举报
回复
楼主用这个测试还解决不了问题吗?
默寞 2013-03-21
  • 打赏
  • 举报
回复
没有这么写过 首先,我理解的这个问题是你的运行程序存在BUG,能够‘一不小心’修改寄存器的值,至于你检测错误在修改又是另外一码事 我觉得从根本上解决问题要比采取补救措施更实际 抱歉没有帮到你
wsyk1984 2013-03-21
  • 打赏
  • 举报
回复
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);
    }
}
lbing7 2013-03-21
  • 打赏
  • 举报
回复
什么情况下寄存器会被所谓的误改动??? 求解
xueqingtan 2013-03-21
  • 打赏
  • 举报
回复
刚接触一点,也不是很清楚。坐等大牛~
qingtian506 2013-03-21
  • 打赏
  • 举报
回复
引用 2 楼 woshi_ziyu 的回复:
感觉没有必要 某些寄存器是只能写或者只读的 建议楼主可以看看调试部分的实现方法
不好意思,我对ARM还算菜鸟,想请问一下,“调试部分的实现方法”是指什么呢?可否列举一二?谢谢。
qingtian506 2013-03-21
  • 打赏
  • 举报
回复
引用 1 楼 mome11 的回复:
没有这么写过 首先,我理解的这个问题是你的运行程序存在BUG,能够‘一不小心’修改寄存器的值,至于你检测错误在修改又是另外一码事 我觉得从根本上解决问题要比采取补救措施更实际 抱歉没有帮到你
现在没有出现过“‘一不小心’修改寄存器的值”的bug。 但是也有可能会出现,这样子也得想办法查出来这个一不小心的情况,所以才上有了上述问题,也算是做个实时检错吧。 只是为了防止出现。是老大让做的。
woshi_ziyu 2013-03-21
  • 打赏
  • 举报
回复
感觉没有必要 某些寄存器是只能写或者只读的 建议楼主可以看看调试部分的实现方法
第1章ARM及Cortex-M3处理器概述 1.1ARM处理器系列 1.1.1命名规则 1.1.2ARM处理器系列 1.2ARMCortex-M3处理器 1.2.1处理器组件 1.2.2Cortex-M3的层次和实现选项 1.2.3处理器内核 1.2.4嵌套向量中断控制器(NVIC) 1.2.5总线矩阵 1.2.6集成调试 1.2.7可选组件 1.2.8Cortex-M3处理器应用 1.3ARMCortex-M3指令集 1.4ARMCortex-M3的优势 第2章STM32系列微控制器 2.1STM32系列微控制器简介 2.1.1STM32微控制器的主要优点 2.1.2STM32微控制器的应用 2.2STM32F101xx系列微控制器 2.2.1特点 2.2.2总体结构 2.3STM32F103xx系列微控制器 2.3.1特点 2.3.2总体结构 第3章STM32系列微控制器存储器与外设 3.1存储器和总线的结构 3.1.1系统结构 3.1.2存储器结构 3.1.3存储器映射 3.1.4启动配置 3.2电源控制 3.2.1电源供应 3.2.2电源供应管理 3.2.3低功耗模式 3.2.4电源控制寄存器 3.3复位和时钟控制 3.3.1复位 3.3.2时钟 3.3.3RCC寄存器描述 3.4通用I/O和复用I/O(GPIO和AFIO) 3.4.1GPIO功能描述 3.4.2GPIO寄存器描述 3.4.3复用功能I/O和调试配置(AFIO) 3.4.4AFIO寄存器描述 3.5中断和事件 3.5.1嵌套向量中断控制器(NVIC) 3.5.2外部中断/事件控制器(EXTI) 3.5.3EXTI寄存器 3.6DMA控制器 3.6.1简介 3.6.2主要特性 3.6.3功能描述 3.6.4DMA寄存器 3.7实时时钟(RTC) 3.7.1简介 3.7.2主要特性 3.7.3功能描述 3.7.4RTC寄存器描述 3.8备份寄存器(BKP) 3.8.1简介 3.8.2主要特性 3.8.3干扰检测 3.8.4RTC校验 3.8.5BKP寄存器描述 3.9独立的看门狗 3.9.1简介 3.9.2IWDG寄存器描述 3.10窗口看门狗(WWDG) 3.10.1简介 3.10.2主要特性 3.10.3功能描述 3.10.4如何编程看门狗的超时时间 3.10.5调试模式 3.10.6寄存器描述 3.11高级控制定时器 3.11.1简介 3.11.2主要特性 3.11.3框图 3.11.4功能描述 3.11.5TIMI寄存器描述 3.12通用定时器(TIMx) 3.12.1简介 3.12.2主要特性 3.12.3框图 3.12.4功能描述 3.12.5TIMx寄存器描述 3.13控制器局域网(bxCAN) 3.13.1简介 3.13.2主要特性 3.13.3总体描述 3.13.4运行模式 3.13.5功能描述 3.13.6中断 3.13.7寄存器访问保护 3.13.8CAN寄存器描述 3.14内部集成电路(I2C)接口 3.14.1简介 3.14.2主要特性 3.14.3总体描述 3.14.4功能描述 3.14.5中断请求 3.14.6I2C调试模式 3.14.7I2C寄存器描述 3.15串行外设接FI(SPI) 3.15.1简介 3.15.2主要特性 3.15.3功能描述 3.15.4SPI寄存器描述 3.16通用同步异步收发机(USART) 3.16.1简介 3.16.2主要特性 3.16.3总体描述 3.16.4中断请求 3.16.5USART寄存器描述 3.17USB全速设备接口 3.17.1概述 3.17.2主要特性 3.17.3结构框图 3.17.4功能描述 3.17.5编程中需要考虑的问题 3.17.6USB寄存器描述 3.18模/数转换器(ADC) 3.18.1概述 3.18.2主要特性 3.18.3引脚描述 3.18.4功能描述 3.18.5校准 3.18.6数据对齐 3.18.7基于通道的可编程的采样时间 3.18.8外部触发转换 3.18.9DMA请求 3.18.10双ADC模式 3.18.11温度传感器 3.18.12中断 3.18.13ADC寄存器描述 3.19调试支持(DBG) 3.19.1概述 3.19.2相关的ARM文档 3.19.3SWJ调试端口(串行线和JTAG) 3.19.4引脚分布和调试端口引脚 3.19.5STM32F10xJTAGTAP连接 3.19.6ID编码和锁定机制 3.19.7JTAG调试端口 3.19.8SW调试端口 第4章STM32固件库 4.1STM32固件库的定义规则 4.1.1固件库命名规则 4.1.2代码标准 4.2STM32库的层次结构 4.2.1固件包描述 4.2.2固件库文件描述 4.3STM32库的使用 第5章STM32系列微控制器开发工具与应用 5.1KeilMDK介绍 5.1.1开发过程及集成开发环境简介 5.1.2工程管理 5.1.3编写源程序 5.1.4编译程序 5.1.5调试程序 5.2IAREWARM介绍 5.2.1EWARM集成开发环境及配套仿真器 5.2.2在EWARM中生成一个新项目 5.2.3编译和链接应用程序 5.2.4用J-LINK调试应用程序 5.3STM32-SK仿真评估板 5.3.1评估板规格说明 5.3.2测试程序 5.3.3关于仿真评估板的几个问题 5.4STM32-DK开发板 5.4.1开发板规格说明 5.4.2开发板实例程序 5.4.3关于STARM的常见问题 5.5mx-Pro量产编程器使用简介 5.5.1编程文件管理 5.5.2芯片烧写 5.6应用实例:基于STM32的数据采集器 5.6.1硬件设计 5.6.2软件设计 参考文献

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧