关于调试STM32F030系列单片机遇到的硬件错误中断问题

news2024/11/6 3:31:56

一.问题环境

最近在调试STM32F030K6单片机,用的STM32F0xx_StdPeriph_Lib_V1.5.0标准外设固件库。搭建了BSP+SYSTEM+HARDWARE+APP框架,同样的框架在STM32F103单片机及其BSP下,APP正常流畅运行,可更换为配置好的STM32F030K6的BSP及单片机板后,总是出现各种各样的问题。具体问题如下:

二.问题现象

  • 1.程序没有进入while循环就卡死,跑飞,进入硬件错误中断(HardFault_Handler)。

    • 开启仿真调试,发现程序卡在含有结构体变量的初始化部分。结构体通过传递指针地址作为参数,并传递给HARDWARE层

    • 在进入HARDWARE的函数后,将结构体指针的BSP配置部分继续传递给BSP的时候,还没有进入BSP层的函数的调用前,程序就跑飞了。进入了硬件错误中断。

    • 单片机采用8MHz的外部晶振,并通过采用6倍频的方式,使时钟频率达到48MHz,并且配置FLASH_SetLatency(FLASH_Latency_1)仍没有效果。

  • 2.将APP的结构体包含的成员结构体变量调下位置,可以运行到下一个语句,但仍然卡死。

    • APP的HARDWARE结构体成员定义方式由变量改为指针,并为每个HARDWARE结构体单独创建实例,把其地址传给APP的HARDWARE结构体成员指针。
    • 能够进入while循环。
    • 当运行while循环到达一定周期后,再次跑飞卡死,进入HardFault_Handler
    • 发现问题仍然是访问了结构体某个成员造成错误

三.原因分析

  • 通过以上的结构体问题,我发现问题多半是由于结构体的大小不确定造成的。而结构体的大小通常由其对齐方式决定。

  • 编译器通常对结构体按默认的4字节对齐,并填充相应的字节。

  • 结构体的对齐是指在内存中为结构体的成员分配存储位置时,按照特定规则调整其地址,以确保每个成员都在满足其对齐要求的地址上。这种对齐要求通常基于数据类型的大小。例如:

    • char 类型的对齐为 1 字节
    • short 类型的对齐为 2 字节
    • intfloat 类型的对齐为 4 字节
    • double 类型的对齐为 8 字节
  • 为什么使用F0系列的单片机,需要对结构体进行单字节对齐

F0系列的单片机可能会对内存访问有更严格的对齐要求,尤其是在访问某些外设寄存器或特定内存区域时。如果结构体中的数据成员没有按照其对齐要求存放,可能会导致以下问题:

  • 硬件异常:某些寄存器在读取时,如果地址未对齐,可能导致硬件异常,甚至系统崩溃。
  • 性能影响:未对齐访问可能导致CPU执行多次内存读取操作,降低性能。

因此,在F0系列中,为了确保数据访问的正确性和高效性,通常需要对结构体进行单字节对齐。

  • 为什么使用F1系列的单片机,同样的程序没有跑飞呢?

F1系列的单片机对内存访问的要求可能较为宽松,允许未对齐访问,因此在相同的程序中,虽然结构体未严格遵循对齐规则,仍能正常运行。原因可能包括:

  • 容忍度更高:F1系列的处理器可能对未对齐访问有更好的容错能力,能在一定程度上自动处理未对齐的数据访问。
  • 软件优化:可能在编译器或程序设计上进行了优化,能够避免因未对齐访问导致的问题。

四.问题解决

  • 对所有结构体进行单字节对齐。

    结构体代码统一加入:

    #pragma pack(1)							//1字节对齐
    #pragma anon_unions						//开启匿名结构、联合
    
    union Frame 
    {
        uint32_t buf[FRAME_BUF_SIZE];
        struct 
        {
            uint8_t head;
            uint8_t length;
            uint8_t cmd;
            uint8_t data[FRAME_BUF_SIZE - 4];
            uint8_t check;
        };
    };
    
    #pragma no_anon_unions					//关闭匿名结构、联合
    #pragma pack()							//取消字节对齐
    
  • 加入对齐后,程序稳定运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2234023.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

