【STM32-学习笔记-6-】DMA
文章目录
- DMA
- Ⅰ、DMA框图
- Ⅱ、DMA基本结构
- Ⅲ、不同外设的DMA请求
- Ⅳ、DMA函数
- Ⅴ、DMA_InitTypeDef结构体参数
- ①、DMA_PeripheralBaseAddr
- ②、DMA_PeripheralDataSize
- ③、DMA_PeripheralInc
- ④、DMA_MemoryBaseAddr
- ⑤、DMA_MemoryDataSize
- ⑥、DMA_MemoryInc
- ⑦、DMA_DIR
- ⑧、DMA_BufferSize
- ⑨、DMA_Mode
- ⑩、DMA_M2M
- ①①、DMA_Priority
- Ⅵ、DMA配置示例
- DMA+AD多通道
- 1. ADC单次扫描+DMA数据转运
- 2. ADC连续扫描+DMA循环转运
DMA
Ⅰ、DMA框图
Ⅱ、DMA基本结构
Ⅲ、不同外设的DMA请求
Ⅳ、DMA函数
// 重置指定的DMA通道寄存器为默认值
void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx);// 初始化指定的DMA通道,根据初始化结构体配置参数
void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct);// 初始化DMA初始化结构体的默认值
void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct);// 开启或关闭指定的DMA通道
void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState);// 开启或关闭DMA通道的中断
void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState);// 设置DMA当前数据计数器的值
void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber); // 获取DMA当前数据计数器的值
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx);// 获取DMA标志状态
FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG);
// 清除DMA标志
void DMA_ClearFlag(uint32_t DMAy_FLAG);// 获取DMA中断状态
ITStatus DMA_GetITStatus(uint32_t DMAy_IT);
// 清除DMA中断待处理位
void DMA_ClearITPendingBit(uint32_t DMAy_IT);
Ⅴ、DMA_InitTypeDef结构体参数
①、DMA_PeripheralBaseAddr
指定DMA通道的外设基地址(外设寄存器-起始地址)
- 类型:
uint32_t
- 取值范围:任意有效的外设地址
- 作用:这是DMA操作的外设端的起始地址,例如ADC、USART等外设的数据寄存器地址
②、DMA_PeripheralDataSize
指定外设寄存器的数据宽度 (配置DMA传输时外设数据的大小)
该参数可以是
@ref DMA_peripheral_data_size
:
宏定义解释
DMA_PeripheralDataSize_Byte
- 描述:表示外设数据大小为1字节(8位)
- 每次DMA传输的数据大小为1字节
DMA_PeripheralDataSize_HalfWord
- 描述:表示外设数据大小为半字(16位)
- 每次DMA传输的数据大小为2字节
DMA_PeripheralDataSize_Word
- 描述:表示外设数据大小为1字(32位)
- 每次DMA传输的数据大小为4字节
宏函数
IS_DMA_PERIPHERAL_DATA_SIZE(SIZE)
- 描述:检查给定的外设数据大小设置是否有效
- 参数:
SIZE
,代表DMA的外设数据大小- 功能:检查
SIZE
是否等于DMA_PeripheralDataSize_Byte
、DMA_PeripheralDataSize_HalfWord
或DMA_PeripheralDataSize_Word
中的任一个。- 返回值:如果
SIZE
有效,返回1
(真),否则返回0
(假)
③、DMA_PeripheralInc
指定外设地址寄存器是否递增
- 类型:
uint32_t
- 取值范围:
DMA_PeripheralInc_Disable
:外设地址不递增DMA_PeripheralInc_Enable
:外设地址递增- 作用:控制外设地址在每次数据传输后是否递增
④、DMA_MemoryBaseAddr
指定DMA通道的内存基地址 (存储器-起始地址)
- 类型:
uint32_t
- 取值范围:任意有效的内存地址
- 作用:这是DMA操作的内存端的起始地址,例如一个缓冲区的起始地址
⑤、DMA_MemoryDataSize
指定内存数据宽度(存储器-数据宽度)
- 类型:
uint32_t
- 取值范围:
DMA_MemoryDataSize_Byte
:数据宽度为8位DMA_MemoryDataSize_HalfWord
:数据宽度为16位DMA_MemoryDataSize_Word
:数据宽度为32位- 作用:确定内存数据的大小
⑥、DMA_MemoryInc
指定内存地址寄存器是否递增(指定存储器-是否递增)
- 类型:
uint32_t
- 取值范围:
DMA_MemoryInc_Disable
:内存地址不递增DMA_MemoryInc_Enable
:内存地址递增- 作用:控制内存地址在每次数据传输后是否递增
⑦、DMA_DIR
指定数据传输方向,即外设是数据源还是数据目标(指定外设站点是源还是目标)
- 类型:
uint32_t
- 取值范围:
DMA_DIR_PeripheralSRC
:外设是数据源,内存是数据目标DMA_DIR_PeripheralDST
:外设是数据目标,内存是数据源- 作用:确定数据传输的方向
⑧、DMA_BufferSize
指定DMA通道的缓冲区大小,以数据单元为单位
DMA_InitStruct.DMA_BufferSize = Size;
传递Size个大小为<数据宽度>的数据
- 类型:
uint32_t
- 取值范围:0到65535
- 作用:确定要传输的数据量。数据单元的大小取决于
DMA_PeripheralDataSize
或DMA_MemoryDataSize
的配置,具体取决于传输方向
⑨、DMA_Mode
指定DMAy通道的工作模式(是否要自动重装)
- 类型:
uint32_t
- 取值范围:
DMA_Mode_Normal
:正常模式,传输完成后停止DMA_Mode_Circular
:循环模式(自动重装),传输完成后从头开始- 作用:确定DMA传输的模式。循环模式不适用于内存到内存的传输
⑩、DMA_M2M
是否使用软件触发(存储器到存储器)
- 类型:
uint32_t
- 描述:指定DMA通道是否用于内存到内存的传输
- 取值范围:
DMA_M2M_Disable
:不使用内存到内存传输DMA_M2M_Enable
:使用内存到内存传输- 作用:确定DMA通道是否用于内存到内存的传输
①①、DMA_Priority
指定DMA通道的软件优先级
按需求配置
- 类型:
uint32_t
- 取值范围:
DMA_Priority_Low
:低优先级DMA_Priority_Medium
:中优先级DMA_Priority_High
:高优先级DMA_Priority_VeryHigh
:非常高优先级- 作用:确定DMA通道的优先级,影响多个DMA请求的处理顺序
Ⅵ、DMA配置示例
#include "stm32f10x.h" // Device headeruint32_t Temp_Size;//存储数据计数器的值void MyDMA_Init(uint32_t Source, uint32_t Dest, uint32_t Size)//参数需为两个数组的数组名
{Temp_Size = Size;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);DMA_InitTypeDef DMA_InitStruct;DMA_InitStruct.DMA_PeripheralBaseAddr = Source;//外设寄存器-起始地址DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设寄存器-数据宽度(此处为1byte)DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Enable;//指定外设地址寄存器-是否递增DMA_InitStruct.DMA_MemoryBaseAddr = Dest;//存储器-起始地址DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//存储器-数据宽度DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;//指定存储器-是否递增DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;//指定外设站点是源还是目标DMA_InitStruct.DMA_BufferSize = Size;//传递Size个大小为<数据宽度>的数据DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;//指定DMAy通道的工作模式(是否要自动重装)DMA_InitStruct.DMA_M2M = DMA_M2M_Enable;//是否使用软件触发(存储器到存储器)DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;//指定DMAy通道的软件优先级DMA_Init(DMA1_Channel1, &DMA_InitStruct);DMA_Cmd(DMA1_Channel1, DISABLE);//使能或失能DMA
}void MyDMA_Transfer(void)//调用函数则开始转运
{DMA_Cmd(DMA1_Channel1, DISABLE);//失能DMADMA_SetCurrDataCounter(DMA1_Channel1, Temp_Size);//设置DMA当前数据计数器的值DMA_Cmd(DMA1_Channel1, ENABLE);//使能DMAwhile(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET)//获取DMA标志状态(等待转运完成)DMA_ClearFlag(DMA1_FLAG_TC1);//清除DMA标志位
}
DMA+AD多通道
1. ADC单次扫描+DMA数据转运
#include "stm32f10x.h" // Device header
//模拟量转换为数字量
//AD多通道(ADC扫描模式+DMA数据转运)uint16_t Dest_Data[4];void AD_Init(void)
{ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//开启ADC时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//开启DMA时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC时钟(72MHz/6=12MHz)//配置GPIOGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_41Cycles5);//配置ADC常规通道ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_41Cycles5);//配置ADC常规通道ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_41Cycles5);//配置ADC常规通道ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_41Cycles5);//配置ADC常规通道//配置ADCADC_InitTypeDef ADC_InitStruct;ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//将ADC配置为独立或操作双模式ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不使用外部触发ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//单次转换or连续转换ADC_InitStruct.ADC_ScanConvMode = ENABLE;//非扫描模式or扫描模式ADC_InitStruct.ADC_NbrOfChannel = 4;//指定要转换的ADC通道的数量ADC_Init(ADC1, &ADC_InitStruct);//配置DMA DMA_InitTypeDef DMA_InitStruct;DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;//外设寄存器-起始地址DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设寄存器-数据宽度(此处为1byte)DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//指定外设地址寄存器-是否递增DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)Dest_Data;//存储器-起始地址DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//存储器-数据宽度DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;//指定存储器-是否递增DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;//指定外设站点是源还是目标DMA_InitStruct.DMA_BufferSize = 4;//传递Size个大小为<数据宽度>的数据DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;//指定DMAy通道的工作模式(是否要自动重装)DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;//是否使用软件触发(存储器到存储器)DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;//指定DMAy通道的软件优先级DMA_Init(DMA1_Channel1, &DMA_InitStruct);ADC_DMACmd(ADC1, ENABLE);//开启ADC的DMA功能DMA_Cmd(DMA1_Channel1, ENABLE);//使能或失能DMAADC_Cmd(ADC1, ENABLE);//开启ADC//ADC复位+校准ADC_ResetCalibration(ADC1);//重置ADC校准,准备进行校准操作while(ADC_GetResetCalibrationStatus(ADC1) == SET);//获取ADC重置校准状态,检查是否完成ADC_StartCalibration(ADC1);//开始ADC校准while(ADC_GetCalibrationStatus(ADC1) == SET);//获取ADC校准状态,检查是否完成
}void AD_GetValue(void)//获取模拟值
{//选择不同的通道或取ADC值DMA_Cmd(DMA1_Channel1, DISABLE);//失能DMADMA_SetCurrDataCounter(DMA1_Channel1, 4);//设置DMA当前数据计数器的值DMA_Cmd(DMA1_Channel1, ENABLE);//使能DMAADC_SoftwareStartConvCmd(ADC1, ENABLE);//开启软件启动ADC转换,用于软件触发转换--启动while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET)//获取DMA标志状态(等待转运完成)DMA_ClearFlag(DMA1_FLAG_TC1);//清除DMA标志位}
2. ADC连续扫描+DMA循环转运
#include "stm32f10x.h" // Device header
//模拟量转换为数字量
//AD多通道(ADC连续扫描+DMA循环转运)uint16_t Dest_Data[4];void AD_Init(void)
{ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//开启ADC时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//开启DMA时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC时钟(72MHz/6=12MHz)//配置GPIOGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_41Cycles5);//配置ADC常规通道ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_41Cycles5);//配置ADC常规通道ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_41Cycles5);//配置ADC常规通道ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_41Cycles5);//配置ADC常规通道//配置ADCADC_InitTypeDef ADC_InitStruct;ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//将ADC配置为独立或操作双模式ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不使用外部触发ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;//单次转换or连续转换**********************************************ADC_InitStruct.ADC_ScanConvMode = ENABLE;//非扫描模式or扫描模式ADC_InitStruct.ADC_NbrOfChannel = 4;//指定要转换的ADC通道的数量ADC_Init(ADC1, &ADC_InitStruct);//配置DMA DMA_InitTypeDef DMA_InitStruct;DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;//外设寄存器-起始地址DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设寄存器-数据宽度(此处为1byte)DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//指定外设地址寄存器-是否递增DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)Dest_Data;//存储器-起始地址DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//存储器-数据宽度DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;//指定存储器-是否递增DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;//指定外设站点是源还是目标DMA_InitStruct.DMA_BufferSize = 4;//传递Size个大小为<数据宽度>的数据DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;//指定DMAy通道的工作模式(是否要自动重装)******************************DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;//是否使用软件触发(存储器到存储器)DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;//指定DMAy通道的软件优先级DMA_Init(DMA1_Channel1, &DMA_InitStruct);ADC_DMACmd(ADC1, ENABLE);//开启ADC的DMA功能DMA_Cmd(DMA1_Channel1, ENABLE);//使能或失能DMAADC_Cmd(ADC1, ENABLE);//开启ADC//ADC复位+校准ADC_ResetCalibration(ADC1);//重置ADC校准,准备进行校准操作while(ADC_GetResetCalibrationStatus(ADC1) == SET);//获取ADC重置校准状态,检查是否完成ADC_StartCalibration(ADC1);//开始ADC校准while(ADC_GetCalibrationStatus(ADC1) == SET);//获取ADC校准状态,检查是否完成ADC_SoftwareStartConvCmd(ADC1, ENABLE);//开启软件启动ADC转换,用于软件触发转换--启动********************************
}
//*****************************************************************************************
相关文章:

【STM32-学习笔记-6-】DMA
文章目录 DMAⅠ、DMA框图Ⅱ、DMA基本结构Ⅲ、不同外设的DMA请求Ⅳ、DMA函数Ⅴ、DMA_InitTypeDef结构体参数①、DMA_PeripheralBaseAddr②、DMA_PeripheralDataSize③、DMA_PeripheralInc④、DMA_MemoryBaseAddr⑤、DMA_MemoryDataSize⑥、DMA_MemoryInc⑦、DMA_DIR⑧、DMA_Buff…...
js实现一个可以自动重链的websocket客户端
class WebSocketClient {constructor(url, callback, options {}) {this.url url; // WebSocket 服务器地址this.options options; // 配置选项(例如重试间隔、最大重试次数等)this.retryInterval options.retryInterval || 1000; // 重试间隔&#…...

企业总部和分支通过GRE VPN互通
PC1可以ping通PC2 1、首先按照地址表配置ip地址 2、分别在AR1和AR3上配置nat 3、配置GRE a 创建tunnel接口,并选择tunnel协议为GRE,为隧道创建一个地址,用作互联 b 为隧道配置源地址或者源接口,这里选择源接口;再为…...

油猴支持阿里云自动登陆插件
遇到的以下问题,都已在脚本中解决: 获取到的元素赋值在页面显示,但是底层的value并没有改写,导致请求就是获取不到数据元素的加载时机不定,尤其是弱网情况下,只靠延迟还是有可能获取不到,且登陆…...

【2024年华为OD机试】(C卷,100分)- 字符串筛选排序 (Java JS PythonC/C++)
一、问题描述 题目描述 输入一个由N个大小写字母组成的字符串 按照ASCII码值从小到大进行排序 查找字符串中第K个最小ASCII码值的字母 (k > 1) 输出该字母所在字符串中的位置索引 (字符串的第一个位置索引为0) k如果大于字符串长度则输出最大ASCII码值的字母所在字符串…...
iOS - runtime总结
详细总结一下 Runtime 的核心内容: 1. 消息发送机制 // 消息发送的基本流程 id objc_msgSend(id self, SEL _cmd, ...) {// 1. 获取 isaClass cls object_getClass(self);// 2. 查找缓存IMP imp cache_getImp(cls, _cmd);if (imp) return imp(self, _cmd, ...);…...

第33 章 - ES 实战篇 - MySQL 与 Elasticsearch 的一致性问题
思维导图 0. 前言 MySQL 与 Elasticsearch 一致性问题是老生常谈了。网上有太多关于这方面的文章了,但是千篇一律,看了跟没看没有太大区别。 在生产中,我们往往会通过 DTS 工具将 binlog 导入到 Kafka,再通过 Kafka 消费 binlog&…...

Artec Leo 3D扫描仪与Ray助力野生水生动物法医鉴定【沪敖3D】
挑战:捕获大型水生哺乳动物(如鲸鱼)的数据,搭建全彩3D模型,用于水生野生动物的法医鉴定、研究和保护工作。 解决方案:Artec Eva、Artec Space Spider、Artec Leo、Artec Ray、Artec Studio、CT scans 效果&…...
PythonQT5打包exe线程使用
打包: pyinstaller --noconsole --onefile test.py–noconsole 表示不需要打开命令行 修改:test.spec 一般项目里面需要用的资源文件,比如lib、png、exe等。 需要单独修改spec文件 pathex[.],binaries[(D:/test.png, .),(D:/simsun.ttc, .…...

【Powershell】Windows大法powershell好(二)
PowerShell基础(二) 声明:该笔记为up主 泷羽的课程笔记,本节链接指路。 警告:本教程仅作学习用途,若有用于非法行为的,概不负责。 1. powershell 执行外部命令 powershell也可以执行一些外部的…...
前端学习-环境this对象以及回调函数(二十七)
目录 前言 目标 环境对象 作用 环境对象this是什么? 判断this指向的粗略规则是什么? 回调函数 目标 常见的使用场景 综合案例:Tab任务栏切换 总结 前言 男儿何不带吴钩,收取关山五十州 目标 能够分析判断函数运行在不…...

Element-plus、Element-ui之Tree 树形控件回显Bug问题。
需求:提交时,需要把选中状态和半选中状态 的数据id提交。如图所示: 数据回显时,会出现代码如下: <template><el-tree ref"treeRef" :data"tree" show-checkbox node-key"id" …...

互联网全景消息(10)之Kafka深度剖析(中)
一、深入应用 1.1 SpringBoot集成Kafka 引入对应的依赖。 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupI…...
Oracle Dataguard(主库为双节点集群)配置详解(5):将主库复制到备库并启动同步
Oracle Dataguard(主库为双节点集群)配置详解(5):将主库复制到备库并启动同步 目录 Oracle Dataguard(主库为双节点集群)配置详解(5):将主库复制到备库并启动…...
pytorch小记(一):pytorch矩阵乘法:torch.matmul(x, y)
pytorch小记(一):pytorch矩阵乘法:torch.matmul(x, y)/ x y 代码代码 1:torch.matmul(x, y)输入张量:计算逻辑:输出结果: 代码 2:y y.view(4,1)…...

PyTorch环境配置常见报错的解决办法
目标 小白在最基础的环境配置里一般都会出现许多问题。 这里把一些常见的问题分享出来。希望可以节省大家一些时间。 最终目标是可以在cmd虚拟环境里进入jupyter notebook,new的时候有对应的环境,并且可以跑通所有的import code。 第一步:…...

罗永浩再创业,这次盯上了 AI?
罗永浩,1972年7月9日生于中国延边朝鲜族自治州的一个军人家庭,是一名朝鲜族人;早年在新东方授课,2004年当选 “网络十大红人” ;2006年8月1日,罗永浩创办牛博网;2008年5月,罗永浩注册…...
VUE3 provide 和 inject,跨越多层级组件传递数据
provide 和 inject 是 Vue 3 提供的 API,主要用于实现祖先组件与后代组件之间的依赖注入。它们可以让你在组件树中,跨越多层组件传递数据,而不需要通过 props 或事件的方式逐层传递。这个机制主要用于状态共享、插件系统或某些跨层级的功能。…...

git打补丁
1、应用场景 跨仓库升级 开发项目B使用的是开源项目A。开源项目A发现漏洞,作者进行了修复,我们可以通过使用git补丁的方式,将作者修改的内容复制到我 们的项目B中。 2、TortoiseGit方式 源仓库 格式化补丁 根据提交数量,生成…...

机械燃油车知识图谱、知识大纲、知识结构(持续更新...)
一、发动机 曲柄连杆机构 配气机构 点火系统 起动系统 燃油供给系统 润滑系统 冷却系统 二、底盘 (一)传动系统 1、离合器 2、变速器 3、万向传动装置 4、驱动桥 (二)行驶系统 1、车架 2、车桥 3、悬架 4、车轮 &a…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

Java设计模式:责任链模式
一、什么是责任链模式? 责任链模式(Chain of Responsibility Pattern) 是一种 行为型设计模式,它通过将请求沿着一条处理链传递,直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者,…...

【基于阿里云搭建数据仓库(离线)】使用UDTF时出现报错“FlatEventUDTF cannot be resolved”
目录 问题: 可能的原因有: 解决方法: 问题: 已经将包含第三方依赖的jar包上传到dataworks,并且成功注册函数,但是还是报错:“FlatEventUDTF cannot be resolved”,如下:…...
unipp---HarmonyOS 应用开发实战
HarmonyOS 应用开发实战指南 1. 开篇:为什么选择 HarmonyOS? 最近在开发鸿蒙应用时,发现很多开发者都在问:为什么要选择 HarmonyOS?这里分享一下我的看法: 生态优势 华为手机用户基数大,市场潜…...
Ntfs!ReadIndexBuffer函数分析之nt!CcGetVirtualAddress函数之nt!CcGetVacbMiss
第一部分: NtfsMapStream( IrpContext, Scb, LlBytesFromIndexBlocks( IndexBlock, Scb->ScbType.Index.IndexBlockByteShift ), Scb->ScbType.Index.BytesPerIndexBuffer, &am…...

STM32入门学习之系统时钟配置
1. 时钟就是单片机的心脏。单片机根据时钟频率来控制每个部件的工作,时钟是单片机的脉搏,决定了每条命令运行的速率,没有时钟单片机将停止工作。 如何理解“时钟决定了单片机每条命令运行的速率”? 首先需要去理解单片机中的时…...

MSYS2 环境配置与 Python 项目依赖管理笔记
#工作记录 MSYS2 环境配置 安装和更新 MSYS2 初始安装 下载并安装 MSYS2: 访问 MSYS2 官方网站 并下载安装包。 按照安装向导完成安装。 更新 MSYS2: 打开 MSYS2 终端(MSYS2 MINGW64)。 更新包数据库和核心系统包࿱…...

HarmonyOS:如何在启动框架中初始化HMRouter
应用启动时通常需要执行一系列初始化启动任务,如果将启动任务都放在应用主模块(即entry类型的Module)的UIAbility组件的onCreate生命周期中,那么只能在主线程中依次执行,不但影响应用的启动速度,而且当启动…...