STM32基礎教程——DMA+ADC多通道

目錄

前言

?編輯

技術實現

?連線圖

代碼實現?

技術要點

實驗結果

問題記錄


前言

DMA(Direct Memory Access)直接存儲器存取,用來提供在外設和存儲器 之間或者存儲器和存儲器之間的高速數據傳輸。無需CPU干預,數據可以通過DMA快速地移動,這樣可以節省CPU的資源進行其他操作。兩個DMA控制器有12個通道(DMA1有7個通道,DMA2有5個通道),每個通道專門用來管理來自與一個或多個外設對存儲器訪問的請求。還有一個仲裁器來協調各個DMA請求的優先權。

DMA的主要特性

  • 12個獨立的可配置的通道(請求):DMA1有7個 通道,DMA2有5個通道
  • 每個通道都直接連接專用的硬件DMA請求,每個通道都同樣支持軟件觸發。這些功能通過軟件來配置。
  • 在同一個DMA模塊上多個請求見的優先權可以通過軟件編程設置(共有四級:很高、高、中等和低),優先權設置相等時由硬件決定(請求0優先與請求1,以此類推)。
  • 獨立數據源和目標數據區的傳輸字節寬度(字節、半字、字),模擬打包和拆包的過程。源和目標地址必須按數據傳輸寬度對齊。
  • 支持循環的緩沖器管理
  • 每個通道都有3個事件標志(DMA半傳輸、DMA傳輸完成和DMA傳輸出錯),這三個事件標志邏輯或成為一個單獨的中斷請求。
  • 存儲器和存儲器之間的傳輸。
  • 外設和存儲器、存儲器和外設之間的傳輸。
  • Flash、SRAM、外設的SRAM、APB1、APB2和AHB外設均可作為訪問的源和目標。
  • 可編程的數據傳輸數目。

