MSP432自主開發筆記6:定時器多通道捕獲多條編碼器線脈沖數

所用開發板:MSP432P401R

今日在此更新一下編碼器測速的定時器捕獲寫法,之前學習時竟然忘記更新了~~

本文講如何用定時器的通道來 捕獲編碼器的脈沖信號數量,不提供速度路程的計算方式,

文章提供源碼,測試工程下載;

實踐內容:

1.使用定時器TA2捕獲四個輪子編碼器的信號

2.上升下降沿都捕獲

3.串口定時反饋捕獲值

程序編寫:

程序設計方面十分簡單,分為以下步驟,每個步驟有一些注意點:

一、初始化定時器:

??????????? 1.關閉定時溢出中斷,開啟捕獲事件的中斷

??????????? 2.選擇合適的定時器頻率,略高于編碼器最大頻率即可

??????? ? ? 3.四個通道除了引腳不同,初始化基本一樣,結構體名稱改改就行

??????????? 4.設置為上升沿、下降沿、上升下降沿,三種捕獲模式之一,(本文設置為上升下降都捕獲 ?? )

二、捕獲事件中斷服務函數:

??????????? 1.因為之前關閉了 定時溢出中斷,所以void TA2_N_IRQHandler(void)的進入條件只有捕獲事件到來時:(本文捕獲事件為:上升下降都是捕獲事件 ?? ),就會進一次中斷

???????????? 2.定時器配置捕獲后,可以通過讀取TAxIV寄存器來判斷是哪個通道傳來的捕獲事件,借此對其計數。(本文是定時器2,因此讀取TA2IV)

???????????? 3. ?? ?

?有關TAxIV寄存器介紹在801頁

?1.初始化定時器TA2四條通道的捕獲:

注意點在之前說過了:

開啟定時器計時,但關閉計時溢出中斷

選擇合適的計時溢出頻率,這決定了捕獲的采樣率,比編碼器脈沖頻率快就行,當然,直接定時器48M也是沒有問題的

四條通道初始化相同的

開啟TA2端口中斷 ??? MAP_Interrupt_enableInterrupt(INT_TA2_N);

//定時器TA2捕獲初始化:
void TA2_CAP_init(void)
{//四個通道初始化輸入MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5,GPIO_PIN6,GPIO_PRIMARY_MODULE_FUNCTION);	MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5,GPIO_PIN7,GPIO_PRIMARY_MODULE_FUNCTION);	MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P6,GPIO_PIN6,GPIO_PRIMARY_MODULE_FUNCTION);	MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P6,GPIO_PIN7,GPIO_PRIMARY_MODULE_FUNCTION);	//定時器連續計數模式初始化,關閉定時溢出中斷const Timer_A_ContinuousModeConfig continuousModeConfig ={TIMER_A_CLOCKSOURCE_SMCLK,TIMER_A_CLOCKSOURCE_DIVIDER_1,  //1分頻,分辨率最高48MTIMER_A_TAIE_INTERRUPT_DISABLE, TIMER_A_SKIP_CLEAR};
//初始化通道1:const Timer_A_CaptureModeConfig captureModeConfig_1 ={TIMER_A_CAPTURECOMPARE_REGISTER_1, TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE,TIMER_A_CAPTURE_INPUTSELECT_CCIxA,TIMER_A_CAPTURE_SYNCHRONOUS,TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE,TIMER_A_OUTPUTMODE_OUTBITVALUE};
//初始化通道2:const Timer_A_CaptureModeConfig captureModeConfig_2 ={TIMER_A_CAPTURECOMPARE_REGISTER_2, TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE,TIMER_A_CAPTURE_INPUTSELECT_CCIxA,TIMER_A_CAPTURE_SYNCHRONOUS,TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE,TIMER_A_OUTPUTMODE_OUTBITVALUE};
//初始化通道3:const Timer_A_CaptureModeConfig captureModeConfig_3 ={TIMER_A_CAPTURECOMPARE_REGISTER_3, TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE,TIMER_A_CAPTURE_INPUTSELECT_CCIxA,TIMER_A_CAPTURE_SYNCHRONOUS,TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE,TIMER_A_OUTPUTMODE_OUTBITVALUE};
//初始化通道4:const Timer_A_CaptureModeConfig captureModeConfig_4 ={TIMER_A_CAPTURECOMPARE_REGISTER_4, TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE,TIMER_A_CAPTURE_INPUTSELECT_CCIxA,TIMER_A_CAPTURE_SYNCHRONOUS,TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE,TIMER_A_OUTPUTMODE_OUTBITVALUE};		MAP_Timer_A_initCapture(TIMER_A2_BASE, &captureModeConfig_1);MAP_Timer_A_initCapture(TIMER_A2_BASE, &captureModeConfig_2);MAP_Timer_A_initCapture(TIMER_A2_BASE, &captureModeConfig_3);MAP_Timer_A_initCapture(TIMER_A2_BASE, &captureModeConfig_4);MAP_Timer_A_configureContinuousMode(TIMER_A2_BASE, &continuousModeConfig);MAP_Interrupt_enableInterrupt(INT_TA2_N);MAP_Timer_A_startCounter(TIMER_A2_BASE, TIMER_A_CONTINUOUS_MODE);
}

