潘多拉STM32L4 96 IoT开发板(HAL库) 5.利用中断机制实现串口的收发信息

(实测可用)STM32L431RCT6开发板-实验2 看门狗IWDG实验 1、开发板资源简介 (1)开发板主芯片型号:STM32L431RCT6 (2)开发板主芯片封装:LQFP-64_10x10x05P (3)开发板主芯片内核:ARM® Cortex®-M4 (4)开发板主芯片主频:80MHz (5)开发板主芯片Flash大小:256KB (6)开发板主芯片RAM大小:64KB 阅读详情

学习目标:

        掌握 Java 串口的中断机制


学习内容:

        串口发送,往往可以由主程序控制,在合适的时候主动调用发送函数进行数据发送。
        但是,串口接收时,往往不知道数据何时能够到来。例如,上位机通过无线模块向下位机发送控制命令时,发送命令的时间是难以确定的,取决于用户或者特定条件满足以后触发的传输。在时间上具有不可预知性。

        此时,串口应该采用中断机制进行接收。


学习时间:

2026.1.6


工程创建:

1.基于第二章节的串口通信实验,这次实验在此基础上修改。

        首先,打开usart.c文件,右键usart.h,选中Open document “usart.h”,打开usart.h文件并编辑内容。

2.对usart1串口进行定义,为中断实验做准备。

双缓冲接收机制设计

静态缓冲区:

#define USART_REC_LEN 200
extern uint8_t USART_RX_BUF[USART_REC_LEN];
  • 固定长度环形缓冲区设计

  • 200字节的平衡选择:兼顾内存占用和常见帧长度

  • 适合查询式或DMA循环缓冲场景

中断缓冲区:

#define RXBUFFERSIZE 1
extern uint8_t aRxBuffer[RXBUFFERSIZE];
  • 单字节中断接收设计

  • 实现零等待时间的中断响应

  • 体现了生产者-消费者模式的硬件实现

⚙️ 状态机与同步机制

接收状态寄存器设计

USART_RX_STA的低16位可能包含:

// 假设的设计模式:
bit15: 帧接收完成标志
bit14: 帧错误标志
bit13-bit0: 实际接收字节数(最大16383字节)

// 典型操作:
if (USART_RX_STA & 0x8000)  // 检查完成标志
len = USART_RX_STA & 0x3FFF;  // 提取数据长度

优势:

  • 一个16位变量同时承载状态和数据信息

  • 原子操作友好,减少临界区保护需求

  • 节省内存,提高缓存命中率

🔄 实时性保障机制

1. 中断与轮询的权衡

#define EN_USART1_RX 1  // 使能接收中断
  • 中断模式:适合随机、突发性数据

  • 轮询模式:适合周期性、确定性通信

  • 混合模式:中断接收 + 主循环处理

2. 超时与错误恢复

从代码片段包含:

  • 接收超时机制

  • 帧完整性校验

  • 缓冲区溢出保护

🏗️ 系统集成与优化

1. 内存管理策略

// 静态分配 vs 动态分配
#define USART_REC_LEN 200  // 编译时确定,无碎片风险
// 适合资源受限的嵌入式系统

2. 性能优化考虑

  • 数据对齐:uint8_t数组自然对齐

  • 缓存友好:连续内存访问模式

  • DMA支持:huart1句柄为DMA集成预留接口

        展示的代码是经典嵌入式通信栈的典型实现,平衡了性能、资源和可靠性,体现了嵌入式开发的精髓:在有限资源下实现确定性行为。

3.对usart.c文件进行编码

        

串口重定向与半主机模式深度技术分析

🎯 核心架构设计分析

1. 半主机模式禁用机制

#pragma import(__use_no_semihosting)

技术内涵:

  • 半主机模式:ARM调试时通过调试器进行I/O的机制

  • 禁用目的:脱离调试环境独立运行,使用真实硬件外设

  • 替代方案:使用串口硬件实现标准I/O重定向

2. 标准库重定向设计

struct __FILE {
    int handle;
};
FILE __stdout;

设计考量:

  • FILE结构体定义:为标准库提供必要的最小化结构

  • 标准流声明:__stdout作为标准输出流描述符

  • 目标:使printf、fprintf等标准库函数正常工作

