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

news2025/5/24 7:00:47

修改点如下:

一,进入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 +1
                UartHandle.Init.WordLength = UART_WORDLENGTH_9B;
            }
            /* 1, pinmux set to uart mode */
    
            HAL_PIN_Set(PAD_PA30, USART1_RXD, PIN_PULLUP, 1);   // UART1_RXD
            HAL_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 IRQ
            HAL_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死机问题了

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

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

相关文章

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; …

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

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

常见算法题目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;极大提升了开发效率。本文将…

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

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

html主题切换小demo

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

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

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

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

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

在 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框架以及…

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…

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

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

应对进行性核上性麻痹,健康护理铸就温暖防线

进行性核上性麻痹&#xff08;PSP&#xff09;是一种罕见的神经退行性疾病&#xff0c;主要影响患者的运动、平衡及吞咽等功能。针对这类患者&#xff0c;有效的健康护理对提升其生活质量、延缓病情发展至关重要。 在日常生活护理方面&#xff0c;由于患者存在平衡障碍和肌肉僵…

python邮件地址检验 2024年信息素养大赛复赛/决赛真题 小学组/初中组 python编程挑战赛 真题详细解析

python邮件地址检验 2024全国青少年信息素养大赛Python编程挑战赛复赛真题解析 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】 1、Python比赛 信息素养大赛Python编程挑战赛 蓝桥杯python选拔赛真题详解 蓝桥杯python省赛真题详解 蓝桥杯python国赛真题详解 2、…