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

STM32学习笔记------编程驱动蜂鸣器实现音乐播放

1. 硬件准备

  • STM32开发板:STM32F407系列
  • 蜂鸣器:常见的蜂鸣器分为两类:有源蜂鸣器和无源蜂鸣器。若使用有源蜂鸣器,只需提供电源和控制信号即可;若使用无源蜂鸣器,则需要控制频率。
  • 外接电源(可选):确保为蜂鸣器提供足够的电源。

以下是蜂鸣器的原理图 

 

2. 选择控制方式

对于音乐播放,主要使用PWM(脉宽调制)信号来控制蜂鸣器的发声频率。通过改变PWM的占空比和频率,可以模拟不同的音调和音量。

3. GPIO配置

  • 将蜂鸣器连接到STM32的某一个GPIO口,比如PA8或PB5。
  • 该GPIO口配置为输出模式。

4. 定时器配置

要通过PWM信号控制蜂鸣器的频率,我们通常使用STM32的定时器模块来产生PWM信号。

  • 选择定时器:选择一个适合的定时器,比如TIM2或TIM3。
  • 配置定时器:设置定时器的计数频率,计算所需的PWM频率(比如440Hz对应音乐中的A4音符)。

5. 计算音符频率

 

6. PWM输出控制

通过定时器配置的PWM输出控制蜂鸣器的发声。需要设置:

  • PWM周期:对应音符的频率。
  • PWM占空比:设置蜂鸣器的响度,通常为50%(即高电平和低电平的时间相等)。

7. 编写代码

