0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于STM32CubeIDE的调试配置

茶话MCU 来源:茶话MCU 作者:茶话MCU 2022-10-08 10:01 次阅读

有人使用STM32芯片从事产品开发,代码中有涉及到除以0操作。他们发现基于相同的代码,使用不同IDE会出现不同结果。在IAR或ARM MDK环境下除以0操作所得结果为0,而在STM32CubeIDE环境下的运行时则产生HardFault异常。他们对这个结果感觉很奇怪,甚至怀疑是不是CubeIDE环境有bug。

根据ARM内核相关手册描述,关于除以0事件或非对齐访问事件是否进行捕捉并触发异常是可以配置的。如下图所示:

77fa8d4e-4609-11ed-96c9-dac502259ad0.png

其中,除以0事件由内核的配置控制寄存器CCR的DIV_0_TRP控制。该位清0时,系统不对除以0事件触发异常,结合下面截图描述得知,此时硬性返回0值作为结果。

78270e14-4609-11ed-96c9-dac502259ad0.png

也就是说,只有控制位配置为1并发生除以0事件时才触发异常。另外,上图最后一句明确说明,复位后该位值为0.

结合客户的描述,感觉在ARM MDK和IAR环境下,该位默认值或者说复位值为0,而STM32CubeIDE环境下该位复位默认值则为1。这似乎有点说不通。因为这个默认复位值应该是跟着内核芯片走,不会跟着开发环境走。【用户代码一样】

我随手找个STM32开放板,先基于IAR环境做了个测试。在测试代码里制造了除以0事件,的确没有触发异常,而且还返回了结果0。查看IAR开发环境下了SCB->CCR->DIV_0_TRP控制位,如下图所示,其值为0。结合内核资料描述,这点跟测试结果吻合。

785fe806-4609-11ed-96c9-dac502259ad0.png

我尝试将该控制位改为1后再运行除以0代码,立即触发异常。如下图所示:

78d129f8-4609-11ed-96c9-dac502259ad0.png

当我将测试代码转到CubeIDE去调试,也马上触发异常,并明确提示发生除以0事件。

79974d36-4609-11ed-96c9-dac502259ad0.png

顺便在SFR寄存器里查看SCB->CCR->DIV_0_TRP位的值,果真是1,见下图:

7a49c754-4609-11ed-96c9-dac502259ad0.png

我在用户代码里并未对该控制位进行改写,按理其复位值应该是0。难道哪里改写它了?

我尝试到STM32CubeIDE的用户手册UM2609找找,看看能否找到相关信息。在里面搜索DIV_0还真找到相关信息了。

7e8be52c-4609-11ed-96c9-dac502259ad0.png

这里的文字表明,调试状态下关于除以0事件的异常捕获是默认使能的,目的是为了帮助用户在调试时及时发现除以0异常。这个说法没毛病,问题是在哪里对其使能置位的呢?ARM内核复位后可是清零了的。

继续查找相关信息,看到了该段文字上方有个截图,如下图所示:

7ee56ca0-4609-11ed-96c9-dac502259ad0.png

从上图可以看出,关于除以0操作或非对齐访问是否触发异常,这里可以选择配置。在STM32CubeIDE调试状态下,除以0操作的异常捕获默认被使能,基于该配置并在工程启动时借助调试部件修改了相关寄存器。

当我把这个地方取消勾选后,使用前面相同代码做验证调试,此时不再触发异常并返回0值结果。到此,也就解释了发生除以0操作时,为什么STM32CubeIDE会出现与MDK、IAR不同的调试结果。

显然,STM32CubeIDE默认调试状态下使能除以0事件的捕获,这样的确便于我们在调试时就能及时发现除以0事件,若是不该出现的,赶紧查错纠错,避免其发生。如果是允许出现的特别应用场景,调试时可以通过CubeIDE配置关闭其异常捕获。

相比其它IDE,STM32CubeIDE在这个地方显得更为方便些。我们只需基于调试环境做简单的勾选即完成修改,每次程序启动时即生效,在IAR、ARM MDK环境下往往需要事先添加用户代码修改SCB->CCR寄存器内容。

讲到这里,我要特别提醒下,对于除以0事件或对齐事件的捕获与否,最终取决于用户代码。

STM32CubeIDE只是在调试状态下根据配置修改了相关控制寄存器位,不等于用户代码对其做了修改。

前面提过,除以0事件相关寄存器控制位复位后默认值为0,即默认不触发除以0异常。如果说CubeIDE的调试配置跟其芯片复位后默认值一致倒没什么,如果CubeIDE里的调试配置是使能除以0异常的捕获,而在用户代码里却没有相应实现代码,这时代码运行若有除以0事件,调试时自然可以发现,但全速运行时还是不会触发异常【此时代码运行脱离了调试组件】。所以,要保证全速运行时也能对除以0事件进行异常捕获,我们终究还得在用户代码里对SCB->CCR寄存器的DIV_0_TRP位进行置位。