?2.編寫定時器 中斷服務函數:

代碼中的 Wheel[x].CAPTURE 無須在意,是我給每個輪子定義的結構體,換成普通變量一樣用的,這種高速計數脈沖,需要大家時刻注意溢出問題,以下代碼段的意思就是防止數據溢出不被記錄:

if(Wheel[1].CAPTURE==62700){Wheel[1].CAPTURE=0;Wheel[1].CAT_OUT_TIME++;}

?


//這是捕獲事件中斷服務函數(因為定時器溢出中斷已關閉)
//注意對照引腳看通道,這里通道情況與PWM控制不一樣
void TA2_N_IRQHandler(void)
{uint16_t captureSource = TA2IV;
// 根據捕獲通道來源進行適當的處理
//脈沖計數到62700時剛好車輪轉95圈
//大電機減速比30編碼器11線switch (captureSource) {case 0x02:// 處理TA2 CCR1通道的捕獲中斷Wheel[1].CAPTURE++;if(Wheel[1].CAPTURE==62700){Wheel[1].CAPTURE=0;Wheel[1].CAT_OUT_TIME++;}break;case 0x04:// 處理TA2 CCR2通道的捕獲中斷Wheel[2].CAPTURE++;if(Wheel[2].CAPTURE==62700){Wheel[2].CAPTURE=0;Wheel[2].CAT_OUT_TIME++;}		break;case 0x06:// 處理TA2 CCR3通道的捕獲中斷Wheel[3].CAPTURE++;if(Wheel[3].CAPTURE==62700){Wheel[3].CAPTURE=0;Wheel[3].CAT_OUT_TIME++;}					break;case 0x08:// 處理TA2 CCR4通道的捕獲中斷Wheel[4].CAPTURE++;if(Wheel[4].CAPTURE==62700){Wheel[4].CAPTURE=0;Wheel[4].CAT_OUT_TIME++;}					break;default: break;	
}
}			

3.32定時器初始化為1s周期,通過串口反饋捕獲情況:

//此句放在初始化,主函數開頭,初始化32定時器為1s周期Tim32_0_Int_Init(47999999,1);//32定時器初始化函數,傳入的aar psc決定了其周期
void Tim32_0_Int_Init(uint32_t aar, uint8_t psc)
{MAP_Timer32_initModule(TIMER32_0_BASE, psc, TIMER32_32BIT, TIMER32_PERIODIC_MODE);MAP_Timer32_setCount(TIMER32_0_BASE, aar);MAP_Timer32_enableInterrupt(TIMER32_0_BASE);MAP_Timer32_startTimer(TIMER32_0_BASE, false); //連續計數模式 falseMAP_Interrupt_enableInterrupt(INT_T32_INT1);
}/* Timer32 ISR 中斷服務函數,1s進一次*/
void T32_INT1_IRQHandler(void)
{MAP_Timer32_clearInterruptFlag(TIMER32_0_BASE);printf("W1_CAP=%d\r\n",Wheel[1].CAPTURE);printf("W2_CAP=%d\r\n",Wheel[2].CAPTURE);printf("W3_CAP=%d\r\n",Wheel[3].CAPTURE);printf("W4_CAP=%d\r\n",Wheel[4].CAPTURE);
}