(1)编写一个延时函数
/* 延时函数 */
void delay_ms(uint32_t n)
{while(n--){SysTick->CTRL = 0; /* 关闭系统定时器,才能对系统定时器进行配置 */SysTick->LOAD = 168000-1;  /* 设置定时器重载值(168MHz 时钟频率下,每毫秒的计数值)168000 - 1 表示定时器计数到 167999 之后产生中断,这相当于 1 毫秒(168 MHz 时钟)*/SysTick->VAL = 0; /* 清空当前计数值,还有清空COUNTFLAG标志位 */SysTick->CTRL = 5; /* 启动定时器,使用处理器时钟频率(168 MHz),并使能定时器5 是控制寄存器的值,低 2 位分别设置时钟源和使能定时器*//* 等待计时器计数完毕。通过检查 COUNTFLAG 标志位(CTRL寄存器的 16 位)*/while ((SysTick->CTRL & 0x10000)==0);//,等待COUNTFLAG标志位置1,就是计数完毕}SysTick->CTRL = 0; /* 关闭系统定时器 释放资源 */}
(2)初始化GPIO和定时器 

 

void led_init(void)
{/* 打开端口E F的硬件时钟(就是对硬件供电),默认状态下,所有时钟都是关闭 */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//指定9引脚GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;//引脚工作在复用功能模式GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度越高,响应时间越短,但是功耗就越高,电磁干扰也越高GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//如果外部没有上拉电阻,就配置推挽输出模式GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//不需要使能上下拉电阻GPIO_Init(GPIOF,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;//指定13 14号引脚GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;//引脚工作在输出模式GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度越高,响应时间越短,但是功耗就越高,电磁干扰也越高GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//如果外部没有上拉电阻,就配置推挽输出模式GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//不需要使能上下拉电阻GPIO_Init(GPIOE,&GPIO_InitStructure);	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;//指定13 14号引脚GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;//引脚工作在输出模式GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度越高,响应时间越短,但是功耗就越高,电磁干扰也越高GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//如果外部没有上拉电阻,就配置推挽输出模式GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//不需要使能上下拉电阻GPIO_Init(GPIOE,&GPIO_InitStructure);
}
void tim13_init(void)
{/* 打开TIM13的硬件时钟,对TIM13供电 */RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13,ENABLE);	/* 配置TIM13:分频值、计数值、时间更新中断 */TIM_TimeBaseStructure.TIM_Period = 10000/100-1; //输出频率为100Hz (计数值:0~99 当完成100个计数,就输出一个脉冲)TIM_TimeBaseStructure.TIM_Prescaler = 8400-1;//进行8400的分频,84MHz/(8400-1+1)//TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2;//不会生效TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数TIM_TimeBaseInit(TIM13, &TIM_TimeBaseStructure);/* 配置TIM13的通道1 */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//使能脉冲输出TIM_OCInitStructure.TIM_Pulse = 0;//比较值0,蜂鸣器为关闭状态TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//有效状态为高电平TIM_OC1Init(TIM13, &TIM_OCInitStructure);/* 使能TIM13工作 */TIM_Cmd(TIM13, ENABLE);
}
(3)播放音符

接下来,可以通过控制定时器的TIM_Period值来控制音符的频率。

void tim13_set_freq(uint32_t freq)
{/* 关闭TIM13 */TIM_Cmd(TIM13, DISABLE);/*定时器的基本配置,用于配置定时器的输出脉冲的频率为 freq Hz */TIM_TimeBaseStructure.TIM_Period = (400000/freq)-1; //设置定时脉冲的频率TIM_TimeBaseStructure.TIM_Prescaler = 210-1; //第一次分频,简称为预分频TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;tim13_cnt= TIM_TimeBaseStructure.TIM_Period;TIM_TimeBaseInit(TIM13, &TIM_TimeBaseStructure);/* 使能TIM13 */TIM_Cmd(TIM13, ENABLE);	
}void tim13_set_duty(uint32_t duty)
{uint32_t cmp=0;cmp = (tim13_cnt+1) * duty/100;TIM_SetCompare1(TIM13,cmp);
}

8. 实现音乐播放

通过将每个音符的频率和时长传入,依次播放不同的音符。可以使用延时函数来控制每个音符的播放时长。
源代码:
 

#include "stm32f4xx.h"#define PEout(n)	(*(uint32_t *)(0x42000000+(GPIOE_BASE+0x14-0x40000000)*32+n*4))
#define PFout(n)	(*(uint32_t *)(0x42000000+(GPIOF_BASE+0x14-0x40000000)*32+n*4))GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;static uint32_t tim13_cnt=0;/* 毫秒延时函数 */
void delay_ms(uint32_t n)
{while(n--){SysTick->CTRL = 0; /* 关闭系统定时器,才能对系统定时器进行配置 */SysTick->LOAD = 168000-1;  /* 设置定时器重载值(168MHz 时钟频率下,每毫秒的计数值)168000 - 1 表示定时器计数到 167999 之后产生中断,这相当于 1 毫秒(168 MHz 时钟)*/SysTick->VAL = 0; /* 清空当前计数值,还有清空COUNTFLAG标志位 */SysTick->CTRL = 5; /* 启动定时器,使用处理器时钟频率(168 MHz),并使能定时器5 是控制寄存器的值,低 2 位分别设置时钟源和使能定时器*//* 等待计时器计数完毕。通过检查 COUNTFLAG 标志位(CTRL寄存器的 16 位)*/while ((SysTick->CTRL & 0x10000)==0);//,等待COUNTFLAG标志位置1,就是计数完毕}SysTick->CTRL = 0; /* 关闭系统定时器 释放资源 */}void delay_us(uint32_t n)
{SysTick->CTRL = 0; // 关闭系统定时器,才能对系统定时器进行配置SysTick->LOAD = 168*n-1; // Count from 167 to 0 (168 cycles)SysTick->VAL = 0; // Clear current value as well as count flag,清空当前计数值,还有清空COUNTFLAG标志位SysTick->CTRL = 5; // Enable SysTick timer with processor clock,使用处理器时钟频率168MHz,并使能系统定时器while ((SysTick->CTRL & 0x10000)==0);// Wait until count flag is set,等待COUNTFLAG标志位置1,就是计数完毕SysTick->CTRL = 0; // Disable SysTick,关闭系统定时器	}void led_init(void)
{/* 打开端口E F的硬件时钟(就是对硬件供电),默认状态下,所有时钟都是关闭 */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//指定9引脚GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;//引脚工作在复用功能模式GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度越高,响应时间越短,但是功耗就越高,电磁干扰也越高GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//如果外部没有上拉电阻,就配置推挽输出模式GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//不需要使能上下拉电阻GPIO_Init(GPIOF,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;//指定13 14号引脚GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;//引脚工作在输出模式GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度越高,响应时间越短,但是功耗就越高,电磁干扰也越高GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//如果外部没有上拉电阻,就配置推挽输出模式GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//不需要使能上下拉电阻GPIO_Init(GPIOE,&GPIO_InitStructure);	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;//指定13 14号引脚GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;//引脚工作在输出模式GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度越高,响应时间越短,但是功耗就越高,电磁干扰也越高GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//如果外部没有上拉电阻,就配置推挽输出模式GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//不需要使能上下拉电阻GPIO_Init(GPIOE,&GPIO_InitStructure);
}void tim13_init(void)
{/* 打开TIM13的硬件时钟,对TIM13供电 */RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13,ENABLE);	/* 配置TIM13:分频值、计数值、时间更新中断 */TIM_TimeBaseStructure.TIM_Period = 10000/100-1; //输出频率为100Hz (计数值:0~99 当完成100个计数,就输出一个脉冲)TIM_TimeBaseStructure.TIM_Prescaler = 8400-1;//进行8400的分频,84MHz/(8400-1+1)//TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2;//不会生效TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数TIM_TimeBaseInit(TIM13, &TIM_TimeBaseStructure);/* 配置TIM13的通道1 */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//使能脉冲输出TIM_OCInitStructure.TIM_Pulse = 0;//比较值0,蜂鸣器为关闭状态TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//有效状态为高电平TIM_OC1Init(TIM13, &TIM_OCInitStructure);/* 使能TIM13工作 */TIM_Cmd(TIM13, ENABLE);
}void tim13_set_freq(uint32_t freq)
{/* 关闭TIM13 */TIM_Cmd(TIM13, DISABLE);/*定时器的基本配置,用于配置定时器的输出脉冲的频率为 freq Hz */TIM_TimeBaseStructure.TIM_Period = (400000/freq)-1; //设置定时脉冲的频率TIM_TimeBaseStructure.TIM_Prescaler = 210-1; //第一次分频,简称为预分频TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;tim13_cnt= TIM_TimeBaseStructure.TIM_Period;TIM_TimeBaseInit(TIM13, &TIM_TimeBaseStructure);/* 使能TIM13 */TIM_Cmd(TIM13, ENABLE);	
}void tim13_set_duty(uint32_t duty)
{uint32_t cmp=0;cmp = (tim13_cnt+1) * duty/100;TIM_SetCompare1(TIM13,cmp);
}/* 主函数 */
int main(void)
{		led_init();/* PF8连接到TIM13 */GPIO_PinAFConfig(GPIOF, GPIO_PinSource8, GPIO_AF_TIM13);tim13_init();while(1){/* 设置频率为523Hz,占空比15% */tim13_set_freq(523);tim13_set_duty(15);delay_ms(500);  // 延时500ms,确保每个音符的持续时间/* 设置频率为587Hz,占空比15% */tim13_set_freq(587);tim13_set_duty(15);delay_ms(500);/* 设置频率为659Hz,占空比15% */tim13_set_freq(659);tim13_set_duty(15);delay_ms(500);/* 设置频率为698Hz,占空比15% */tim13_set_freq(698);tim13_set_duty(15);delay_ms(500);/* 设置频率为784Hz,占空比15% */tim13_set_freq(784);tim13_set_duty(15);delay_ms(500);/* 设置频率为880Hz,占空比15% */tim13_set_freq(880);tim13_set_duty(15);delay_ms(500);/* 设置频率为988Hz,占空比15% */tim13_set_freq(988);tim13_set_duty(15);delay_ms(500);}
}

 可以在STM32上使用定时器和PWM信号控制蜂鸣器,实现简单的音乐播放。可以根据需要添加更多音符,生成完整的曲谱,甚至实现更复杂的音效和音量控制。

相关文章:

STM32学习笔记------编程驱动蜂鸣器实现音乐播放

1. 硬件准备 STM32开发板:STM32F407系列蜂鸣器:常见的蜂鸣器分为两类:有源蜂鸣器和无源蜂鸣器。若使用有源蜂鸣器,只需提供电源和控制信号即可;若使用无源蜂鸣器,则需要控制频率。外接电源(可选…...

ubuntu18.04 安装与卸载NCCL conda环境安装PaddlePaddle

cuda版本11.2 说明PaddlePaddle需要安装NCCL 1、Log in | NVIDIA Developer 登录官网 找到对应版本 官方提供了多种安装方式,本文使用Local installers (x86)本地安装 点击对应的版本下载如: nccl-local-repo-ubuntu1804-2.8.4-cuda11.2_1.0-1_amd6…...

AI有鼻子了,还能远程传输气味,图像生成香水

众所周知,图像、音乐能用AI生成,但出乎意料的是,气味也行。最近,一个名叫Osmo的初创公司宣布,他们成功地将气味数字化了。第一个成功的案例是“新鲜的夏季李子”,而且复现出的味道“闻起来”很不错。整个过…...

学习配置dify过程记录

最近在学习安装 Dify 并集成 Ollama 和 Xinference,学习过程中遇到很多问题,所以我都记录下来。 本人电脑环境:MacBook Pro 15.1系统 基本是基于B站教程一步步搭建: 【Dify快速入门 | 本地部署Dify基于Llama 3.1和OpenAI创建聊天机器人与知…...

简易抽奖器源码以及打包操作

import wx import random import time# 定义Myframe类,继承Frame class Myframe(wx.Frame):# 奖品rewards [桥本香奈, 二代CC, NaNa, 情深叉]# 构造方法def __init__(self):# 父类初始化super().__init__(None, title主界面, size(500, 400), pos(500, 200))# 创建面板&#x…...

一文了解什么是腾讯云开发

一文了解什么是腾讯云开发 关于云开发的猜想腾讯云开发腾讯云开发的优势无服务跨平台轻松托管节约成本 快速上手云开发环境快速搭建管理后台 云开发体验 关于云开发的猜想 说到云开发,作为开发者的大家是否大概就有了想法。比如说过去的开发工作都是在自己本地电脑…...

[CKS] K8S NetworkPolicy Set Up

最近准备花一周的时间准备CKS考试,在准备考试中发现有一个题目关于不安全项目修复的题目。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[CKS] K8S Ne…...

【JAVA】Java基础—面向对象编程:构造方法-实现一个Car类,包含多个构造方法,创建不同的汽车对象

在Java中,构造方法则是用于创建对象的特殊方法。通过构造方法,可以在创建对象时初始化其属性。构造方法的重载允许我们根据不同的需求定义多个构造方法,从而灵活地创建对象。 我们可以将汽车的构造方法比作汽车的配置选项。比如,…...

初识网络编程TCP/IP

目录 前言相关名词解释应用层协议——HTTP传输层协议socketTCP帧头格式三次握手、四次挥手 UDPTCP的socket实现 参考博文 前言 刚碰到网络编程,会出现一堆协议、概念、这层次那技术的,头都大了,还是得总结总结…… 相关名词解释 ✨✨网络…...

快速入门Zookeeper

Zookeeper ZooKeeper作为一个强大的开源分布式协调服务,扮演着分布式系统中至关重要的角色。它提供了一个中心化的服务,用于维护配置信息、命名、提供分布式同步以及提供组服务等。通过其高性能和可靠的特性,ZooKeeper能够确保在复杂的分布式…...

Filter and Search 筛选和搜索

Goto Data Grid 数据网格 Filter and Search 筛选和搜索 Filter Drop-down Menus (Excel-style) 筛选器下拉菜单(Excel 样式) 要调用列的筛选器下拉菜单,请单击列标题中的筛选器图标。在 “Values” 选项卡中,用户可以从 Data …...

spark的学习-06

SparkSQL读写数据的方式 1)输入Source 方式一:给定读取数据源的类型和地址 spark.read.format("json").load(path) spark.read.format("csv").load(path) spark.read.format("parquet").load(path) 方式二&#xff1a…...

Linux C/C++ Socket 编程

本文目录 Linux C语言 socket 编程 client 端头文件 unistd.h & arpa/inet.h1. **unistd.h**2. **arpa/inet.h** socket() 创建套接字sockaddr_in 结构体inet_pton()connect()send()recv()send() 和 recv() 中的 flags 参数**默认行为(flags 0)的特…...

Flutter错误: uses-sdk:minSdkVersion 16 cannot be smaller than version 21 declared

前言 今天要做蓝牙通信的功能,我使用了flutter_reactive_ble这个库,但是在运行的时候发现一下错误 Launching lib/main.dart on AQM AL10 in debug mode... /Users/macbook/Desktop/test/flutter/my_app/android/app/src/debug/AndroidManifest.xml Err…...

Spark 的容错机制:保障数据处理的稳定性与高效性

Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交:本地与集群模式全解析-CSDN博客 Spark on YARN:Spark集群模式…...

TCP可靠连接的建立和释放,TCP报文段的格式,UDP简单介绍

TCP连接的建立(三次握手) 建立连接使用的三报文 SYN 报文仅用于 TCP 三次握手中的第一个和第二个报文(SYN 和 SYN-ACK),用于初始化连接的序列号。数据传输阶段不再使用 SYN 标志。 SYN 报文通常只携带连接请求信息&a…...

LLMs之PDF:zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略

LLMs之PDF:zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略 目录 zeroX的简介 1、支持的文件类型 zeroX的安装和使用方法 T1、Node.js 版本: 安装 使用方法 使用文件 URL: 使用本地路径&…...

开源数据库 - mysql - mysql-server-8.4(gtid主主同步+ keepalived热切换)部署方案

前置条件 假设主从信息 mysqlhostport主192.168.1.13306从192.168.1.23306vip192.168.1.3 部署流程 导出测试环境表结构与数据 使用mysqldump ./mysqldump -ulzzc -p -S /tmp/mysql3306.sock --single-transaction --database lzzc > databaseLZZCxxxx.sql查看gtid号 …...

Java全栈体系路线

Java全栈体系路线 摘要 Java 是一门广泛应用于企业级开发的语言,具有强大的生态系统和丰富的工具支持。成为一名 Java 全栈开发工程师不仅需要掌握后端开发技能,还需要具备前端开发和数据库管理的能力。本文将详细介绍 Java 全栈开发的学习路线&#x…...

【Unity基础】Unity中如何导入字体?

在Unity中,不能像其他软件一样直接使用字体文件,需要通过FontAssetCreator将其转换成Texture的Asset文件,然后才能使用。 本文介绍了使用FontAssetCreator导入字体的过程,并对其参数设置进行了说明。 Font Asset Creator 是 Uni…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...

数据挖掘是什么?数据挖掘技术有哪些?

目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...

深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀”

深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀” 在JavaScript中,我们经常需要处理文本、数组、对象等数据类型。但当我们需要处理文件上传、图像处理、网络通信等场景时,单纯依赖字符串或数组就显得力不从心了。这时&#xff…...

LINUX编译vlc

下载 VideoLAN / VLC GitLab 选择最新的发布版本 准备 sudo apt install -y xcb bison sudo apt install -y autopoint sudo apt install -y autoconf automake libtool编译ffmpeg LINUX FFMPEG编译汇总(最简化)_底部的附件列表中】: ffmpeg - lzip…...

C++ 变量和基本类型

1、变量的声明和定义 1.1、变量声明规定了变量的类型和名字。定义初次之外,还申请存储空间,也可能会为变量赋一个初始值。 如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显式地初始化变量: e…...