当前位置: 首页 > article >正文

56 在standby待机打通uart调试的方法

修改点如下:

一,进入standby保证uart通

1, 去掉串口进入休眠RT_DEVICE_CTRL_SUSPEND:关闭uart,保证BSP_IO_Power_Down函数执行完前,串口都可以打印,和通过SifliUsartServer工具串口连接,并debug死机问题;

二,从standby唤醒保证uart通

standby唤醒打开串口比较麻烦,此时RTT系统还没有恢复,外部Nor/Nand Flash都没有初始化不可以用,除了Retention RAM外,其他的RAM也还不能访问,打通Uart的思路,就是在GPIO通了HAL_HPAON_ENABLE_PAD();以后,对uart进行初始化配置,并且此时的代码都需要放在RAM内运行,rt_kprintf(""); 在rtt系统和恢复RT_DEVICE_CTRL_RESUME:之前,都是不能打印的,如果一定要打印,用hal_printf("BSP_Power_Up\n");打印,而且不能在if (PM_STANDBY_BOOT == SystemPowerOnModeGet()) 待机唤醒起来的代码内才能运行,其他上电时uart没有初始化,也是会死机;修改点如下:

  1. drv_usart.c文件新增加的hal初始uart的函数和打印函数;
    /* UART handler declaration */
    static UART_HandleTypeDef UartHandle;#define BUFFER_SIZE 256
    #define HALF_BUFFER_SIZE (BUFFER_SIZE/2)
    static DMA_HandleTypeDef dma_rx_handle;
    static uint8_t buffer[BUFFER_SIZE];// 定义接收状态枚举
    typedef enum
    {STATE_UNFULL,STATE_HALF_FULL,STATE_FULL
    } ReceiveState;
    // 当前接收状态
    ReceiveState currentState = STATE_UNFULL;HAL_RAM_RET_CODE_SECT(HAL_UART_CONFIG, static void HAL_UART_CONFIG(struct sifli_uart_config *cfg, rt_size_t obj_num, rt_uint32_t baud_rate))
    {/* Output a message on console using printf function */for (int i = 0; i < obj_num; i++){/*##-1- Configure the UART peripheral ######################################*//* Put the USART peripheral in the Asynchronous mode (UART Mode) *//* UART configured as follows:- Word Length = 8 Bits (8 data bit + 0 parity bit) :BE CAREFUL : Program 7 data bits + 1 parity bit in PC HyperTerminal- Stop Bit    = One Stop bit- Parity      = No parity- BaudRate    = 1000000 baud- Hardware flow control disabled (RTS and CTS signals) */UartHandle.Instance        = cfg->Instance;UartHandle.Init.BaudRate   = RT_SERIAL_DEFAULT_BAUDRATE;UartHandle.Init.WordLength = UART_WORDLENGTH_8B;UartHandle.Init.StopBits   = UART_STOPBITS_1;UartHandle.Init.Parity     = UART_PARITY_NONE;UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;UartHandle.Init.Mode       = UART_MODE_TX_RX;UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;if (UartHandle.Init.Parity){// If parity is odd/even, parity should +1UartHandle.Init.WordLength = UART_WORDLENGTH_9B;}/* 1, pinmux set to uart mode */HAL_PIN_Set(PAD_PA30, USART1_RXD, PIN_PULLUP, 1);   // UART1_RXDHAL_PIN_Set(PAD_PA34, USART1_TXD, PIN_PULLUP, 1);   // UART1_TXD/* 2, open uart2 clock source  */HAL_RCC_EnableModule(RCC_MOD_USART1);if (HAL_UART_Init(&UartHandle) != HAL_OK){/* Initialization Error */HAL_ASSERT(0);}// Start RX DMA__HAL_LINKDMA(&(UartHandle), hdmarx, dma_rx_handle);dma_rx_handle.Instance = cfg->dma_rx->Instance;dma_rx_handle.Init.Request = cfg->dma_rx->request;HAL_UART_DmaTransmit(&UartHandle, buffer, BUFFER_SIZE, DMA_PERIPH_TO_MEMORY); /* DMA_PERIPH_TO_MEMORY */#ifndef DMA_SUPPORT_DYN_CHANNEL_ALLOC// Enable DMA IRQHAL_NVIC_SetPriority(cfg->dma_rx->dma_irq_prio, 0, 0);HAL_NVIC_EnableIRQ(cfg->dma_rx->dma_irq);
    #endif /* !DMA_SUPPORT_DYN_CHANNEL_ALLOC */{// For RX DMA, also need to enable UART IRQ.__HAL_UART_ENABLE_IT(&UartHandle, UART_IT_IDLE); /* Set to generates interrupts when UART idle */HAL_NVIC_SetPriority(cfg->dma_rx->dma_irq_prio, 1, 0);HAL_NVIC_EnableIRQ(cfg->dma_rx->dma_irq);}/* Output a message on Hyperterminal using printf function *//* Output a message on Hyperterminal using hal function */uint8_t ptr[] = {'u', 'a', 'r', 't', '1', ' ', 'r', 'e', 'a', 'd', 'y', '\n'};int len = sizeof(ptr);HAL_UART_Transmit(&UartHandle, ptr, len, 0xFFFF);}
    }
    HAL_RAM_RET_CODE_SECT(hal_hw_usart_init,   void hal_hw_usart_init(void))
    {rt_size_t obj_num = sizeof(uart_obj) / sizeof(struct sifli_uart);if (obj_num > 0){sifli_uart_get_dma_config();HAL_UART_CONFIG(uart_config, obj_num, RT_SERIAL_DEFAULT_BAUDRATE);}
    }
    HAL_RAM_RET_CODE_SECT(hal_printf,    void hal_printf(char *fmt, ...))
    {HAL_UART_Transmit(&UartHandle, fmt, 20, 0xFFFF);
    }
    

2,相关hal初始uart的函数和打印函数以及调用的底层HAL文件都要放到RAM内运行,

就是这三个文件,HAL_RAM_RET_CODE_SECT(hal_hw_usart_init,   void hal_hw_usart_init(void))这个函数都要调用到,需要放到RAM内,要添加在RW_IRAM_RET HPSYS_RETM_BASE HPSYS_RETM_SIZE {这个段内,如下图:

其中HAL_RAM_RET_CODE_SECT 已经对hal_hw_usart_init 函数单独声明了放在RAM内;

  1. 检查相关文件是否已经放到了RAM内,搜索生成*.map文件:

对于的函数地址在 retention RAM区间,就是对了,

确认一下hal_hw_usart_init函数存放地址,如果是在0x20000000到0x2001FFFF内,就是对的,如果地址在0x1C00xxxx开头的,就还是在flash上运行,会死机的;

确认一下,这个函数:HAL_NVIC_SetPriority的存放地址:

  1. 如果你的工程目录下,没有sf32lb56x的话,就这个目录的link.lds和link.sct复制过去也是可以的,

还有一种加法,就是在56x默认的link文件里面加,编译规则是如果有sf32lb56x的link文件,就不用下面这个目录的了。

  1. 就是在hcpu唤醒的函数内,添加新增加的uart的初始化函数,56的hcpu在唤醒走的第一个函数就是:SystemInitFromStandby,

在这个函数内添加 调用,
   extern int hal_hw_usart_init();

hal_hw_usart_init();

5,通过上面操作后,Hcpu在死机时,Uart就能通了,并且可以通过SifliUsartServer工具串口连接,并debug死机问题了

相关文章:

56 在standby待机打通uart调试的方法

修改点如下&#xff1a; 一&#xff0c;进入standby保证uart通 1, 去掉串口进入休眠RT_DEVICE_CTRL_SUSPEND:关闭uart&#xff0c;保证BSP_IO_Power_Down函数执行完前&#xff0c;串口都可以打印&#xff0c;和通过SifliUsartServer工具串口连接&#xff0c;并debug死机问题&…...

OceanBase 共享存储:云原生数据库的存储

目录 探会——第三届 OceanBase 开发者大会 重磅发布&#xff1a;OceanBase 4.3 开发者生态全面升级 实战演讲&#xff1a;用户案例与行业落地 OceanBase 共享存储架构解析 什么是共享存储架构&#xff1f; 云原生数据库的架构 性能、弹性与多云的统一 为何OceanBase能…...

安卓新建项目时,Gradle下载慢下载如何用国内的镜像

方法 1&#xff1a;修改 gradle-wrapper.properties 使用国内镜像 Gradle 的下载地址可以在 gradle-wrapper.properties 中修改&#xff0c;替换为国内镜像地址&#xff08;如阿里云、腾讯云等&#xff09;。 步骤 打开项目中的 gradle-wrapper.properties 文件&#xff08;路…...

讯联文库开发日志(五)登录拦截校验

零 在此之前&#xff0c;由于主播一直缺乏session&#xff0c;这次两个小时的寻找bug之旅也让我受益颇多 罪魁祸首&#xff1a;key值写错了&#xff0c;导致一直报错&#xff0c;不过这也让我了解了更多关于session的k-v结构 参数校验 我们需要在全局拦截器注解里面加两个方…...

PCB设计教程【入门篇】——电路分析基础-读懂原理图

前言 本教程基于B站Expert电子实验室的PCB设计教学的整理&#xff0c;为个人学习记录&#xff0c;旨在帮助PCB设计新手入门。所有内容仅作学习交流使用&#xff0c;无任何商业目的。若涉及侵权&#xff0c;请随时联系&#xff0c;将会立即处理 目录 前言 一、原理图核心要素…...

C语言数据结构

单链表 头文件&#xff1a;lin.h #ifndef __LINK_H__ #define __LINK_H__ #include <stdio.h> #include <stdlib.h> typedef int DataType; /*节点数据类型*/ typedef struct node { DataType data; //数据域 struct node *pNext; …...

湖北理元理律师事务所债务优化方案:让还款与生活平衡成为可能

在现代社会&#xff0c;债务问题已经成为影响许多家庭生活质量的重要因素。如何在不影响基本生活的前提下合理规划还款&#xff0c;是众多债务人面临的实际难题。湖北理元理律师事务所推出的债务优化服务&#xff0c;正是针对这一需求而设计的专业解决方案。 该所的债务优化方…...

Java对象内存分配优化教学

用 “停车位” 的比喻理解这个问题 &#x1f697;&#x1f4a8; 假设你是一个停车场管理员&#xff08;JVM&#xff09;&#xff0c;现在有人&#xff08;程序员&#xff09;要停车&#xff08;new 对象&#xff09;。传统认知是&#xff1a; 堆内存 公共停车场 栈内存 临时…...

精度再升级,可到微米!单位自动换算平米和米

CAD图纸单位怎么看&#xff1f;精度怎么调&#xff1f; 长度测出来是什么单位&#xff1f; 面积一大串怎么回事&#xff1f; 坐标小数点位置不对怎么办&#xff1f; 点击直接获取CAD快速看图 首先说原理 CAD图纸在绘制时&#xff0c;一般情况下单位是&#xff1a; 长度---…...

【学习笔记】Sophus (Python) 使用文档

以下是一份针对 Sophus 库的 Python 使用文档&#xff0c;涵盖基础概念、安装方法、核心功能及代码示例。内容围绕 SO3&#xff08;3D旋转群&#xff09;和 SE3&#xff08;3D刚体变换群&#xff09;展开&#xff0c;适合机器人学、SLAM、三维几何等领域。 Sophus (Python) 使用…...

常见算法题目2 - 给定一个字符串,找出其中最长的不重复子串

算法题目2 - 给定一个字符串&#xff0c;找出其中最长的不重复子串 1. 问题描述 给定一个字符串&#xff0c;输出其最长的不重复子串&#xff0c;例如&#xff1a; String str "ababc"; 输出&#xff1a; abc以下根据两种搜索算法。 2. 算法解决 2.1 暴力循环法…...

如何配置jmeter做分布式压测

问&#xff1a;为何需要做分布式 答&#xff1a;当我们本地机器jmeter进行压测时&#xff0c;单台JMeter机器通常无法稳定生成2000 QPS&#xff08;受限于CPU、内存、网络带宽&#xff09;&#xff0c;本地端口耗尽&#xff1a;操作系统可用的临时端口&#xff08;Ephemeral P…...

Django 中的 ORM 基础语法

深入剖析 Django 中的 ORM 语法&#xff1a;从基础到实战进阶 在 Django 开发领域&#xff0c;ORM&#xff08;对象关系映射&#xff09;是开发者高效操作数据库的得力工具。它以简洁直观的 Python 代码&#xff0c;替代繁琐的 SQL 语句&#xff0c;极大提升了开发效率。本文将…...

C#对象初始化语句:优雅创建对象的黑科技

&#x1f4cc; 核心概念速览 对象初始化语句&#xff08;Object Initializer&#xff09;是C#中一种简洁高效的语法糖&#xff0c;允许在创建对象时直接初始化其公有字段或属性&#xff0c;无需依赖构造函数的重载。它的本质是对构造过程的扩展&#xff0c;尤其适合需要灵活设…...

【计算机网络】TCP如何保障传输可靠性_笔记

文章目录 一、传输可靠性的6方面保障二、分段机制三、超时重传机制四、流量控制五、拥塞控制 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 源网站 按TCP/IP 4层体系&#xff0c;TCP位于传输层&#xff0c;为应用层提供服务 一、传输可靠性的6方面保障…...

Robust Kernel Estimation with Outliers Handling for Image Deblurring论文阅读

Robust Kernel Estimation with Outliers Handling for Image Deblurring 1. 论文的研究目标与实际问题意义1.1 研究目标1.2 实际问题与产业意义2. 论文的创新方法、模型与优势2.1 核心思路2.2 关键公式与技术细节2.2.1 非线性模糊模型与能量函数2.2.2 中间潜像更新与IRLS2.2.3…...

Android Studio 开发环境兼容性检索(AGP / Gradle / Kotlin / JDK)

本表检索了 Android 项目中常用构建工具的兼容性关系&#xff0c;包括&#xff1a; AGP&#xff08;Android Gradle Plugin&#xff09;Gradle&#xff08;构建工具&#xff09;KGP&#xff08;Kotlin Gradle Plugin&#xff09;JDK&#xff08;Java Development Kit&#xff…...

html主题切换小demo

主题切换功能为网页和应用程序提供了多样化的视觉风格与使用体验。实现多主题切换的技术方案丰富多样&#xff0c;其中 CSS 变量和 JavaScript 样式控制是较为常见的实现方式。 以下是一个简洁的多主题切换示例&#xff0c;愿它能为您的编程之旅增添一份趣味。 代码展示 <…...

AI架构职责分配——支持AI模块的职责边界设计

职责分配——支持AI模块的职责边界设计 在传统系统中&#xff0c;职责分配通常围绕“控制层处理逻辑、服务层执行业务、数据层持久化”进行划分。这种分工逻辑在纯业务系统中足以支撑高效协作与系统演进。然而&#xff0c;随着AI模块的引入&#xff0c;系统中新增了如模型推理…...

git@gitee.com: Permission denied (publickey). fatal: 无法读取远程仓库

错误信息&#xff1a; gitgitee.com: Permission denied (publickey). fatal: 无法读取远程仓库。 &#xfffc; &#xfffc;说明 Git 无法通过 SSH 密钥成功连接到 Gitee&#xff08;码云&#xff09;仓库。这通常是由于 SSH 密钥未正确配置或未添加到 Gitee 账户所致。 &am…...

CARIS HIPS and SIPS 12.1是专业的多波束水深数据和声呐图像处理软件

CARIS HIPS 和 SIPS 是一套综合水文处理软件&#xff0c;主要用于海洋水道处理和测量领域‌。该软件集成了测深、水柱和海底图像处理功能&#xff0c;能够提高业务处理的精确度和效率‌。 主要功能和应用场景 ‌测深数据处理‌&#xff1a;HIPS主要用于处理大型测深数据。 ‌…...

Docker端口映射与容器互联

Docker端口映射与容器互联 1. 端口映射实现容器访问 1.1 从外部访问容器应用 # 基础端口映射语法 docker run -d -p [宿主机端口]:[容器端口] [镜像名称]# 示例&#xff1a;容器80端口→宿主机8080 docker run -d -p 8080:80 nginx1.2 高级映射配置 映射类型命令示例说明文档…...

在 Ubuntu 24.04 LTS 上 Docker 部署 DB-GPT

一、DB-GPT 简介 DB-GPT 是一个开源的AI原生数据应用开发框架(AI Native Data App Development framework with AWEL(Agentic Workflow Expression Language) and Agents)。目的是构建大模型领域的基础设施&#xff0c;通过开发多模型管理(SMMF)、Text2SQL效果优化、RAG框架以及…...

使用 Docker 搭建 PyWPS 2.0 服务全流程详解

使用 Docker 搭建 PyWPS 2.0 服务全流程详解 近年来&#xff0c;随着地理信息系统&#xff08;GIS&#xff09;和在线空间分析服务的兴起&#xff0c;OGC标准下的Web Processing Service&#xff08;WPS&#xff09;逐渐成为地理数据服务的重要组件。PyWPS 是一个基于 Python …...

Axure高保真CRM客户关系管理系统原型

一套出色的CRM&#xff08;客户关系管理&#xff09;系统&#xff0c;无疑是企业管理者掌控客户动态、提升销售业绩的得力助手。今天&#xff0c;就为大家介绍一款精心打造的Axure高保真CRM客户关系管理系统原型模板&#xff0c;助你轻松开启高效客户管理之旅。 这款CRM原型模…...

自学嵌入式 day 23 - 数据结构 树状结构 哈希表

一、树状结构 1.特征&#xff1a;在任意一个非空树中&#xff0c; &#xff08;1&#xff09;&#xff0c;有且仅有一个特定的根结点 &#xff08;2&#xff09;&#xff0c;当n>1 时&#xff0c;其余结点可分为m个互不相交的有限集合T1,T2,T3.。。。。Tm&…...

JavaScript进阶(十二)

第三部分:JavaScript进阶 目录 第三部分:JavaScript进阶 十二、深浅拷贝 12.1 浅拷贝 12.2 深拷贝 1. 通过递归实现深拷贝 2. js库lodash里面cloneDeep内部实现了深拷贝 3. 通过JSON.stringify()实现 十三、异常处理 13.1 throw抛异常 13.2 try /catch捕获异常 1…...

Honeywell CV-DINA-DI1624-2A 数字输入模块

概述 型号&#xff1a;CV-DINA-DI1624-2A 类型&#xff1a;数字输入模块&#xff08;16通道&#xff0c;24V DC&#xff09; 制造商&#xff1a;霍尼韦尔&#xff08;Honeywell&#xff09;&#xff0c;属于其工业自动化或楼宇控制系统产品线。 主要功能&#xff1a; 采集16路数…...

中文域名25周年,取得哪些里程碑式的进展?

二十五载中文域名路 第八届中文域名创新应用论坛在北京举办。与会领导专家回顾了中文域名发展历史&#xff0c;深入探讨了当下面临的机遇与挑战&#xff0c;并展望了未来的发展。 自2000年中国推出全球首个中文域名试验系统以来&#xff0c;中文域名已走过25年历程&#xff0c…...

HTTP协议接口三种测试方法之-postman

HTTP协议作为现代Web开发的基石,其接口测试是开发过程中不可或缺的环节。Postman作为最流行的API测试工具之一,能够极大提升我们的测试效率。本文将详细介绍如何使用Postman进行HTTP接口测试。 一、HTTP协议基础回顾 在开始使用Postman之前,我们先简单回顾下HTTP协议的基本…...