整體代碼:

#include "main.h"//單個車輪狀態與參數結構體:
Wheel_dat Wheel[5];int main(void)
{inint_all();   //初始化所有模塊while (1){  }
}/* Timer32 ISR */
void T32_INT1_IRQHandler(void)
{MAP_Timer32_clearInterruptFlag(TIMER32_0_BASE);printf("W1_CAP=%d\r\n",Wheel[1].CAPTURE);printf("W2_CAP=%d\r\n",Wheel[2].CAPTURE);printf("W3_CAP=%d\r\n",Wheel[3].CAPTURE);printf("W4_CAP=%d\r\n",Wheel[4].CAPTURE);
}//初始化所有模塊
void inint_all(void)
{SysInit();                                  //時鐘配置    delay_init();								 								//delay_ms函數配置uart_init(115200);	TA2_CAP_init();Tim32_0_Int_Init(47999999,1);printf("Hello,MSP432!\r\n");								//串口打印測試字符MAP_Interrupt_enableMaster();               // 開啟總中斷
}//串口0服務函數
//串口0接收命令,存在數組中
void EUSCIA0_IRQHandler(void)
{uint32_t status = UART_getEnabledInterruptStatus(EUSCI_A0_BASE);if(status & EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG)      //接收中斷{USART0_save[USART0_xb++]=MAP_UART_receiveData(EUSCI_A0_BASE);if(USART0_xb== 20){USART0_xb=0;	}							      //下標最大不超過20if(USART0_save[USART0_xb-1]=='\0'){USART0_flag=1;}  //命令以\0結尾}
}//這是捕獲事件中斷服務函數(因為定時器溢出中斷已關閉)
//注意對照引腳看通道,這里通道情況與PWM控制不一樣
void TA2_N_IRQHandler(void)
{uint16_t captureSource = TA2IV;
// 根據捕獲通道來源進行適當的處理
//脈沖計數到62700時剛好車輪轉95圈
//大電機減速比30編碼器11線switch (captureSource) {case 0x02:// 處理TA2 CCR1通道的捕獲中斷Wheel[1].CAPTURE++;if(Wheel[1].CAPTURE==62700){Wheel[1].CAPTURE=0;Wheel[1].CAT_OUT_TIME++;}break;case 0x04:// 處理TA2 CCR2通道的捕獲中斷Wheel[2].CAPTURE++;if(Wheel[2].CAPTURE==62700){Wheel[2].CAPTURE=0;Wheel[2].CAT_OUT_TIME++;}		break;case 0x06:// 處理TA2 CCR3通道的捕獲中斷Wheel[3].CAPTURE++;if(Wheel[3].CAPTURE==62700){Wheel[3].CAPTURE=0;Wheel[3].CAT_OUT_TIME++;}					break;case 0x08:// 處理TA2 CCR4通道的捕獲中斷Wheel[4].CAPTURE++;if(Wheel[4].CAPTURE==62700){Wheel[4].CAPTURE=0;Wheel[4].CAT_OUT_TIME++;}					break;default: break;	
}
}			//定時器TA2捕獲初始化:
void TA2_CAP_init(void)
{//四個通道初始化輸入MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5,GPIO_PIN6,GPIO_PRIMARY_MODULE_FUNCTION);	MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5,GPIO_PIN7,GPIO_PRIMARY_MODULE_FUNCTION);	MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P6,GPIO_PIN6,GPIO_PRIMARY_MODULE_FUNCTION);	MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P6,GPIO_PIN7,GPIO_PRIMARY_MODULE_FUNCTION);	//定時器連續計數模式初始化,關閉定時溢出中斷const Timer_A_ContinuousModeConfig continuousModeConfig ={TIMER_A_CLOCKSOURCE_SMCLK,TIMER_A_CLOCKSOURCE_DIVIDER_1,  //1分頻,分辨率最高48MTIMER_A_TAIE_INTERRUPT_DISABLE, TIMER_A_SKIP_CLEAR};
//初始化通道1:const Timer_A_CaptureModeConfig captureModeConfig_1 ={TIMER_A_CAPTURECOMPARE_REGISTER_1, TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE,TIMER_A_CAPTURE_INPUTSELECT_CCIxA,TIMER_A_CAPTURE_SYNCHRONOUS,TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE,TIMER_A_OUTPUTMODE_OUTBITVALUE};
//初始化通道2:const Timer_A_CaptureModeConfig captureModeConfig_2 ={TIMER_A_CAPTURECOMPARE_REGISTER_2, TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE,TIMER_A_CAPTURE_INPUTSELECT_CCIxA,TIMER_A_CAPTURE_SYNCHRONOUS,TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE,TIMER_A_OUTPUTMODE_OUTBITVALUE};
//初始化通道3:const Timer_A_CaptureModeConfig captureModeConfig_3 ={TIMER_A_CAPTURECOMPARE_REGISTER_3, TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE,TIMER_A_CAPTURE_INPUTSELECT_CCIxA,TIMER_A_CAPTURE_SYNCHRONOUS,TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE,TIMER_A_OUTPUTMODE_OUTBITVALUE};
//初始化通道4:const Timer_A_CaptureModeConfig captureModeConfig_4 ={TIMER_A_CAPTURECOMPARE_REGISTER_4, TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE,TIMER_A_CAPTURE_INPUTSELECT_CCIxA,TIMER_A_CAPTURE_SYNCHRONOUS,TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE,TIMER_A_OUTPUTMODE_OUTBITVALUE};		MAP_Timer_A_initCapture(TIMER_A2_BASE, &captureModeConfig_1);MAP_Timer_A_initCapture(TIMER_A2_BASE, &captureModeConfig_2);MAP_Timer_A_initCapture(TIMER_A2_BASE, &captureModeConfig_3);MAP_Timer_A_initCapture(TIMER_A2_BASE, &captureModeConfig_4);MAP_Timer_A_configureContinuousMode(TIMER_A2_BASE, &continuousModeConfig);MAP_Interrupt_enableInterrupt(INT_TA2_N);MAP_Timer_A_startCounter(TIMER_A2_BASE, TIMER_A_CONTINUOUS_MODE);
}
#ifndef _main_h_
#define _main_h_#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
#include "string.h"				   	//C標準庫、字符串處理庫
#include "sysinit.h"			   	//時鐘配置
#include "delay.h"				   	//滴答定時器初始化(提供delay_ms延時)
#include "Public.h"
#include "DATA.h"//單個車輪狀態與參數結構體:
typedef struct wheel_data
{uint16_t Sta;            //正反轉狀態,0不轉,2正,1反uint16_t PWM_DIV;        //車輪電機占空比6 - 99uint32_t CAT_OUT_TIME;   //編碼器 脈沖溢出次數,溢出一次就加一,記錄有幾個65530uint32_t CAPTURE;        //編碼器 外部中斷次數記錄最大65530次脈沖,溢出后CAT_OUT_TIME會加一,CAPTURE歸零uint32_t CAPTURE_LAST;   //上一次外部中斷次數記錄uint32_t CAPTURE_NEW;    //最新外部中斷次數記錄uint32_t DISTANCE;       //單輪行駛總路程長度單位cm,最大65535cmuint32_t SPEED;          //瞬時速度值存儲,單位cm/s
}Wheel_dat;void inint_all(void);               //初始化所有模塊
//定時器TA2捕獲初始化:
void TA2_CAP_init(void);#endif

