【沁恒蓝牙MESH】解决部分CH582单板无法正常启动的过程

本文主要记录了【沁恒蓝牙MESH】CH582单板无法正常启动的原因,
由于开发疏忽,注释了中断服务函数的代码,是入门嵌入式开发经常忽视的错误,用以记录,共勉!!
友情提示: 千万不要随便注释工程中你认为没有用的代码!!!!!!!!!!!!!!!!

【沁恒蓝牙MESH】CH582串口中断内存溢出导致MCU频繁重启

目录

    • 1. 问题二:串口1的接收中断,线路状态错误导致单板无法正常启动
      • 1.1 问题描述:
      • 1.2 错误的代码如下:
      • 1.3 问题复现与定位
      • 1.4 打破砂锅问到底
        • 1.4.1 UART1_GetLinSTA 这行代码是什么意思?
        • 1.4.2 读取线路状态寄存器的值,定位问题####

  • 💖 作者简介:大家好,我是喜欢记录零碎知识点的小菜鸟。😎
  • 📝 个人主页:欢迎访问我的 Ethernet_Comm 博客主页🔥
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 📣 系列专栏:沁恒蓝牙mesh二次开发🍁
  • 💬格言:写文档啊不是写文章,重要的还是直白!🔥

1. 问题二:串口1的接收中断,线路状态错误导致单板无法正常启动

1.1 问题描述:

之前自己开发的基于CH58x的固件在自己的手头的测试板中功能都正常,但是当大批量烧写100块卡发板时却遇到了问题,

问题表现为 有的单板上电无法正常启动,经过排查,发现代码中开启了串口1的接收中断和线路状态错误中断,但是在中断服务函数中却没有清除线路状态错误中断,导致单板无法启动。

1.2 错误的代码如下:

注意 UART1_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT); 这行代码,开启线路中断和接收中断

但是我在中断服务函数中却没有清除线路状态错误中断,UART1_GetLinSTA();这行代码官方库中是有的,但是我因为开发过程中,编译总是报警告,所以我注释了这行代码,导致拍查浪费了几天的时间。