源鲁杯 2024 web(部分)

[Round 1] Disal F12查看: f1ag_is_here.php 又F12可以发现图片提到了robots 访问robots.txt 得到flag.php<?php show_source(__FILE__); include("flag_is_so_beautiful.php"); $a$_POST[a]; $keypreg_match(/[a-zA-Z]{6}/,$a); $b$_REQUEST[b];if($a>99999…

【ArcGIS】绘制各省碳排放分布的中国地图

首先&#xff0c;准备好各省、自治区、直辖市及特别行政区&#xff08;包括九段线&#xff09;的shp文件&#xff1a; 通过百度网盘分享的文件&#xff1a;GS&#xff08;2022&#xff09;1873 链接&#xff1a;https://pan.baidu.com/s/1wq8-XM99LXG_P8q-jNgPJA 提取码&#…

C++《list的模拟实现》

在上一篇C《list》专题当中我们了解了STL当中list类当中的各个成员函数该如何使用&#xff0c;接下来在本篇当中我们将试着模拟实现list&#xff0c;在本篇当中我们将通过模拟实现list过程中深入理解list迭代器和之前学习的vector和string迭代器的不同&#xff0c;接下来就开始…

讲讲⾼可用的原则?

大家好&#xff0c;我是锋哥。今天分享关于【讲讲⾼可用的原则&#xff1f;】面试题。希望对大家有帮助&#xff1b; 讲讲⾼可用的原则&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在当今信息化时代&#xff0c;随着互联网技术的快速发展&#xff0…

003-Kotlin界面开发之声明式编程范式

概念本源 在界面程序开发中&#xff0c;有两个非常典型的编程范式&#xff1a;命令式编程和声明式编程。命令式编程是指通过编写一系列命令来描述程序的运行逻辑&#xff0c;而声明式编程则是通过编写一系列声明来描述程序的状态。在命令式编程中&#xff0c;程序员需要关心程…

Ubuntu 20.04 部署向量数据库 Milvus + Attu

前言 最开始在自己的办公电脑&#xff08;无显卡的 windows 10 系统&#xff09; 上使用 Docker Desktop 部署了 Milvus 容器&#xff0c;方便的很&#xff0c; 下载 Attu 也很方便&#xff0c;直接就把这个向量数据库通过 Attu 这个图形化界面跑了起来&#xff0c;使用起来感…

Linux(inode + 软硬链接 图片+大白话)

后面也会持续更新&#xff0c;学到新东西会在其中补充。 建议按顺序食用&#xff0c;欢迎批评或者交流&#xff01; 缺什么东西欢迎评论&#xff01;我都会及时修改的&#xff01; 在这里真的很感谢这位老师的教学视频让迷茫的我找到了很好的学习视频 王晓春老师的个人空间…

CM API方式设置YARN队列资源

简述 对于CDH版本我们可以参考Fayson的文章,本次是CDP7.1.7 CM7.4.4 ,下面只演示一个设置队列容量百分比的示例,其他请参考cloudera官网。 获取cookies文件 生成cookies.txt文件 curl -i -k -v -c cookies.txt -u admin:admin http://192.168.242.100:7180/api/v44/clusters …

【Linux】简易版shell

文章目录 shell的基本框架PrintCommandLineGetCommandLineParseCommandLineExecuteCommandInitEnvCheckAndExecBuildCommand代码总览运行效果总结 shell的基本框架 要写一个命令行我们首先要写出基本框架。 打印命令行获取用户输入的命令分析命令执行命令 基本框架的代码&am…

基于MySQL的企业专利数据高效查询与统计实现

背景 在进行产业链/产业评估工作时&#xff0c;我们需要对企业的专利进行评估&#xff0c;其中一个重要指标是统计企业每一年的专利数量。本文基于MySQL数据库&#xff0c;通过公司名称查询该公司每年的专利数&#xff0c;实现了高效的专利数据统计。 流程 项目流程概述如下&…

盘点 2024 十大免费/开源 WAF

WAF 是 Web Application Firewall 的缩写&#xff0c;也被称为 Web 应用防火墙。区别于传统防火墙&#xff0c;WAF 工作在应用层&#xff0c;对基于 HTTP/HTTPS 协议的 Web 系统有着更好的防护效果&#xff0c;使其免于受到黑客的攻击。 近几年经济增速开始放缓&#xff0c;科…

鸿蒙进阶-AlphabetIndexer组件

大家好&#xff0c;这里是鸿蒙开天组&#xff0c;今天我们来学习AlphabetIndexer组件&#xff0c;喜欢就点点关注吧&#xff01; 通过 AlphabetIndexer 组件可以与容器组件结合&#xff0c;实现导航联动&#xff0c;以及快速定位的效果 核心用法 AlphabetIndexer不是容器组件…

【Unity】【游戏开发】Sprite背景闪烁怎么解决

【现象】 VR游戏中&#xff0c;给作为屏幕的3D板子加上Canvas后再加背景image&#xff0c;运行时总是发现image闪烁不定。 【分析】 两个带颜色的object在空间上完全重合时也遇到过这样的问题&#xff0c;所以推测是Canvas的image背景图与木板的面重合导致。 【解决方法】 …

sublime Text中设置编码为GBK

要在sublime Text中设置编码为GBK&#xff0c;请按照以下步骤操作 1.打开Sublime Text编辑器, 2.点击菜单栏中的“Preferences”(首选项)选项&#xff0c;找打Package Control选项。 3.点击Package Control&#xff0c;随后搜索Install Package并点击&#xff0c;如下图 4.再…

队列与栈的代码对比(Java)

目录 链表实现队列 数组实现队列 链表实现栈 数组实现栈 图片: 链表实现队列 package Queue;import java.util.Iterator;public class LinkedListQueue <E> implements Queue<E>, Iterable<E>{//单向环形哨兵链表//节点类private static class Node<…

一些常规IP核功能

一,util_vector_logic util_vector_logic 主要支持以下类型的逻辑操作: 逻辑与(AND): 当所有输入都为1时,输出为1,否则为0。逻辑或(OR): 当任意输入为1时,输出为1,否则为0。逻辑非(NOT): 当输入为1时,输出为0;输入为0时,输出为1。异或(XOR): 当输入中有奇…

Docker篇(Docker安装)

目录 一、Centos7.x 1. yum 包更新到最新 2. 安装需要的软件包 3. 设置 yum 源为阿里云 4. 安装docker 5. 安装后查看docker版本 6. 设置ustc镜像源 二、CentOS安装Docker 前言 1. 卸载&#xff08;可选&#xff09; 2. 安装docker 3. 启动docker 4. 配置镜像加速 …

【c++ gtest】使用谷歌提供的gtest和抖音豆包提供的AI大模型来对代码中的函数进行测试

【c gtest】使用谷歌提供的gtest和抖音豆包提供的AI大模型来对代码中的函数进行测试 下载谷歌提供的c测试库在VsCode中安装抖音AI大模型找到c项目文件夹&#xff0c;使用VsCode和VS进行双开生成gtest代码进行c单例测试 下载谷歌提供的c测试库 在谷歌浏览器搜索github gtest, 第…

google adsense广告费中国收款结算被银行拒解决办法

多年前搞了几个网站&#xff0c;挂了谷歌google adsense广告&#xff0c;不知道不觉到了100美金最低结算&#xff0c;谷歌给我打款&#xff0c;之前是绑定交银银行的。被银行镜内登陆谷歌不合法不合规给拒绝入账&#xff0c;把美金退回了&#xff0c;怎么办&#xff1f; googl…

蓝桥杯 区间移位--二分、枚举

题目 代码 #include <stdio.h> #include <string.h> #include <vector> #include <algorithm> #include <iostream> using namespace std; struct node{ int a,b; }; vector<node> q; bool cmp(node x,node y){ return x.b <…