?ADC(Analog-Digital Converter模擬-數字轉換器,ADC可以將引腳上連續變化的模擬電壓轉換為內存中存儲的數字變量,建立模擬電路到數字電路的橋梁.12位ADC是一種逐次逼近型模擬數字轉換器。它有多達18個通道,可測量16個外部和兩個內部信號源。各通道的A/D轉換可以單次、連續、掃描或間斷模式執行。ADC的結果可以左對齊或右對齊對齊方式存儲在16位數據寄存器中。

逐次逼近型ADC通過二進制搜索算法逐步確定輸入模擬信號的數值,具體步驟如下:

  1. 初始化
    • 逐次逼近寄存器(SAR)將最高有效位(MSB)設為1,其余位設為0,形成一個初始猜測值。
    • 該值通過內部DAC(數模轉換器)轉換為模擬電壓,并與輸入信號進行比較。
  2. 比較與調整
    • 比較器將DAC輸出的電壓與輸入模擬信號進行比較:
      • 若DAC電壓 < 輸入電壓 → 保持該位為1,繼續測試下一位(次高位)。
      • 若DAC電壓 > 輸入電壓 → 將該位清零(設為0),繼續測試下一位。
    • 重復上述步驟,逐位確定每一位的值(從MSB到LSB),直到所有位完成判斷。
  3. 輸出結果
    • 最終,SAR寄存器中保存的二進制數值即為輸入模擬信號的數字表示。

ADC的輸入時鐘不得超過14MHz,它是由PCLK2經分頻產生。

ADC主要特征:

????????● 12位分辨率
????????● 轉換結束、注入轉換結束和發生模擬看門狗事件時產生中斷
????????● 單次和連續轉換模式
????????● 從通道0到通道n的自動掃描模式
????????● 自校準
????????● 帶內嵌數據一致性的數據對齊
????????● 采樣間隔可以按通道分別編程
????????● 規則轉換和注入轉換均有外部觸發選項
????????● 間斷模式
????????● 雙重模式(帶2個或以上ADC的器件)
????????● ADC轉換時間:
????????─
????????STM32F103xx增強型產品:時鐘為56MHz時為1μs(時鐘為72MHz為1.17μs)
????????─
????????STM32F101xx基本型產品:時鐘為28MHz時為1μs(時鐘為36MHz為1.55μs)
????????─
????????STM32F102xxUSB型產品:時鐘為48MHz時為1.2μs
????????─
????????STM32F105xx和STM32F107xx產品:時鐘為56MHz時為1μs(時鐘為72MHz為1.17μs)
????????● ADC供電要求:2.4V到3.6V
????????● ADC輸入范圍:VREF- ≤ VIN ≤ VREF+
????????● 規則通道轉換期間有DMA請求產生。

ADC功能描述:

????????

????????

技術實現

?連線圖

代碼實現?

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"						//延時函數
#include "OLED.h"
#include "AD.h"int main(void)
{/*OLED初始化*/OLED_Init();AD_Init();OLED_ShowString(1,1,"AD0:");OLED_ShowString(2,1,"AD1:");OLED_ShowString(3,1,"AD2:");OLED_ShowString(4,1,"AD3:");while(1){	AD_GetValue();OLED_ShowNum(1,5,AD_Value[0],4);OLED_ShowNum(2,5,AD_Value[1],4);OLED_ShowNum(3,5,AD_Value[2],4);OLED_ShowNum(4,5,AD_Value[3],4);}
}

?AD.h

#ifndef AD_H
#define AD_H#include "stm32f10x.h"extern uint16_t AD_Value[4];void AD_Init(void);
void AD_GetValue(void);#endif

?AD.c

#include "AD.h"uint16_t AD_Value[4];										//將數據存儲在SRAM								/*** @brief  AD Initialization * @param  None* @retval None* @note   Initialize AD basic structure*/
void AD_Init(void)
{//開啟時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);					//開啟DMA時鐘//配置ADC時鐘 12MHzRCC_ADCCLKConfig(RCC_PCLK2_Div6);GPIO_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規則組輸入通道ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_55Cycles5);//初始化ADCADC_InitTypeDef ADC_InitStruct;ADC_InitStruct.ADC_Mode                 = ADC_Mode_Independent;ADC_InitStruct.ADC_ScanConvMode         = ENABLE;                   		//掃描模式ADC_InitStruct.ADC_ContinuousConvMode   = DISABLE;                  		//單次轉換ADC_InitStruct.ADC_ExternalTrigConv     = ADC_ExternalTrigConv_None;		//軟件觸發,非外部觸發ADC_InitStruct.ADC_DataAlign            = ADC_DataAlign_Right;      		//數據右對齊ADC_InitStruct.ADC_NbrOfChannel         = 4;                        		//共4個序列ADC_Init(ADC1,&ADC_InitStruct);//初始化DMA DMA_InitTypeDef DMA_InitStruct;DMA_InitStruct.DMA_BufferSize			= 4;								//緩沖區的大小,由于CNDTR寄存器的高16位保留,這里緩沖區大小的變量的大小使用//uint16_t即可DMA_InitStruct.DMA_DIR  				= DMA_DIR_PeripheralSRC; 			//外設站點是數據源DMA_InitStruct.DMA_MemoryBaseAddr 		= (uint32_t)AD_Value;				//存儲器站點的基地址,將數據轉運到SRAMDMA_InitStruct.DMA_MemoryDataSize		= DMA_MemoryDataSize_HalfWord;		//接收的數據以半字形式傳輸DMA_InitStruct.DMA_Mode					= DMA_Mode_Normal;				    //DAM傳輸計數器不使用自動重裝模式DMA_InitStruct.DMA_M2M					= DMA_M2M_Disable;					//DMA為外設到存儲器傳輸的方式,使用硬件觸發DMA_InitStruct.DMA_MemoryInc			= DMA_MemoryInc_Enable;				//存儲器站點自增DMA_InitStruct.DMA_PeripheralInc		= DMA_PeripheralInc_Disable;		//外設站點地址不自增DMA_InitStruct.DMA_PeripheralBaseAddr 	= (uint32_t)&ADC1->DR;				//ADC規則數據寄存器(ADC_DR)的地址為要傳輸的數據的基地址DMA_InitStruct.DMA_PeripheralDataSize	= DMA_PeripheralDataSize_HalfWord;	//傳輸的數據以半字節形式傳輸DMA_InitStruct.DMA_Priority				= DMA_Priority_VeryHigh;			//只有一個通道,DMA優先級隨便選DMA_Init(DMA1_Channel1,&DMA_InitStruct);									//使用硬件觸發,通道為固定的通道1,不可更改DMA_Cmd(DMA1_Channel1,ENABLE);ADC_DMACmd(ADC1,ENABLE);													//開啟ADC的DMA觸發源//關閉ADC電源ADC_Cmd(ADC1,DISABLE);//維持ADC處于掉電狀態至少兩個周期Delay_us(1);//ADC校準ADC_ResetCalibration(ADC1);                                         	//復位校準,將ADC_CR2寄存器中的RSTCAL位置1,初始化校準寄存器while(ADC_GetResetCalibrationStatus(ADC1));                         	//等待復位校準完成,校準寄存器被初始化后RSTAL位由硬件清零ADC_StartCalibration(ADC1);                                         	//AD校準,將ADC_CR2寄存器中的CAL位置1,開始校準while(ADC_GetCalibrationStatus(ADC1));                              	//等待AD校準完成,校準完成后CAL位由硬件清零//開啟ADC電源ADC_Cmd(ADC1,ENABLE);
}/*** @brief  AD觸發,DMA計數器賦值* @param  None* @retval None* @note   為DMA計數器重新賦值*/
void AD_GetValue(void)
{DMA_Cmd(DMA1_Channel1,DISABLE);											//DMA失能DMA_SetCurrDataCounter(DMA1_Channel1,4);								//傳輸計數器賦值,非自動重裝模式,若使用自動重裝模式,則只需在初始化中進行一次賦值DMA_Cmd(DMA1_Channel1,ENABLE);	ADC_SoftwareStartConvCmd(ADC1,ENABLE);                              	//ADC為單次轉換模式,仍需軟件觸發AD轉換。循環轉換則只需在初始化時觸發一次while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);						//等待DMA轉運完成DMA_ClearFlag(DMA1_FLAG_TC1);
}

??OLED部分代碼參照文章《STM32基礎教程——OLED顯示》http://【STM32基礎教程 ——OLED顯示 - CSDN App】https://blog.csdn.net/2301_80319641/article/details/145837521?sharetype=blog&shareId=145837521&sharerefer=APP&sharesource=2301_80319641&sharefrom=link

技術要點

//開啟時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);					//開啟DMA時鐘

本實驗設計到DMA和ADC1,而GPIO作為ADC1的通道,故應分別開啟他們的時鐘,ADC1和GPIO隸屬于APB2外設,DMA隸屬AHB外設。

//配置ADC時鐘 12MHzRCC_ADCCLKConfig(RCC_PCLK2_Div6);

系統時鐘為72MHz,這里分頻因子選擇6分頻,經分頻后ADC時鐘為12MHz?。

ADC輸入時鐘有PCLK2分頻得到,最大不得超過14MHz。

GPIO_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);