STM32CubeIDE这里的调试配置为我们提供了方便,同时个人认为其默认的调试配置也是合理的,毕竟并非所有人都知道芯片复位后默认除以0事件不触发异常,当然,一般来讲编译时会有警告。

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    447

    文章

    47788

    浏览量

    409123
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117721
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348743

原文标题:关于除以0异常捕获的配置话题

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32CubeIDE入门教程 STM32CubeIDE安装使用教程

    STM32CubeIDE是一个高级C / C ++开发平台,具有用于STM32微控制器和微处理器的外设配置,代码生成,代码编译和调试功能。它基于Eclipse® / CDT框架和GCC
    的头像 发表于 06-08 09:19 7516次阅读
    <b class='flag-5'>STM32CubeIDE</b>入门教程 <b class='flag-5'>STM32CubeIDE</b>安装使用教程

    STM32CubeIDE软件实现STM32外部中断实例

    本文用STM32CubeIDE软件实现STM32外部中断实例。
    的头像 发表于 08-24 09:09 3831次阅读

    STM32CubeIDE为什么无法进行调试

    STM32CubeIDE为什么无法进行调试STM32使用CubeMAX配置的串口中断接收方法是什么?
    发表于 09-28 07:16

    STM32CubeIDE SWV功能介绍

    01 引言 STM32CubeIDE是ST官方推出的集成开发环境,集成了很多STM32调试与开发工具。本文主要介绍如何使用SWV功能来打印输出。 02 问题描述 客户使用STM32CubeI
    的头像 发表于 10-13 14:20 3232次阅读
    <b class='flag-5'>STM32CubeIDE</b> SWV功能介绍

    STM32CubeIDE使用

    参考STM32CubeIDE属于一站式工具,本文带你体验它的强大第一个STM32CubeIDE项目STM32CubeIDE使用记录STM32CubeIDE使用笔记(03):使用ST-L
    发表于 12-02 17:21 26次下载
    <b class='flag-5'>STM32CubeIDE</b>使用

    STM32CubeIDE初识

    STM32CubeIDE初识
    发表于 12-02 18:36 23次下载
    <b class='flag-5'>STM32CubeIDE</b>初识

    STM32CubeIDE安装-NSIS Error问题

    STM32CubeIDE安装-NSIS Error问题
    发表于 12-03 21:06 17次下载
    <b class='flag-5'>STM32CubeIDE</b>安装-NSIS Error问题

    第一个STM32CubeIDE项目

    使用STM32CubeIDE的第一个项目开始第一个项目添加代码今天开始做一个STM32CubeIDE的第一个项目,首先需要说明的:STM32CubeIDE是一个免费的软件开始第一个项目在文件菜单中选
    发表于 12-29 19:29 8次下载
    第一个<b class='flag-5'>STM32CubeIDE</b>项目

    STM32CubeIDE所支持的几个调试小工具及功能

    意法半导体ST公司为广大STM32用户免费提供了基于GCC的功能强大集成调试工具STM32CubeIDE。这里简单演示下STM32CubeIDE所支持的几个
    的头像 发表于 07-11 09:59 2364次阅读

    AN5394_STM32L5系列在STM32CubeIDE中的项目入门

    AN5394_STM32L5系列在STM32CubeIDE中的项目入门
    发表于 11-21 08:11 1次下载
    AN5394_<b class='flag-5'>STM32</b>L5系列在<b class='flag-5'>STM32CubeIDE</b>中的项目入门

    STM32CUBEIDE(1)----安装

    概述 STM32CubeIDE是一体式多操作系统开发工具,是STM32Cube软件生态系统的一部分。 STM32CubeIDE是一种高级C/C++开发平台,具有STM32微控制器和微处
    的头像 发表于 11-22 09:52 857次阅读
    <b class='flag-5'>STM32CUBEIDE</b>(1)----安装

    STM32CubeIDE安装指南

    电子发烧友网站提供《STM32CubeIDE安装指南.pdf》资料免费下载
    发表于 08-01 15:44 3次下载
    <b class='flag-5'>STM32CubeIDE</b>安装指南

    巧用 STM32CubeIDE 之编译警告

    巧用 STM32CubeIDE 之编译警告
    的头像 发表于 10-25 16:33 555次阅读
    巧用 <b class='flag-5'>STM32CubeIDE</b> 之编译警告

    STM32CubeIDE实用技巧之配置Heap空间

    STM32CubeIDE实用技巧之配置Heap空间
    的头像 发表于 10-31 17:30 723次阅读
    <b class='flag-5'>STM32CubeIDE</b>实用技巧之<b class='flag-5'>配置</b>Heap空间

    STM32CubeIDE实用技巧之配置堆空间

    电子发烧友网站提供《STM32CubeIDE实用技巧之配置堆空间.pdf》资料免费下载
    发表于 09-19 15:07 2次下载
    <b class='flag-5'>STM32CubeIDE</b>实用技巧之<b class='flag-5'>配置</b>堆空间