⚙️ 硬件直接操作与轮询机制

直接寄存器操作

while((USART1->ISR & 0X40) == 0);  // 等待发送完成标志
USART1->TDR = (uint8_t) ch;        // 写入发送数据寄存器

技术细节:

// ISR寄存器位6:TC (Transmission Complete)
// 0x40 = 0b01000000,对应TC位
// 轮询等待直到TC=1,表示上一字节发送完成

硬件交互原理:

软件层        ->        硬件层
-------------------------------------
fputc()                USART外设
  ↓                     ↓
轮询TC标志       ← 硬件自动设置标志位
  ↓                     ↓
写入TDR寄存器    → 硬件开始发送数据
  ↓                     ↓
返回字符         ← 硬件产生中断/事件

🚫 系统调用存根实现

1. 最小化系统接口

void _sys_exit(int x)
{
    x = x;  // 空操作,防止链接错误
}

设计意图:

  • 为exit()等标准库调用提供桩函数

  • 防止链接器因未定义符号而失败

  • 嵌入式系统中通常不需要真正的进程退出

2. 内存模型适配

#include <stdint.h>
  • 确保类型定义与ARM架构兼容

  • 提供固定宽度整数类型(uint8_t等)

  • 增强代码可移植性

🔄 实时性与阻塞问题

轮询等待的优缺点

while((USART1->ISR & 0X40) == 0);  // 阻塞等待

方法

优点

缺点

轮询等待​

实现简单,无需中断配置

CPU占用率高,实时性差

中断驱动​

CPU利用率高,可并行处理

需要中断上下文管理

DMA传输​

完全解放CPU,适合大数据

配置复杂,需要DMA控制器

代码展示了嵌入式系统标准库适配的经典模式,体现了几个重要原则:

  1. 最小实现原则:只实现必要的函数,保持系统精简

  2. 硬件直接访问:在资源受限环境中避免抽象层开销

  3. 实用主义导向:为调试目的牺牲部分性能和优雅性

  4. 向后兼容:通过标准接口保持上层代码不变

然而,从工程化角度看,它更适用于学习和调试阶段,在生产环境中需要考虑可维护性、性能和可靠性的平衡。现代嵌入式开发倾向于使用更完整的HAL库和更高级的调试框架(如SEGGER RTT),这段代码仍然是理解底层硬件交互的绝佳教材。

🎯 核心架构设计分析

1. 双模式中断处理架构