?由于進行AD轉換,GPIO的輸入量為模擬量,故應將GPIO的輸入模式配置為模擬輸入模式, 由于使用AD轉換通道0,通道1,通道2,通道3,這里GPIO配置PA0、PA1、PA2、PA3引腳。AD通道與GPIO引腳對應見下圖:

//配置ADC規則組輸入通道ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_55Cycles5);

配置ADC多個輸入通道。之前的ADC多通道是單次轉換,非掃描模式,利用了多個通道,但是只利用了轉換序列1.這里ADC使用單次轉換,掃描模式。每次轉換可以掃描多個通道,利用DMA,可以防止只有一個數據寄存器而數據無法及時運出導致多個通道轉換后數據被覆蓋。

//初始化ADCADC_InitTypeDef ADC_InitStruct;ADC_InitStruct.ADC_Mode                 = ADC_Mode_Independent;ADC_InitStruct.ADC_ScanConvMode         = ENABLE;                   //掃描模式ADC_InitStruct.ADC_ContinuousConvMode   = DISABLE;                  //單次轉換ADC_InitStruct.ADC_ExternalTrigConv     = ADC_ExternalTrigConv_None;//軟件觸發,非外部觸發ADC_InitStruct.ADC_DataAlign            = ADC_DataAlign_Right;      //數據右對齊ADC_InitStruct.ADC_NbrOfChannel         = 4;                        //共4個序列ADC_Init(ADC1,&ADC_InitStruct);