?測試工程下載:

https://download.csdn.net/download/qq_64257614/88214201?spm=1001.2014.3001.5503

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

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

相關文章

積木報表集成前端加載js文件404

項目場景&#xff1a; 在集成積木報表和shiro時候&#xff1a; 集成積木報表&#xff0c;shrio&#xff0c;shrio是定義在另一個模塊下的&#xff0c;供另一個啟動類使用&#xff0c;積木報表集成shrio的時候&#xff0c;需要依賴存放shrio的核心包&#xff0c;該核心包除了存…

android 如何分析應用的內存(十七)——使用MAT查看Android堆

android 如何分析應用的內存&#xff08;十七&#xff09;——使用MAT查看Android堆 前一篇文章&#xff0c;介紹了使用Android profiler中的memory profiler來查看Android的堆情況。 如Android 堆中有哪些對象&#xff0c;這些對象的引用情況是什么樣子的。 可是我們依然面臨…

【ArcGIS】經緯度數據轉化成平面坐標數據

將點位置導入Gis中&#xff0c;如下&#xff08;經緯度表征位置&#xff09;&#xff1a; 如何利用Gis將其轉化為平面坐標呢&#xff1f; Step1 坐標變換 坐標變換&#xff0c;打開ArcToolbox&#xff0c;找到“數據管理工具”->“投影和變換”->“要素”->“投影”…