void USART1_IRQHandler(void) {
    uint8_t Res;
    if((HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET) // 接收中断
    {
        HAL_UART_Receive(&huart1, &Res, 1, 1000);
    }
    // ... 状态机处理 ...
    HAL_UART_IRQHandler(&huart1); // HAL库中断处理
}

架构特色:

  • 混合式中断处理:手动标志检测 + HAL库回调

  • 分层设计:应用层状态机 + HAL库底层管理

  • 双重保障:用户自定义逻辑 + 标准库错误处理

2. 状态机驱动的数据帧协议

// USART_RX_STA 状态寄存器设计:
// bit15 (0x8000):接收完成标志
// bit14 (0x4000):已收到 0x0d (CR)
// bit13~0 (0x3FFF):接收数据长度(最大16383字节)

if((USART_RX_STA & 0x8000) == 0) // 接收未完成
{
    if(USART_RX_STA & 0x4000) // 接收到了0x0d
    {
        // 等待0x0a
    }
    else // 还没收到0x0d
    {
        // 处理数据或检测0x0d
    }
}

🔍 详细技术实现分析

1. 接收协议设计

// 帧结束标记:0x0D 0x0A (CR LF)
// 这是典型的"回车换行"终止符协议
// 优势:文本协议友好,兼容性强
// 劣势:二进制数据传输受限

协议状态机:

初始状态 → 接收数据 → 遇到0x0D → 等待0x0A → 接收完成
    ↓          ↓          ↓          ↓
长度计数  存入缓冲区  设置标志位  完成标志

2. 缓冲区管理策略

// 环形缓冲区索引计算
USART_RX_BUF[USART_RX_STA & 0X3FFF] = Res;

// 缓冲区溢出保护
if(USART_RX_STA > (USART_REC_LEN - 1)) 
    USART_RX_STA = 0;

内存管理特点:

  • 环形缓冲区:索引回绕实现

  • 长度掩码:& 0x3FFF确保索引不越界

  • 硬复位机制:溢出时直接清0,防止数据混乱

⚡ 中断处理流程分析

时序分析:

// 中断处理时序:
1. 中断触发(RXNE = 1)
2. 读取单个字节到 Res
3. 状态机处理
4. 调用 HAL 库处理程序
5. 清除中断标志

性能考量:

// 潜在瓶颈:
HAL_UART_Receive(&huart1, &Res, 1, 1000); // 1000ms超时
// 1. 阻塞式读取,超时设置较长
// 2. 在中断中阻塞可能影响其他中断响应

🔄 HAL 库集成分析

1. 库函数调用模式

// HAL_UART_Receive 在中断中的使用
// 参数分析:
// &huart1: 串口句柄指针
// &Res: 单字节接收缓冲区
// 1: 接收长度
// 1000: 超时时间(毫秒)

// 设计意图:
// 确保单字节接收的可靠性
// 但可能引入潜在的性能问题

2. 中断处理的最后一步

HAL_UART_IRQHandler(&huart1);
// 作用:
// 1. 清除中断标志
// 2. 调用 HAL_UART_RxCpltCallback 等回调函数
// 3. 处理 HAL 库内部状态机

这些代码体现了 传统嵌入式串口编程的经典思路:

  1. 简洁高效:用最少资源实现功能

  2. 直接明了:状态机逻辑一目了然

  3. 实用导向:满足基本需求,不追求过度设计

        在现代嵌入式开发中,虽然可能采用更复杂的框架(如 RTOS、DMA、高级协议栈),但这种状态机+中断的核心思想依然是串口通信的基础。理解这段代码,就掌握了嵌入式串口编程的精髓。

4.修改main.c文件

if (USART_RX_STA & 0x8000) // 检查接收状态寄存器的最高位是否为1,表示接收到完整数据帧
{
    len = USART_RX_STA & 0x3fff; // 从接收状态寄存器中提取低14位,得到此次接收到的数据长度
    printf("\r\n您发送的消息为:\r\n"); // 打印提示信息,告知用户即将显示接收到的消息
    HAL_UART_Transmit(&huart1, (uint8_t *)USART_RX_BUF, len, 1000); // 使用串口发送接收到的数据
    // 参数解释:
    // &huart1:串口句柄,指定使用哪个串口发送数据
    // (uint8_t *)USART_RX_BUF:指向接收到的数据缓冲区
    // len:要发送的数据长度
    // 1000:超时时间(单位:毫秒)
    while (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) != SET); // 等待发送完成
    // __HAL_UART_GET_FLAG(): 检查串口标志位,UART_FLAG_TC 表示发送完成标志
    // 循环等待直到发送完成标志被置位
    printf("\r\n\r\n"); // 发送完成后插入两行换行符,格式化输出
    USART_RX_STA = 0; // 清空接收状态寄存器,准备接收下一帧数据
} 
else // 如果没有接收到完整数据帧
{
    times++; // 增加计数器变量 times,用于控制后续的周期性操作
    
    if (times % 5000 == 0) // 每计数到 5000 的倍数时执行一次
    {
        printf("\r\n《物联网工程实践与管理》串口实验\r\n"); // 打印课程和实验信息
        printf("齐鲁工业大学\r\n\r\n\r\n"); // 打印学校信息和换行
    }
    
    if (times % 200 == 0) // 每计数到 200 的倍数时执行一次
    {
        printf("请输入数据,以回车键结束\r\n"); // 提示用户输入数据
    }
    
    if (times % 30 == 0) LED_B_TogglePin(); // 每计数到 30 的倍数时执行一次
    // LED_B_TogglePin:切换 LED 灯的状态(亮/灭),用于指示系统正在运行
    
    HAL_Delay(10); // 延时 10 毫秒,降低 CPU 占用率
}

🎯 系统整体架构分析

1. 双核工作模式:中断 + 主循环