初始化ADC,將ADC設置為單次轉換,掃描模式。同樣觸發方式選擇軟件觸發,數據右對齊,要轉換的ADC的通道的數量為4。

//初始化DMA DMA_InitTypeDef DMA_InitStruct;DMA_InitStruct.DMA_BufferSize			= 4;								//緩沖區的大小,由于CNDTR寄存器的高16位保留,這里緩沖區大小的變量的大小使用//uint16_t即可DMA_InitStruct.DMA_DIR  				= DMA_DIR_PeripheralSRC; 			//外設站點是數據源DMA_InitStruct.DMA_MemoryBaseAddr 		= (uint32_t)AD_Value;				//存儲器站點的基地址,將數據轉運到SRAMDMA_InitStruct.DMA_MemoryDataSize		= DMA_MemoryDataSize_HalfWord;		//接收的數據以半字形式傳輸DMA_InitStruct.DMA_Mode					= DMA_Mode_Normal;				    //DAM傳輸計數器不使用自動重裝模式DMA_InitStruct.DMA_M2M					= DMA_M2M_Disable;					//DMA為外設到存儲器傳輸的方式,使用硬件觸發DMA_InitStruct.DMA_MemoryInc			= DMA_MemoryInc_Enable;				//存儲器站點自增DMA_InitStruct.DMA_PeripheralInc		= DMA_PeripheralInc_Disable;		//外設站點地址自增DMA_InitStruct.DMA_PeripheralBaseAddr 	= (uint32_t)&ADC1->DR;				//ADC規則數據寄存器(ADC_DR)的地址為要傳輸的數據的基地址DMA_InitStruct.DMA_PeripheralDataSize	= DMA_PeripheralDataSize_HalfWord;	//傳輸的數據以半字節形式傳輸DMA_InitStruct.DMA_Priority				= DMA_Priority_VeryHigh;			//只有一個通道,DMA優先級隨便選DMA_Init(DMA1_Channel1,&DMA_InitStruct);									//使用硬件觸發,通道為固定的通道1,不可更改

將數據緩沖區(DMA通道的DMA緩存的大小)的大小設置為4。本實驗是讀取AD轉換后的值,DMA轉運的方向應為外設到存儲器。結構體成員DMA_DIR指示數據傳輸方向,故其值設置為DMA_DIR_PeripheralSRC,即從存儲器讀。實驗使用數組存儲AD轉換的值,故存儲器地址設置為AD_Value,AD_Value為指向數組首地址的指針,其值為數組的地址,應強轉為uint32_t類型。同時存儲器站點自增。

ADC_DR寄存器為規則組轉換的數據寄存器,存儲的數據寬度為半字,故外設基地址設置為&ADC->DR外設和存儲器的數據寬度都設置為半字。

DMA數據傳輸由外設到存儲器,故結構體成員DMA_M2M的值應設置為DMA_M2M_Disable,且DMA由硬件觸發(因為數據傳輸方向是外設到存儲器)。

ADC_DMACmd(ADC1,ENABLE);													//開啟ADC的DMA觸發源

開啟ADC的DMA觸發源,通過ADC進行硬件觸發DMA數據轉運。

void AD_GetValue(void)
{DMA_Cmd(DMA1_Channel1,DISABLE);											//DMA失能DMA_SetCurrDataCounter(DMA1_Channel1,4);								//傳輸計數器賦值,非自動重裝模式,若使用自動重裝模式,則只需在初始化中進行一次賦值DMA_Cmd(DMA1_Channel1,ENABLE);	ADC_SoftwareStartConvCmd(ADC1,ENABLE);                              	//ADC為單次轉換模式,仍需軟件觸發AD轉換。循環轉換則只需在初始化時觸發一次while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);						//等待DMA轉運完成DMA_ClearFlag(DMA1_FLAG_TC1);
}

ADC為單次轉換模式,故每次循環開始轉換前都應使用軟件觸發的方式觸發ADC轉換。

實驗結果

DMA+ADC多通道

問題記錄