MySQL—緩存

目錄標題 為什么要有Buffer Poolbuffer pool有多大buffer pool緩存什么 如何管理Buffer Pool如何管理空閑頁如何管理臟頁如何提高緩存命中率預讀失效buffer pool污染 臟頁什么時候會被刷入到磁盤 為什么要有Buffer Pool 雖然說MySQL的數據是存儲在磁盤中&#xff0c;但是也不能…

抖音關鍵詞搜索小程序排名怎么做

抖音關鍵詞搜索小程序排名怎么做 1 分鐘教你制作一個抖音小程序。 抖音小程序就是我的視頻&#xff0c;左下方這個藍色的鏈接&#xff0c;點進去就是抖音小程序。 如果你有了這個小程序&#xff0c;發布視頻的時候可以掛載這個小程序&#xff0c;直播的時候也可以掛載這個小…

Express 實戰(一):概覽

在正式學習 Express 內容之前&#xff0c;我們有必要從大的方面了解一下 Node.js 。 在很長的一段時間里&#xff0c;JavaScript 一門編寫瀏覽器中運行腳本的語言。不過近些年&#xff0c;隨著互聯網的發展以及技術進步&#xff0c;JavaScript 迎來了一個集中爆發的時代。一個…

谷歌關閉跨域限制.(生成一個開發瀏覽器),Chrome關閉跨域

(一)、首先找到瀏覽器在電腦磁盤中的位置,并復制 (二)、復制一個瀏覽器的快捷方式到桌面(不影響正常瀏覽器) (三)、chrom鼠標右鍵屬性&#xff0c;修改快捷方式的目標 &#xff08;四&#xff09;chrome.exe 后面添加 --disable-web-security --user-data-dir 復制的Chrome瀏覽…

787. 歸并排序

文章目錄 QuestionIdeasCode Question 給定你一個長度為 n 的整數數列。 請你使用歸并排序對這個數列按照從小到大進行排序。 并將排好序的數列按順序輸出。 輸入格式 輸入共兩行&#xff0c;第一行包含整數 n 。 第二行包含 n 個整數&#xff08;所有整數均在 1~109 范圍…

JUC并發編程(JUC核心類、TimeUnit類、原子操作類、CASAQS)附帶相關面試題

目錄 1.JUC并發編程的核心類 2.TimeUnit&#xff08;時間單元&#xff09; 3.原子操作類 4.CAS 、AQS機制 1.JUC并發編程的核心類 雖然java中的多線程有效的提升了程序的效率&#xff0c;但是也引發了一系列可能發生的問題&#xff0c;比如死鎖&#xff0c;公平性、資源管理…

【100天精通python】Day34:使用python操作數據庫_ORM(SQLAlchemy)使用

目錄 專欄導讀 1 ORM 概述 2 SQLAlchemy 概述 3 ORM&#xff1a;SQLAlchemy使用 3.1 安裝SQLAlchemy&#xff1a; 3.2 定義數據庫模型類&#xff1a; 3.3 創建數據表&#xff1a; 3.4 插入數據&#xff1a; 3.5 查詢數據&#xff1a; 3.6 更新數據&#xff1a; 3.7 刪…