┌─────────────────────────────────────┐
│        USART1_IRQHandler             │ ← 中断驱动,实时响应
│    (图片3、4:中断服务程序)          │
├─────────────────────────────────────┤
│   1. 字节级接收                       │
│   2. 状态机推进 (CRLF检测)           │
│   3. 标志位设置 (0x8000完成标志)     │
└───────────────┬─────────────────────┘
                │ 状态同步
                ▼
┌─────────────────────────────────────┐
│          主循环处理代码              │ ← 轮询驱动,后台处理
│    (用户提问的主循环处理逻辑)        │
├─────────────────────────────────────┤
│   1. 检查完成标志 (0x8000)           │
│   2. 数据回显与状态复位              │
│   3. 空闲时系统信息显示              │
└─────────────────────────────────────┘

🔄 核心机制详解

1. 状态寄存器双功能设计

USART_RX_STA 寄存器设计:

// bit15: 接收完成标志 (0x8000)
// bit14: 已收到0x0D标志 (0x4000)  
// bit13-0: 接收字节数 (0x3FFF掩码)

状态转移图

初始化 (0x0000)
    ↓
接收数据 → [USART_RX_BUF[STA] = Res] → STA++
    ↓
Res == 0x0D? → 设置0x4000标志
    ↓
Res == 0x0A? → 设置0x8000标志 (完成)
    ↓
主循环检测到0x8000 → 处理数据 → 复位STA=0

2. 中断与主循环的握手机制

// 中断服务程序 (图片3、4)
void USART1_IRQHandler(void)
{
    // 收到数据 → 更新STA状态
    // 完成时设置 STA |= 0x8000
}

// 主循环 (用户提问的代码)
while(1)
{
    if (USART_RX_STA & 0x8000)  // 检查中断设置的标志
    {
        // 处理数据
        USART_RX_STA = 0;  // 通知中断可以接收新数据
    }
}

关键同步点:

  • 中断:设置0x8000表示"数据就绪"

  • 主循环:清除0x8000表示"已处理完成"

⚙️ 主循环任务调度策略

1. 多速率任务调度器

times++;  // 全局计数器

// 三级任务调度:
// 1. 快速任务 (30次计数) - LED闪烁
// 2. 中速任务 (200次计数) - 用户提示
// 3. 慢速任务 (5000次计数) - 系统信息

if (times % 5000 == 0)   // ~50秒 (10ms×5000)
if (times % 200 == 0)    // ~2秒 (10ms×200)
if (times % 30 == 0)     // ~0.3秒 (10ms×30)

时间分析:

HAL_Delay(10);  // 固定10ms延时
→ 主循环频率 ≈ 100Hz
→ times自增频率 ≈ 100次/秒

2. 优先级与抢占设计

任务

触发条件

优先级

功能

数据回显​

STA & 0x8000

最高

实时响应用户输入

LED指示​

times % 30 == 0

高

系统活动指示

用户提示​

times % 200 == 0

中

交互引导

系统信息​

times % 5000 == 0

低

系统状态展示

🛡️ 关键安全与可靠性设计

1. 缓冲区溢出保护

// 中断中的保护 (图片4)
if(USART_RX_STA > (USART_REC_LEN - 1)) 
    USART_RX_STA = 0;  // 复位状态

// 主循环中的长度提取
len = USART_RX_STA & 0x3fff;  // 确保在合法范围

双重保护机制:

  1. 中断中检测并复位

  2. 主循环中掩码运算防止越界

2. 发送完成确认

while (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) != SET);

重要性:

  • 确保前一帧完全发送后才清零状态寄存器

  • 避免数据覆盖或发送不完整

  • 保持串口协议的时序完整性

🔍 状态机设计的巧妙之处

1. CRLF终结符检测算法

// 三状态检测:
// 状态0: 普通数据 → 存入缓冲区
// 状态1: 收到0x0D → 设置0x4000标志
// 状态2: 收到0x0A → 设置0x8000标志

// 容错处理:
if(Res != 0x0a) USART_RX_STA = 0;  // 0x0D后必须是0x0A

2. 状态寄存器的位操作效率

// 替代多个变量的设计:
// 普通方案:uint8_t complete_flag, cr_received; uint16_t length;
// 当前方案:uint16_t USART_RX_STA; (一个变量包含所有信息)