1.江科大的教學視頻中ADC校驗是在開啟ADC電源后開始校驗,ADC校準應先關閉ADC電源并維持兩個周期以上,然后開啟ADC電源。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77043.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77043.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77043.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

23黑馬產品經理Day01

今天過了一遍23黑馬產品經理的基礎視頻 問題思考維度 抓住核心用戶 為什么需要抓住核心用戶&#xff1f; 主要原因&#xff1a;用戶越來越細分&#xff0c;保持市場競爭力&#xff0c;產品開發推廣更聚焦 做產品為什么要了解用戶&#xff1a;了解用戶的付費點&#xff0c;…

C/C++ 通用代碼模板

? C 語言代碼模板&#xff08;main.c&#xff09; 適用于基礎項目、算法競賽或刷題&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include <math.h>// 宏定義區 #define MAX_N 1000 #defi…

【數據結構_7】棧和隊列(上)

一、概念 棧和隊列&#xff0c;也是基于順序表和鏈表實現的 棧是一種特殊的線性表&#xff0c;其只允許在固定的一段進行插入和刪除元素操作。 遵循后進先出的原則 此處所見到的棧&#xff0c;本質上就是一個順序表/鏈表&#xff0c;但是&#xff0c;實在順序表/鏈表的基礎…

git UserInterfaceState.xcuserstate 文件頻繁更新

1> 退出 Xcdoe&#xff0c;打開終端&#xff08;Terminal&#xff09;&#xff0c;進入到你的項目目錄下。 2> 在終端鍵入 git rm --cached <YourProjectName>.xcodeproj/project.xcworkspace/xcuserdata/<YourUsername>.xcuserdatad/UserInterfaceState.x…

【Ai】MCP實戰:手寫 client 和 server [Python版本]

什么是mcp MCP 是一個開放協議&#xff0c;它為應用程序向 LLM 提供上下文的方式進行了標準化。你可以將 MCP 想象成 AI 應用程序的 USB-C 接口。就像 USB-C 為設備連接各種外設和配件提供了標準化的方式一樣&#xff0c;MCP 為 AI 模型連接各種數據源和工具提供了標準化的接口…

ESP8266/32作為AVR編程器(ISP programmer)的使用介紹

ESP8266作為AVR編程器( ISP programmer)的使用介紹 &#x1f33f;ESP8266自帶庫例程&#xff1a;https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266AVRISP&#x1f4cd;支持ESP8266/32的ESP_AVRISP其它開源工程&#xff08;個人沒有再去驗證&#xff09;&…

08-JVM 面試題-mk

文章目錄 1.JVM 的各部分組成2.運行時數據區2.1.什么是程序計數器?2.2.你能給我詳細的介紹Java堆嗎?2.3.能不能解釋一下方法區?2.3.1常量池2.3.2.運行時常量池2.4.什么是虛擬機棧?2.4.1.垃圾回收是否涉及棧內存?2.4.2.棧內存分配越大越好嗎?2.4.3.方法內的局部變量是否線…

Vue3 nextTick

nextTick 是 Vue 中非常重要的一個 API&#xff0c;它允許你在 DOM 更新周期后執行延遲回調。 核心源碼位置 Vue3 的 nextTick 實現主要在 packages/runtime-core/src/scheduler.ts 文件中。 基本實現 const resolvedPromise Promise.resolve() as Promise<any> let …

DISCO:利用大型語言模型提取反事實

DISCO: Distilling Counterfactuals with Large Language Models - ACL Anthologyhttps://aclanthology.org/2023.acl-long.302/ 1. 概述 盡管在自然語言處理(NLP)領域針對各種推理任務取得了巨大進展(Wang 等, 2018, 2019a;Xu 等, 2020),但數據集偏差仍然是構建魯棒模型…

【Django】框架-路由系統核心概念解析

1. 最基本路由關系 路由是URL地址與處理邏輯&#xff08;視圖函數&#xff09;的對應關系。 本質&#xff1a;將用戶請求的URL路徑映射到具體的處理程序&#xff08;如Django視圖函數&#xff09;。 示例&#xff1a; # urls.py urlpatterns [ path(home/, views.home_…

理解 results = model(source, stream=True) 的工作原理和優勢