void ch58x_Uart_init()
{/*串口1   PA9 TX1   PA8--RX1*/GPIOA_SetBits(bTXD1 );  //;GPIO_Pin_9);GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA);  	// PA9 TXGPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);      // PA8  RXD-配置上拉输入UART1_DefInit();UART1_ByteTrigCfg(UART_7BYTE_TRIG);UART1_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT);//开启线路中断和接收中断PFIC_EnableIRQ(UART1_IRQn);
}//中断服务函数
__INTERRUPT
__HIGH_CODE
void UART1_IRQHandler(void)
{volatile uint8_t i;switch(UART1_GetITFlag()){case UART_II_LINE_STAT: // 线路状态错误{//UART1_GetLinSTA();    // 我注释了这行代码break;}}
}

1.3 问题复现与定位

找了几块每次上电都无法正常启动的板子,修改代码如下,发现单板确实是因为进入了中断但是没有清中断导致无法正常启动。

image-20231221083134587

1.4 打破砂锅问到底

1.4.1 UART1_GetLinSTA 这行代码是什么意思?
// 官方解释:refer to LINE error and status define
#define UART1_GetLinSTA()     (R8_UART1_LSR)
#define R8_UART1_LSR        (*((PUINT8V)0x40003405))  // RO, UART1 line status

这行代码的意思就是读了一下 R8_UART1_LSR这个寄存器的值,由于代码中没有赋值,所以编译的时候报 warning 信息,如果改为

uint8_t regVlaue = R8_UART1_LSR 这种赋值的形式编译就不报错了?

继续看手册, 读取寄存器的值可以直接清中断,那么UART1_GetLinSTA()这行代码的作用就是 清除线路状态错误中断image-20231221083923443

1.4.2 读取线路状态寄存器的值,定位问题####

image-20231221090207055

为了测试,在中断服务函数中打印出寄存器的值(在中断中不要使用 printf ,这里仅仅是为了测试)

image-20231221085058627

上电数次后发现,正常启动的单板读取的线路状态寄存器(R8_UART1_LSR)的值都是复位值 0x60 ,但是有问题的单板的读取的复位值是 248 = 0xf8

那么问题就很清楚了,单板上电检测到线路状态错误,进入了中断,但是又没有清中断,所以卡在中断里就无法正常启动了

image-20231221090408155

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 常用命令之 gunzip 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 gunzip是一个在Ubuntu系统下用于解压缩文件的命令。它主要用于解压.gz格式的文件。这个命令是gzip命令的反向操作,gzip用于压缩文件,而gunzip则用于解压缩文件。 gunzip命令的参数有 -c 或 --stdout 或 -…

JAVA 中的 SPI 机制,从原理、现有框架中的使用以及自定义实现 SPI 机制使用来深入了解 SPI 机制

首先介绍 SPI 是什么 SPI 机制在框架中的使用 SPI 机制使用约定MySQL 驱动实现 SPI 机制示例 最后自己动手实现 SPI 机制使用示例 文章链接,点击跳转

基于Vue的汽车服务商城系统设计与实现论文

摘 要 本课题是根据用户的需要以及网络的优势建立的一个基于Vue的汽车服务商城系统,来更好的为用户提供服务。 本基于Vue的汽车服务商城系统应用Java技术,MYSQL数据库存储数据,基于SSMVue框架开发。在网站的整个开发过程中,首先对…

CSS设计器的使用

目录 css的概念 css的优势 css的基本语法 html中引入css样式 CSS基本选择器 选择器的使用 初级选择器: 标签选择器 类选择器 id选择器 高级选择器(结构选择器) ①后代选择器(E F) ②子选择器(E>F) ③相邻兄弟选择器(EF) ④通用兄弟选择器(…

动态内存分配(malloc和free​、calloc和realloc​)

目录 一、为什么要有动态内存分配​ 二、C/C中程序内存区域划分​ 三、malloc和free​ 2.1、malloc 2.2、free​ 四、calloc和realloc​ 3.1、calloc​ 3.2、realloc​ 3.3realloc在调整内存空间的是存在两种情况: 3.4realloc有malloc的功能 五、常见的动…

【STM32】STM32学习笔记-对射式红外传感器计次 旋转编码器计次(12)

00. 目录 文章目录 00. 目录01. NVIC相关函数1.1 NVIC_PriorityGroupConfig函数1.2 NVIC_PriorityGroup类型1.3 NVIC_Init函数1.4 NVIC_InitTypeDef类型 02. 外部中断相关API2.1 GPIO_EXTILineConfig2.2 EXTI_Init2.3 EXTI_GetITStatus2.4 EXTI_ClearITPendingBit2.5 中断回调函…

传输层协议分析--第4关:UDP 包分析

任务描述 本关任务:能够掌握简单的 UDP 包分析。 相关知识 为了更好掌握本章内容,你需要了解的有: UDP 报文的简介;UDP 报文格式;Wireshark 软件中的 UDP 抓包分析。 UDP 简介 UDP(User Datagram Pro…

proxysql读写分离组件部署

一、前言 在mysql一主两从架构的前提下,引入读写分离组件,可以极大的提高mysql性能,proxysql可以在高可用mysql架构发生主从故障时,进行自动的主从读写节点切换,即当mysql其他从节点当选新的主节点时,proxy…

vscode开发python环境配置

前言 vscode作为一款好用的轻量级代码编辑器,不仅支持代码调试,而且还有丰富的插件库,可以说是免费好用,对于初学者来说用来写写python是再合适不过了。下面就推荐几款个人觉得还不错的插件,希望可以帮助大家更好地写…

Python游戏编程 – 猜数字游戏

Python游戏编程 – 猜数字游戏 Python Game Programming – Guessing Number Game By JacksonML 对Python有一定了解,并且熟知变量、数据类型、循环与分支、函数功能后,我们可以尝试来编写简单的游戏代码。 本文简要介绍如何编写猜数字游戏的Python代码…

研发管理-代码管理篇

前言: 工作了这些年,工作了三家公司,也用过主流的代码管理平台,比如SVN,git系列(gitlib,gitee),各有优点,我个人比较喜欢SVN,多人协作的代码管理难免会有代码冲突&#…

MaBatis使用`ResultMap`标签手动映射详解使用

文章目录 MaBatis使用ResultMap标签手动映射详解使用1、MyBatis只能自动维护库表”列名“与”属性名“相同时的对应关系,二者不同时无法自动ORM,如下:2、在SQL中使用 as 为查询字段添加列别名,以匹配属性名:但是如果我…

TCAX特效字幕保姆入门教程+效果演示+软件源码自取

目录 介绍 下载链接 初步使用 软件使用 tcc文件介绍 tcc文件版本 模式设置 ​编辑 k值提供方式举例 特效脚本设置 主要设置 ass全局风格设置 额外设置 常见问题 编码使用 使用其他tcax博主的进行编码测试 介绍 TCAX是一款专门用于制作特效字幕的软件。通过TCAX…

【中小型企业网络实战案例 一】规划、需求和基本配置

热门IT技术【视频教程】https://xmws-it.blog.csdn.net/article/details/134398330?spm1001.2014.3001.5502 案例拓扑图 案例需求 在中小园区中,S5735通常部署在网络的接入层,S8700通常部署在网络的核心,出口路由器一般选用AR系列路由器。 …

使用Windows批处理命令行和ImageMagick批量将文件夹中的图片转换为PDF文档的方法

目录 应用场景 实现思路 实现过程 1.下载安装imageMagick 2.遍历源文件夹 3.转换图片为pdf文档 4.最终执行的命令 5.结果验证 6.将以上命令改写为windows批处理文件 应用场景 图像是一种常见的数据。图片几乎是一个信息系统中必不可少的组成部分。为了方便阅读&…

Redis一些常用的技术

文章目录 第1关:Redis 事务与锁机制第2关:流水线第3关:发布订阅第4关:超时命令第5关:使用Lua语言 第1关:Redis 事务与锁机制 编程要求 根据提示,在右侧编辑器Begin-End补充代码,根据…

Mac managing Multiple Python Versions With pyenv 【 mac pyenv 管理多个python 版本 】

文章目录 1. 简介2. 安装2.1 brew 安装 pyenv2.2 脚本安装 3. pyenv 安装 Python4. 卸载 python5. 管理 python 1. 简介 Pyenv 是一个用于管理和切换多个 Python 版本的工具。它允许开发人员在同一台计算机上同时安装和使用多个不同的 Python 版本,而无需对系统进行…

基于EasyDarwin、ffmpeg实现rtsp推流

目录 1 安装EasyDarwin 2 编译安装ffmpeg 3 启动EasyDarwin 4 ffmepg推流 5 百度网盘备份 某项目中测试时需要用到推流,于是用EasyDarwin、ffmpeg实现了RTSP推流,简单记录下过程, 1 安装EasyDarwin 这个可以去官网下载:Eas…

【jvm从入门到实战】(九) 垃圾回收(2)-垃圾回收器

垃圾回收器是垃圾回收算法的具体实现。 由于垃圾回收器分为年轻代和老年代,除了G1之外其他垃圾回收器必须成对组合进行使用 垃圾回收器的组合使用关系图如下。 常用的组合如下: Serial(新生代) Serial Old(老年代) Pa…

Jenkins 构建环境指南

目录 Delete workspace before build starts(常用) Use secret text(s) or file(s) (常用) Add timestamps to the Console Output (常用) Inspect build log for published build scans Terminate a …