// 优势:
// 1. 减少内存占用
// 2. 状态更新原子性
// 3. 减少缓存失效

        这段代码是经典嵌入式串口编程的典范,展示了如何在有限的资源下实现可靠的数据通信。虽然现代嵌入式开发可能有更复杂的框架,但这种状态机 + 中断 + 主循环的三层架构依然是理解嵌入式系统设计的核心基础。

5.实际运行效果:

       

STM32之CubeL4(一)---HAL详解与CubeMX使用(GPIO + EXIT示例) 一、HAL库与STD库对比 之前使用STM32系列芯片都是基于STD(Standard Peripheral Libraries)标准外设库,标准外设库将相关寄存器以结构体的形式组织起来,使用库函数操作外设有点轻度面向对象编程的感觉,比寄存器操作方便不少。但在不同芯片上使用标准外设库开发的程序可移植性比较差,换个芯片常需要重新做大量的开发工作,为了解决这个问题,ST推出了全新的HAL(Hardwa... 阅读详情

相关推荐

探索STM32开发板原理图:红牛板的设计与应用

本文还有配套的精品资源,点击获取 简介:STM32系列微控制器是基于ARM Cortex-M内核,红牛STM32开发板是专为嵌入式开发者设计的学习和实验平台。它支持多种尺寸的TFT屏幕,并集成了电源管理、存储器、调试接口、GPIO、通信接口、时钟源、保护电路等关键硬件组件。本文件提供了详细的设计原理图,旨在帮助开发者深入理解硬件结构和交互,以便于进行硬件设计、软件编程及故障...

weixin_42452483的博客 1130

(实测可用)STM32L431RCT6开发板-实验8 RS485收发实验

1、开发板资源简介 (1)开发板主芯片型号:STM32L431RCT6 (2)开发板主芯片封装:LQFP-64_10x10x05P (3)开发板主芯片内核:ARM® Cortex®-M4 (4)开发板主芯片主频:80MHz (5)开发板主芯片Flash大小:256KB (6)开发板主芯片RAM大小:64KB

zhej2014的博客 3035

全面探索STM32L496开发套件:低功耗微控制器应用设计

STM32L496微控制器是STMicroelectronics(意法半导体)生产的一款高性能ARM Cortex-M4内核的MCU(微控制器单元),具备了丰富的外设接口和低功耗特性,非常适合于对性能和能效有较高要求的应用场景。其核心频率可达80MHz,并具备多种省电模式,在保证性能的同时实现低功耗运行。STM32L496开发套件提供了一整套完整的硬件组件,旨在为开发者提供一个高效、便捷的开发平台。套件的组成主要包括以下几个部分:STM32L496微控制器核心板。

weixin_42437253的博客 1349

(实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究串口通信(RS485)

1、开发板资源简介 (1)开发板主芯片型号:STM32L431RCT6 (2)开发板主芯片封装:LQFP-64_10x10x05P (3)开发板主芯片内核:ARM® Cortex®-M4 (4)开发板主芯片主频:80MHz (5)开发板主芯片Flash大小:256KB (6)开发板主芯片RAM大小:64KB

zhej2014的博客 6911

STM32L4系列的HAL库和LL库文档

STM32是意法半导体(STMicroelectronics)推出的一系列32位微控制器(MCU),基于ARM Cortex-M处理器核心。这些微控制器以其高性能、低成本和广泛的应用领域而闻名,广泛应用于嵌入式系统设计。 STM32系列提供了多种不同的产品线,包括但不限于STM32F(Foundation Line)、STM32G(General Purpose)、STM32L(Low Power)、STM32H(High Performance)等,以满足不同性能和功耗的需求。它们通常包含丰富的外设,如模数转换器(ADC)、数模转换器(DAC)、通用同步异步收发器(USART)、I2C、SPI、CAN、USB、以太网等,以及多种内存配置选项,包括闪存和RAM。 STM32微控制器支持多种开发工具和软件库,如STM32CubeMX、HAL库和LL库,这些工具大大简化了开发流程,使得开发者能够快速地开发和部署应用程序。此外,STM32还提供了丰富的文档和社区支持,帮助开发者解决开发过程中遇到的问题。 由于其强大的功能和灵活性,STM32微控制器被广泛应用于工业自动化、消费电子、医疗

STM32CubeMX 的STM32L4系列最新的HAL库

这个库下了将近10天终于下下来的,适用于STM32L4 系列芯片,需要的可以下载

(实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究串口通信(DMA)

一、开发板平台简介: 1、开发板资源简介 (1)开发板主芯片型号:STM32L431RCT6 (2)开发板主芯片封装:LQFP-64_10x10x05P (3)开发板主芯片内核:ARM® Cortex®-M4 (4)开发板主芯片主频:80MHz (5)开发板主芯片Flash大小:256KB (6)开发板主芯片RAM大小:64KB (7)其他外设:请参考芯片手册https://atta.szlcsc.com/upload/public/pdf/source/20161229/1482979..

zhej2014的博客 1905

STM32L475VGT6单片机物联网开发板PDF原理图PCB+AD集成封装库文件.zip

STM32L475VGT6单片机物联网开发板PDF原理图PCB+AD集成封装库文件, ALTIUM工程转的PDF原理图PCB文件+AD集成封装库,已在项目中验证,可以做为你的设计参考。集成封装库器件列表: Library Component Count : 46 Name Description ---------------------------------------------------------------------------------------------------- 1050170001 USB-MICRO-B, 1050170001, SMT, MOLEX 475900001 USB-MICRO-AB, 47590-0001, SMT, MOLEX BAT60JFILM BAT60JFILM BSR14 BSR14 NPN switching transistor SOT23 (Marking U8) CAP_NPOL Capacitor_not polarized EMIF02-USB03F2 2-line IPAD, EMI filter including ESD protection HEADER_2X5 HEADER_2X6_PMOD PMOD Connector Warning Specific Pinout HTS221 Humidity + Temp MEMS Header 10X1_Female_SMDHeader, 10-Pin, SMD, Single row,female Header 2 pins Header 2 pins Header 4 Header, 4-Pin Header 6X1_Female_SMDHeader, 6-Pin, SMD, Single row,female Header 8X1_Female_SMDHeader, 8-Pin, SMD, Single row,female ISM43362-M3G-L44 ISM43362-M3G-L44 Wifi Module 802.11 bgn Inductor Inductor LD1117S33TR LOW DROP FIXED AND ADJUSTABLE POSITIVE VOLTAGE REGULATORS (3.3 Volts) LD1117S50TR IC REG LDO 5V 0.8A SOT223 LD3985M33R Ultra low drop-low noise BiCMOS voltage, regulators low ESR capacitors compatible LD_BICOLOR_CMS Bicolor Led LED Light-Emitting Diode LIS3MDL IC,Sensor LPS22HB IC,Sensor LSM6DSL Accelero + Gyro MEMS (6 Axis) LT1963EST-3.3 LT1963EST-3.3 LDO Low Noise 1.5A fast Transient Response M24SR64-Y M24SR64-Y 64K_EEPROM NFC/RFID MP34DT01 MEMS audio microphone MX25R6435F MX25R6435F Serial Flash Memory 64M PT Point de test RES Resistor SPBTLE-RF SPBTLE-RF SPSGRF SPSGRF-915or SPSGRF-868 ST890CDR 1.2 A current limited high-side power switch with thermal shutdown STM32F103CBT6 Medium-density performance line ARM-based 32-bit MCU with 128KB Flas

潘多拉 STM32L475 VE——开发板学习

首先就是开发板的各个硬件的介绍: ◆ MCU:STM32L475VET6,LQFP100,SRAM:128K,FLASH:512K ◆ 外扩 SPI FLASH:W25Q128,16M 字节 ◆ 1 个电源指示灯(蓝色) ◆ 1 个 RGB 状态指示灯(红、绿、蓝三色) ◆ 4 个功能按钮,其中 WK_UP 兼具唤醒功能 ◆ 1 个启动模式配置选择接口 ◆ 1 个复位按钮 ◆ 1 个红外接收头,并配备一款小巧的红外遥控器 ◆ 1 个红外发射头 ◆...

m0_52249955的博客 7570

STM32L496实现基于TF卡的文件系统【RT-Thread工程,支持STM32L4系列单片机】.zip

STM32L496驱动程序,基于RT-Thread操作系统实现。 支持STM32L4系列单片机编译和运行。 项目代码可顺利编译运行~

LangChain4j-针对性操作Function-call+系统预设角色

如果我们想要对一些敏感信息进行针对化的操作,不仅仅是接口大模型去进行回复。比如我们现在数据库里面有一些菜品,那么用户提问,店里有多少套餐,那么云端大模型肯定是不知道的,我们希望捕获这些关键字然后进行自己的业务查询或者处理,这个时候就可以使用function-call。

DDDDDouble的博客 454

STM32单片机最小系统

单片机最小系统:使一个单片机(MCU)能正常启动和工作运行,并且能正常下载程序的最简电路。

Weber Zhou 的博客 1万+

冗余位技术在SAR ADC中的动态误差恢复机制解析

本文深入解析了冗余位技术在SAR ADC中的动态误差恢复机制,详细介绍了其基本概念、动态误差产生原因及冗余位的容错空间设计、时序松弛策略和数字校正算法。通过实际电路设计案例和数学建模,展示了冗余位技术如何显著提升ADC的精度和能效比,同时探讨了未来发展方向。

weixin_28335283的博客 975

STM32L4开发笔记(1):开发环境搭建

    STM32L系列是ST公司推出的专门面向低功耗需求的单片机,目前成为很多可穿戴设备的首选方案。     以前做过STM32F系列开发,现在因为产品低功耗要求,需要使用STM32L4。现有一块NUCLEO-STM32L432KC开发板,所以本文内容主要基于该开发板,开发板官方网址为【NUCLEO-STM32L432KC】。 1.安装 Keil-MDK    Keil是STM32开发比...

雨寒sgg的博客 1万+

暴力破解pdf文档密码

相信小伙伴们都遇到这种情况;你收到了一些标题很吸引人的pdf文档 或者是重要数据泄露 学习资料总结,再或者是某机构的押题密卷,打开pdf却提示你要输入密码 因为不知道密码 只能弃罢。我就遇到过这种情况 网友发来了标题为某天一的押题密卷 ,我也想看看这个卷子的题怎么样,因为被设置了密码 我尝试用6到10位的纯数字组合来暴力破解这个pdf,结果三 四个小时都没找到正确的密码。有些网友为破解这个密码 请某宝某多来破解 也都没有破解成功。

shelter1234567的博客 1万+

多标签分类怎么做?(Python)

首先简单介绍下,多标签分类与多分类、多任务学习的关系: 多分类学习(Multi-class):分类器去划分的类别是多个的,但对于每一个样本只能有一个类别,类别间是互斥的。例如:分类器判断这只动物是猫、狗、猪,每个样本只能有一种类别,就是一个三分类任务。常用的做法是OVR、softmax多分类

y1282037271的博客 1360

基于STM32L4的硬核“shellcode”

有经验的程序员都知道源码需要进行编译、链接、封装,然后才能执行。那你知道如何为一块CPU编写并编译程序吗?知道编译后的程序如何写入MCU、并让CPU加载运行的吗?

有价值炮灰 1335

8.5/Q1,Charls最新高分文章解读!

8 257名受试者中,672人(8.14%)在9年内发生过卒中。在调整的多因素cox回归模型中,TyG和ABSI仍然是卒中的预测因素,TyG的HR为1.25(95%CI:1.06~1.47),ABSI的HR为1.33(95%CI:1.06~1.68)。TyG和ABSI联合诊断效能最高(AUC:0.579,95%CI:0.553~0.597),而TyG(AUC:0.566,95%CI:0.544~0.587)和ABSI(AUC:0.533,95%CI:0.524~0.597)的诊断效能最低。

gsky_sci的博客 1017

(实测可用)STM32L431RCT6开发板-实验7 外部中断实验

1、开发板资源简介 (1)开发板主芯片型号:STM32L431RCT6 (2)开发板主芯片封装:LQFP-64_10x10x05P (3)开发板主芯片内核:ARM® Cortex®-M4 (4)开发板主芯片主频:80MHz (5)开发板主芯片Flash大小:256KB (6)开发板主芯片RAM大小:64KB

zhej2014的博客 1796

Unity 面试篇|(六)数据结构和算法篇 【全面总结 | 持续更新】

先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样遍历完后,堆中的10000个数就是所需的最大的10000个。桶排序是计数排序的升级版。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。这样处理就可以分别在每个文件的10^6个数据中找出最大的10000个数,合并到一起在再找出1000*10000中的最终的结果。

游戏开发小Y的博客 12万+

含分布式电源的配电网三段式电流保护影响仿真研究

文章摘要 本文研究了分布式电源(DG)接入对配电网三段式电流保护的影响。通过在Matlab/Simulink平台搭建含同步发电机型DG的10kV配电网模型,设计了基于傅里叶算法的三段式电流保护模块(I段瞬时速断、II段限时速断、III段定时限过流)。研究分析了不同DG接入位置、容量及故障点对保护系统的影响机理。仿真结果表明,DG接入会改变故障电流特性,可能导致三种典型问题:保护范围扩大引起误动、保护灵敏度下降导致拒动,以及保护选择性丧失。该研究为含DG配电网的保护配置与整定提供了理论依据和仿真参考,对保障分

huanghm88的专栏 272

(实测可用)STM32L431RCT6开发板-实验10 ADC实验

1、开发板资源简介 (1)开发板主芯片型号:STM32L431RCT6 (2)开发板主芯片封装:LQFP-64_10x10x05P (3)开发板主芯片内核:ARM® Cortex®-M4 (4)开发板主芯片主频:80MHz (5)开发板主芯片Flash大小:256KB (6)开发板主芯片RAM大小:64KB

zhej2014的博客 4226

基于STM32设计的智能水产养殖系统(华为云IOT)(152)

当前设计的智能水产养殖系统主控芯片采用STM32F103RCT6,可以实现对水位、水温、水混浊度和PH值等参数的监测和控制,并且支持定时投喂功能。通过连接华为云物联网平台,将传感器数据上传到服务器,并通过Qt设计的Android手机APP来获取设备上传的数据,从而实现对养殖环境的远程监测和控制。

8829

STM32最小系统详解

STM32最小系统是确保微控制器正常工作的基础,主要由电源系统、时钟系统、复位电路和调试接口组成。电源系统为芯片提供稳定电压,涉及动态响应和退耦网络设计;时钟系统为芯片提供工作频率,需考虑晶振等效电路和时序分析;复位电路确保系统正确启动,涉及复位域和软件恢复策略;调试接口支持程序下载和性能分析。此外,电磁兼容性和信号完整性分析在现代设计中至关重要。最小系统的每个环节都需精心设计,以确保整体系统的可靠性和稳定性。

2401_88534745的博客 1415

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

STM32CubeMX基础例程(小熊派):07.SPI驱动LCD屏幕

1、准备开发板 这里我选用了一块网红开发板:”小熊派“,这款板子的人气比较高,还是全国大学生物联网设计竞赛(华为杯)的华为竞赛开发板,我个人也比较喜欢用这款板子,这款板子在放在纸箱吃灰半年之后,被我重新拿了起来,并想借此写博客的机会,整理一下自己的代码。 开发板功能区分布图 开发板俯视图 2、STM32CubeMX生成代码 搜索并选择芯片型号 配置系统时钟 配置时钟树 STM32L4的最高主频可达到80M,最后使HCLK = 80Mhz即可: 配置GPIO 配置SPI SPI2默认SCK引

qq_42523645的博客 5294

FreeRTOS学习笔记01 | 移植FreeRTOS到小熊派开发板(STM32L431RC)

一、移植准备 1. 硬件准备 本文中使用的开发板为小熊派IoT开发板,主控为STM32L431RCT6: 2. 下载FreeRTOS源码 FreeRTOS源码分为两种,一种是FreeRTOS包,另一种是FreeRTOS LTS Release包。 2.1. FreeRTOS版本 这种版本包含FreeRTOS内核的源码和示例工程,还有FreeRTOS+的一些扩展库。可以通过下面的两种方式下载: 官方下载链接:下载官方发布的包,截至发文时间,最新发布的版本为FreeRTOSv202012.00.zip。 G

Mculover666的博客(嵌入式) 2937
上一篇: 潘多拉STM32L4 96 IoT开发板(HAL库) 4.按键输入实验
下一篇: 潘多拉STM32L4 96 IoT开发板(HAL库) 6.通过USART1串口完整实现信息接收与发送
硅基造物主
博客等级 码龄4年 17粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值