1. 核心概念解析 (1) streamTrue 的作用 生成器模式&#xff1a;當處理視頻或圖像序列時&#xff0c;streamTrue 會將結果包裝成一個 生成器&#xff08;Generator&#xff09;&#xff0c;逐幀生成 Results 對象&#xff0c;而不是一次性返回所有結果。內存優化&#xff1a;…

重新定義“邊緣”:邊緣計算如何重塑人類與數據的關系

在數字化浪潮中&#xff0c;云計算曾是科技界的寵兒&#xff0c;但如今&#xff0c;邊緣計算正在悄然改變游戲規則。它不僅是一種技術進步&#xff0c;更是對人類與數據關系的一次深刻反思。本文將探討邊緣計算如何從“中心化”走向“分布式”&#xff0c;以及它如何在效率、隱…

MCP 協議知識分享

MCP 協議知識分享 一、MCP 協議概述1.1 定義與背景1.2 核心價值1.3 與傳統 API 的對比 二、技術架構與工作原理2.1 核心組件2.2 通信機制2.3 典型工作流程 三、關鍵技術與應用場景3.1 核心技術3.2 典型應用場景 四、與微軟技術的集成4.1 Azure OpenAI 服務4.2 Playwright MCP 服…

策略模式實現 Bean 注入時怎么知道具體注入的是哪個 Bean?

Autowire Resource 的區別 1.來源不同&#xff1a;其中 Autowire 是 Spring2.5 定義的注解&#xff0c;而 Resource 是 Java 定義的注解 2.依賴查找的順序不同&#xff1a; 依賴注入的功能&#xff0c;是通過先在 Spring IoC 容器中查找對象&#xff0c;再將對象注入引入到當…

Linux》》bash 、sh 執行腳本

通常使用shell去運行腳本&#xff0c;兩種方法 》bash xxx.sh 或 bash “xxx.sh” 、sh xxx.sh 或 sh “xxx.sh” 》bash -c “cmd string” 引號不能省略 我們知道 -c 的意思是 command&#xff0c;所以 bash -c 或 sh -c 后面應該跟一個 command。

【解析】ReentrantLock鎖、Syschronized鎖面試點解析

面試官提問 ● 公平鎖與非公平鎖的區別是什么&#xff1f; ● 什么是可重入鎖&#xff1f; ● 什么是死鎖&#xff0c;怎樣避免死鎖&#xff1f; ● ReentrantLock與Syschronized實現原理是什么&#xff1f;兩者有什么區別&#xff1f; ● 請說明ReentrantLock獲取鎖與釋放…

04.Python代碼NumPy-通過索引或切片來訪問和修改

04.Python代碼NumPy-通過索引或切片來訪問和修改 提示&#xff1a;幫幫志會陸續更新非常多的IT技術知識&#xff0c;希望分享的內容對您有用。本章分享的是Python基礎語法。前后每一小節的內容是存在的有&#xff1a;學習and理解的關聯性&#xff0c;希望對您有用~ python語法…

跨平臺數據采集如何解決不同平臺之間的數據兼容性問題?

在數字化時代&#xff0c;企業越來越依賴多個信息系統來管理業務&#xff0c;例如ERP&#xff08;企業資源計劃&#xff09;、CRM&#xff08;客戶關系管理&#xff09;、財務管理系統、電商平臺等。然而&#xff0c;在進行跨平臺數據采集時&#xff0c;不同系統之間的數據格式…

解決 vite.config.ts 引入scss 預處理報錯

目錄 報錯1&#xff1a;[plugin:vite:css] [SASS] Error&#xff1a;Cant find stylesheet to import 報錯2&#xff1a;[plugin:vite:css] [sass] Error: Undefined variable 版本號&#xff1a; "sass": "^1.86.3","sass-loader": "^1…

C++筆記,數學函數

參考鏈接&#xff1a;C中數學函數的使用方法_cpp里指數函數-CSDN博客 頭文件 <cmath> 1. 基本的算數運算函數 1.1 sqrt() - 計算平方根 功能&#xff1a;計算一個非負實數的平方根。原型&#xff1a;double sqrt(double x);示例代碼&#xff1a; #include <iostr…