C/C++中volatile關鍵字詳解

1. 為什么用volatile? C/C 中的 volatile 關鍵字和 const 對應&#xff0c;用來修飾變量&#xff0c;通常用于建立語言級別的 memory barrier。這是 BS 在 "The C Programming Language" 對 volatile 修飾詞的說明&#xff1a; A volatile specifier is a hint to a…

【Git】 git push origin master Everything up-to-date報錯

hello&#xff0c;我是索奇&#xff0c;可以叫我小奇 git push 出錯&#xff1f;顯示 Everything up-to-date 那么看看你是否提交了message 下面是提交的簡單流程 git add . git commit -m "message" git push origin master 大多數伙伴是沒寫git commit -m "…

AI自動駕駛

AI自動駕駛 一、自動駕駛的原理二、自動駕駛的分類三、自動駕駛的挑戰四、自動駕駛的前景五、關鍵技術六、自動駕駛的安全問題七、AI數據與自動駕駛八、自動駕駛的AI算法總結 自動駕駛技術是近年來備受關注的熱門話題。它代表了人工智能和機器學習在汽車行業的重要應用。本文將…

UML之四種事物

目錄 結構事物 行為事物 分組事物&#xff1a; 注釋事物 結構事物 1.類(Class) -類是對一組具有相同屬性、方法、關系和語義的對象的描述。一個類實現一個或多個接口 2.接口(interface) -接口描述 了一個類或構件的一個服務的操作集。接口僅僅是定義了一組操作的規范&…

案例16 基于Spring Boot實現學生新增案例

基于Spring Boot實現學生新增。 1. 創建Spring Boot項目 創建Spring Boot項目&#xff0c;項目名稱為case16-springboot-student01。 ? 2. 設置項目信息 ? 3. 選擇依賴 選擇Lombok ? 選擇Spring Web ? 4. 設置項目名稱 ? 5. Maven依賴 <?xml version"1.0&qu…

Nature子刊 |腸道宏病毒組揭示百歲老人長壽秘訣

發表期刊&#xff1a;nature microbiology 發表時間&#xff1a;2023 影響因子&#xff1a;28.3 DOI: 10.1038/s41564-023-01370-6 研究背景 衰老是一種不可逆轉的自然過程&#xff0c;隨著年齡的增長&#xff0c;機體諸多方面出現功能性下降&#xff0c;與衰老相關的疾病&a…

生成式AI顛覆傳統數據庫的十種方式

對于生成式AI的所有閃光點&#xff0c;這個新時代最大的轉變可能深埋在軟件堆棧中。AI算法正在不易覺察地改變一個又一個數據庫。他們正在用復雜、自適應且看似更直觀的AI新功能顛覆傳統數據庫。 目錄 1、向量和嵌入 2、查詢模型 3、建議 4、索引范例 5、數據分類 6、更…

Unity 框架學習--1

由淺入深&#xff0c;慢慢演化實現框架 兩個類的實現代碼完全一樣&#xff0c;就只有類名或類型不一樣的時候&#xff0c;而且還需要不斷擴展&#xff08;未來會增加各種事件&#xff09;的時候&#xff0c;這時候就用 泛型 繼承 來提取&#xff0c;繼承解決擴展的問題&#…

【RabbitMQ與SpringBoot集成測試收發消息】

【RabbitMQ與SpringBoot集成測試收發消息】 一、環境說明二、實驗步驟三、小結 一、環境說明 安裝環境&#xff1a;虛擬機VMWare Centos7.6 Maven3.6.3 JDK1.8RabbitMQ版本&#xff1a;rabbitmq-server-3.8.8-1.el7.noarch.rpm編程工具Idea 運行JDK為17 二、實驗步驟 在Rab…

List和數組互轉方法以及踩坑點

一、數組轉List 1. 使用for循環逐個添加 String[] arr {"A", "B", "C"}; List<String> list new ArrayList<>(); for (String element : arr) {list.add(element); }2. 使用Arrays.asList(arr) String[] arr {"A", …