STM32F429IGT6使用CubeMX配置SPI通信(W25Q256芯片)

1、硬件電路

需要系統性的看一下W25Q256芯片手冊?

2、設置RCC,選擇高速外部時鐘HSE,時鐘設置為180MHz

3、配置SPI

?

4、生成工程配置

?

5、相關代碼

#define sFLASH_ID 0XEF4019 // W25Q256#define SPI_FLASH_PageSize 256
#define SPI_FLASH_PerWritePageSize 256#define W25Q256_WriteEnable 0x06    // 寫使能指令
#define W25Q256_WriteDisable 0x04   // 寫屏蔽指令
#define W25Q256_ReadStatusReg 0x05  // 讀取狀態寄存器1
#define W25Q256_WriteStatusReg 0x01 // 寫入狀態寄存器1
//#define W25Q256_ReadData 0x03       // 3字節模式讀取數據指令
#define W25Q256_ReadData 0x13       // 4字節模式讀取數據指令
#define W25Q256_FastReadData 0x0B   //
#define W25Q256_FastReadDual 0x3B
#define W25Q256_PageProgram 0x02 // 頁寫入指令
#define W25Q256_BlockErase 0xD8
#define W25Q256_SectorErase 0x20
#define W25Q256_ChipErase 0xC7
#define W25Q256_PowerDown 0xB9
#define W25Q256_ReleasePowerDown 0xAB
#define W25Q256_DeviceID 0xAB
#define W25Q256_ManufactDeviceID 0x90
#define W25Q256_JedecDeviceID 0x9F
#define W25Q256_Enter4ByteMode 0xB7 // 4字節地址模式指令
#define W25Q256_ReadStatusRegister3 0x15
#define W25Q256_WriteStatusRegister3 0x11   //寫狀態寄存器3指令
#define WIP_Flag 0x01
#define Dummy_Byte 0xFF#define FLASH_WriteAddress 0x00000
#define FLASH_ReadAddress FLASH_WriteAddress
#define FLASH_SectorToErase FLASH_WriteAddress/* 獲取緩沖區的長度 */
#define TxBufferSize1 (countof(TxBuffer1) - 1)
#define RxBufferSize1 (countof(TxBuffer1) - 1)
#define countof(a) (sizeof(a) / sizeof(*(a)))
#define BufferSize (countof(Tx_Buffer) - 1)#define FLASH_WriteAddress 0x00000
#define FLASH_ReadAddress FLASH_WriteAddress
#define FLASH_SectorToErase FLASH_WriteAddress/* 發送緩沖區初始化 */
extern uint8_t ReadBuff[4096];
extern uint8_t WriteBuff[4096];

/*** @brief   拉低片選線* @param   無* @retval  無*/
void SPI_FLASH_NSS_LOW(void)
{HAL_GPIO_WritePin(SPI5_NSS_GPIO_Port, SPI5_NSS_Pin, GPIO_PIN_RESET);
}/*** @brief   拉高片選線* @param   無* @retval  無*/
void SPI_FLASH_NSS_HIGH(void)
{HAL_GPIO_WritePin(SPI5_NSS_GPIO_Port, SPI5_NSS_Pin, GPIO_PIN_SET);
}/*** @brief   獲取 FLASH ID* @param   無* @retval  FLASH ID*/
uint32_t SPI_FLASH_ReadID(void)
{uint32_t temp = 0;uint32_t temp0 = 0;uint32_t temp1 = 0;uint32_t temp2 = 0;// 拉低片選線,開始通信SPI_FLASH_NSS_LOW();// 發送獲取W25Q256芯片ID指令SPI_FLASH_SendByte(W25Q256_JedecDeviceID);// 接收數據temp0 = SPI_FLASH_ReadByte();temp1 = SPI_FLASH_ReadByte();temp2 = SPI_FLASH_ReadByte();// 拉高片選線,結束通信SPI_FLASH_NSS_HIGH();temp = temp0 << 16 | temp1 << 8 | temp2;return temp;
}/*** @brief   發送一個字節* @param   無* @retval  無*/
void SPI_FLASH_SendByte(uint8_t ch)
{HAL_SPI_Transmit(&hspi5, &ch, 1, 500);
}/*** @brief   發送n個字節* @param   pData:發送數據首地址* @param   data_number:發送數據個數(以字節為單位)* @retval  無*/
void SPI_FLASH_SendnByte(uint8_t *pData, uint32_t data_number)
{HAL_SPI_Transmit(&hspi5, pData, data_number, 500);
}/*** @brief   接收一個字節* @param   無* @retval  接收的數據*/
uint8_t SPI_FLASH_ReadByte(void)
{uint8_t rxData = 0;HAL_SPI_Receive(&hspi5, &rxData, 1, 500);return rxData;
}/*** @brief   接收n個字節* @param   pData:接收數據首地址* @param   data_number:接收數據個數(以字節為單位)* @retval  無*/
void SPI_FLASH_ReadnByte(uint8_t *pData, uint32_t data_number)
{HAL_SPI_Receive(&hspi5, pData, data_number, 500);
}/*** @brief   使能寫命令* @param   無* @param   無* @retval  無*/
void SPI_FLASH_WriteEnable(void)
{// 拉低片選線,開始通信SPI_FLASH_NSS_LOW();// 發送寫使能指令SPI_FLASH_SendByte(W25Q256_WriteEnable);// 拉高片選線,結束通信SPI_FLASH_NSS_HIGH();
}/*** @brief   等待寫入、擦除等操作完成* @param   無* @param   無* @retval  無*/
void SPI_FLASH_WaitForWriteEnd(void)
{uint8_t FLASH_Status = 0;// 拉低片選線,開始通信SPI_FLASH_NSS_LOW();// 發送寫狀態寄存器1指令SPI_FLASH_SendByte(W25Q256_ReadStatusReg);do{// 獲取寫狀態寄存器1的值并做判斷。0:空閑、1:忙碌FLASH_Status = SPI_FLASH_ReadByte();} while (SET == (FLASH_Status & WIP_Flag));// 拉高片選線,結束通信SPI_FLASH_NSS_HIGH();
}/*** @brief   擦除扇區* @param   SectorAddr:擦除扇區首地址* @retval  無*/
void SPI_FLASH_SectorErase(uint32_t SectorAddr)
{// uint8_t ADDR[4] = {0x00,0x00,0x00,0x00};//  使能寫命令SPI_FLASH_WriteEnable();// 拉低片選線,開始通信SPI_FLASH_NSS_LOW();// 發送擦除扇區命令SPI_FLASH_SendByte(W25Q256_SectorErase);// 發送擦除地址24 ~ 31bitSPI_FLASH_SendByte((SectorAddr & 0xFF000000) >> 24);// 發送擦除地址16 ~ 23bitSPI_FLASH_SendByte((SectorAddr & 0xFF0000) >> 16);// 發送擦除地址8 ~ 15bitSPI_FLASH_SendByte((SectorAddr & 0xFF00) >> 8);// 發送擦除地址0 ~ 7bitSPI_FLASH_SendByte(SectorAddr & 0xFF);// 拉高片選線,結束通信SPI_FLASH_NSS_HIGH();// HAL_Delay(3000);// 等待擦除操作結束SPI_FLASH_WaitForOperaEnd();
}/*** @brief   配置4字節模式* @param   無* @retval  無*/
void SPI_FLASH_FOUR_MODE(void)
{uint8_t temp = 0;// 使能寫命令SPI_FLASH_WriteEnable();// 拉低片選線,開始通信SPI_FLASH_NSS_LOW();// 發送寫狀態寄存器3命令SPI_FLASH_SendByte(W25Q256_WriteStatusRegister3);// 發送要寫的數據SPI_FLASH_SendByte(0x02);// 拉高片選線,結束通信SPI_FLASH_NSS_HIGH();// 拉低片選線,開始通信SPI_FLASH_NSS_LOW();// 發送讀狀態寄存器3命令SPI_FLASH_SendByte(W25Q256_ReadStatusRegister3);// 讀取數據temp = SPI_FLASH_ReadByte();// 拉高片選線,結束通信SPI_FLASH_NSS_HIGH();if (1 == (0x02 & temp)){// 拉低片選線,開始通信SPI_FLASH_NSS_LOW();// 發送配置四字節模式指令SPI_FLASH_SendByte(W25Q256_Enter4ByteMode);// 拉高片選線,結束通信SPI_FLASH_NSS_HIGH();}SPI_FLASH_WaitForOperaEnd();
}/*** @brief   對 FLASH 按頁寫入數據,調用本函數寫入數據前需要先擦除扇區* @param   pBuffer:要寫入數據的指針* @param   WriteAddr:寫入數據地址* @param   NumByteToWrite:寫入數據長度。必須小于等于SPI_FLASH_PerWritePageSize* @retval  無*/
void SPI_FLASH_PageWrite(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite)
{// 使能寫命令SPI_FLASH_WriteEnable();// 拉低片選線,開始通信SPI_FLASH_NSS_LOW();// 發送頁寫入指令SPI_FLASH_SendByte(W25Q256_PageProgram);// 發送寫入地址[24,31]bitSPI_FLASH_SendByte((WriteAddr & 0xFF000000) >> 24);// 發送寫入地址[16,23]bitSPI_FLASH_SendByte((WriteAddr & 0xFF0000) >> 16);// 發送寫入地址[8,15]bitSPI_FLASH_SendByte((WriteAddr & 0xFF00) >> 8);// 發送寫入地址[0,7]bitSPI_FLASH_SendByte(WriteAddr & 0xFF);if (NumByteToWrite > SPI_FLASH_PerWritePageSize){NumByteToWrite = SPI_FLASH_PerWritePageSize;printf("256\r\n");}for (int i = 0; i < NumByteToWrite; i++){SPI_FLASH_SendByte(pBuffer[i]);}// 拉高片選線,結束通信SPI_FLASH_NSS_HIGH();
}/*** @brief   FALSH不定量數據寫入函數,調用本函數寫入數據前需要先擦除扇區* @param   pBuffer:要寫入數據的指針* @param   WriteAddr:寫入數據地址* @param   NumByteToWrite:寫入數據長度* @retval  無*/
void SPI_FLASH_BufferWrite(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite)
{uint8_t NumOfPage = 0;uint8_t NumOfSingle = 0;uint8_t Addr = 0;uint8_t count = 0;uint8_t temp = 0;/*mod 運算求余,若 writeAddr 是 SPI_FLASH_PageSize 整數倍,運算結果 Addr 值為0*/Addr = WriteAddr % SPI_FLASH_PageSize;/* 差 count 個數據值,剛好可以對齊到頁地址 */count = SPI_FLASH_PageSize - Addr;/* 計算出要寫多少整數頁 */NumOfPage = NumByteToWrite / SPI_FLASH_PageSize;/*mod 運算求余,計算出剩余不滿一頁的字節數 */NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;/* Addr=0, 則 WriteAddr 剛好按頁對齊 aligned */if (0 == Addr){/*NumByteToWrite < SPI_FLASH_PageSize*/if (0 == NumOfPage){SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成}else{/* 先把整數頁都寫了 */for (int i = 0; i < NumOfPage; i++){SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成WriteAddr += SPI_FLASH_PageSize;pBuffer += SPI_FLASH_PageSize;}/* 若有多余的不滿一頁的數據,把它寫完 */SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成}}else /* 若地址與 SPI_FLASH_PageSize 不對齊 */{/*NumByteToWrite < SPI_FLASH_PageSize*/if (0 == NumOfPage){/* 當前頁剩余的 count 個位置比 NumOfSingle 小,寫不完 */if (NumOfSingle > count){temp = NumOfSingle - count;/* 先寫滿當前頁 */SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成WriteAddr += count;pBuffer += count;/* 再寫剩余的數據 */SPI_FLASH_PageWrite(pBuffer, WriteAddr, temp);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成}else /* 當前頁剩余的 count 個位置能寫完 NumOfSingle 個數據 */{SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成}}else /*NumByteToWrite > SPI_FLASH_PageSize*/{/*先把距離頁地址的count個數據減去,計算需要寫的頁數和NumOfSingle,然后寫數據時先把原來減去的count個數據寫入,寫滿當前頁*//*再寫剩余數據,即計算好的NumOfPage和NumOfSingle*/NumByteToWrite -= count;NumOfPage = NumByteToWrite / SPI_FLASH_PageSize;NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成WriteAddr += count;pBuffer += count;/* 把整數頁都寫了 */for (int i = 0; i < NumOfPage; i++){SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成WriteAddr += SPI_FLASH_PageSize;pBuffer += SPI_FLASH_PageSize;}if (0 != NumOfSingle){SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成}}}
}/*** @brief   讀取FLASH數據* @param   pBuffer:存儲讀出數據的指針* @param   WriteAddr:讀取地址* @param   NumByteToRead:讀取數據長度* @retval  無*/
void SPI_FLASH_BufferRead(uint8_t *pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead)
{// 拉低片選線,開始通信SPI_FLASH_NSS_LOW();// 發送讀取數據指令SPI_FLASH_SendByte(W25Q256_ReadData);// 發送讀取地址[24,31]bitSPI_FLASH_SendByte((ReadAddr & 0xFF000000) >> 24);// 發送讀取地址[16,23]bitSPI_FLASH_SendByte((ReadAddr & 0xFF0000) >> 16);// 發送讀取地址[8,15]bitSPI_FLASH_SendByte((ReadAddr & 0xFF00) >> 8);// 發送讀取地址[0,7]bitSPI_FLASH_SendByte(ReadAddr & 0xFF);// 讀取數據for (int i = 0; i < NumByteToRead; i++){// 讀取一個字節數據pBuffer[i] = SPI_FLASH_ReadByte();}// 拉高片選線,結束通信SPI_FLASH_NSS_HIGH();SPI_FLASH_WaitForOperaEnd(); // 等待操作完成
}/*** @brief   等待寫入、擦除等操作結束* @param   none* @param   none* @param   none* @retval  none*/
void SPI_FLASH_WaitForOperaEnd(void)
{uint8_t FLASH_Status = 0;// 拉低片選線,開始通信SPI_FLASH_NSS_LOW();// 發送讀狀態寄存器1指令SPI_FLASH_SendByte(W25Q256_ReadStatusReg);do{// 接收讀取狀態寄存器1寄存器內容FLASH_Status = SPI_FLASH_ReadByte();} while (SET == (FLASH_Status & WIP_Flag));// 拉高片選線,結束通信SPI_FLASH_NSS_HIGH();
}
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_SPI5_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */// 進入4字節地址模式SPI_FLASH_FOUR_MODE();printf("W25Q256 SPI readwrite test!!!\r\n");device_ID = SPI_FLASH_ReadID();printf("device_ID = 0x%x\r\n", device_ID);SPI_FLASH_SectorErase(0x00); // 擦除扇區數據// 讀取擦除后的數據SPI_FLASH_BufferRead(ReadBuff, 0x00, 4096);printf("*****************讀取擦出后的數據*****************\r\n");for (int i = 0; i < 4096; i++){printf("ReadBuff[%d] = 0x%02x\t", i, ReadBuff[i]);if (0 == (i + 1) % 8 && (i + 1) >= 8){printf("\r\n");}}for (int i = 0; i < 256; i++){WriteBuff[i] = i;}SPI_FLASH_BufferWrite(WriteBuff, 0xFF, 256);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成// 讀數據SPI_FLASH_BufferRead(ReadBuff, 0xFF, 256);SPI_FLASH_WaitForOperaEnd(); // 等待操作完成printf("*****************讀取寫入后的數據*****************\r\n");for (int i = 0; i < 256; i++){printf("ReadBuff[%d] = 0x%02x\t", i, ReadBuff[i]);if (0 == (i + 1) % 8 && (i + 1) >= 8){printf("\r\n");}}/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */LED_TIME();}/* USER CODE END 3 */
}

6、實驗現象

?

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

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

相關文章

《雷達像智能識別對抗研究進展》閱讀記錄

&#xff08;1&#xff09;引言 ? 神經網絡通常存在魯棒性缺陷&#xff0c;易受到對抗攻擊的威脅。攻擊者可以隱蔽的誘導雷達智能目標識別做出錯誤預測&#xff0c;如&#xff1a; ? a圖是自行車&#xff0c;加上對抗擾動后神經網絡就會將其識別為挖掘機。 &#xff08;2&a…

【Quarkus技術系列】打造基于Quarkus的云原生微服務框架實踐(1)

前提介紹 本系列文章主要講解如何基于Quarkus技術搭建和開發"專為Kubernetes而優化的Java微服務框架"的入門和實踐&#xff0c;你將會學習到如何搭建Quarkus微服務腳環境及腳手架&#xff0c;開發Quarkus的端點服務&#xff0c;系統和應用層級的配置介紹與Quarkus的…

單芯片3路CC管理的VR轉接器解決方案

VR眼鏡即VR頭顯&#xff0c;也稱虛擬現實頭戴式顯示設備&#xff0c;隨著元宇宙概念的傳播&#xff0c;VR眼鏡的熱度一直只增不減&#xff0c;但是頭戴設備的續航一直被人詬病&#xff0c;如果增大電池就會讓頭顯變得笨重影響體驗&#xff0c;所以目前最佳的解決方案還是使用VR…

C# BeginInvoke 加 EndInvoke實現異步操作

1、定義一個委托 delegate long MyDel(int first, int second); 2、 需異步操作的函數 static int sum(int x,int y) {Console.WriteLine("InSide Sum1");Thread.Sleep(1000);Console.WriteLine("InSide Sum2");return x y;} 3、回調方法…

[HDLBits] Exams/m2014 q3

Consider the function f shown in the Karnaugh map below. Implement this function. d is dont-care, which means you may choose to output whatever value is convenient. //empty

gitui 解決 git error:Bad credentials.

問題描述 cat .git/config """ [remote "origin"]url gitgitcode.net:xxx.gitfetch refs/heads/*:refs/remotes/origin/* """ls -lh ~/.ssh/ """ -rw------- 1 z z 2.6K 8月 12 15:04 id_rsa -rw-r--r-- 1 z z 56…

學習左耳聽風欄目90天——第六天 6/90(學習左耳朵耗子的工匠精神,對技術的熱愛)【如何擁有技術領導力】

學習左耳聽風欄目90天——第六天 6/90&#xff08;學習左耳朵耗子的工匠精神&#xff0c;對技術的熱愛&#xff09;【如何擁有技術領導力】

【第358場周賽】限制條件下元素之間的最小絕對差,Java解密。

LeetCode 第358場周賽 恒生專場。 文章目錄 劍指Offer:限制條件下元素之間的最小絕對差示例:限制:解題思路:劍指Offer:限制條件下元素之間的最小絕對差 【題目描述】 給你一個下標從 0 開始的整數數組 nums 和一個整數 x 。 請你找到數組中下標距離至少為 x 的兩個元素的…

虛擬機內搭建CTFd平臺搭建及CTF題庫部署,局域網內機器可以訪問

一、虛擬機環境搭建 1、安裝docker、git、docker-compose ubuntu&#xff1a; sudo apt-get update #更新系統 sudo apt-get -y install docker.io #安裝docker sudo apt-get -y install git #安裝git sudo apt-get -y install python3-pip #安裝pip3 sudo pip install dock…

SQL筆記

最近的工作對SQL的應用程度較高&#xff0c;而且寫的sql類型基本沒怎么涉及過&#xff0c;把用到的幾個關鍵字記錄下。 使用環境&#xff1a;達夢數據庫 達夢數據庫有個特點&#xff0c;他有一個叫模式的說法&#xff0c;在圖形化工具里直接點擊創建查詢窗口&#xff0c;不用像…

Kubeadm安裝K8s集群

一、硬件環境 準備3臺Linux服務器&#xff0c;此處用Vmware虛擬機。 主機名CPU內存k8smaster2核4Gk8snode12核4Gk8snode22核4G 二、系統前置準備 配置三臺主機的hosts文件 cat << EOF > /etc/hosts 192.168.240.130 k8smaster 192.168.240.132 k8snode1 192.168.…

Sql奇技淫巧之ROWNUM偽列

ROWNUM偽列 ROWNUM是一個偽列&#xff0c;它是根據每次查詢的結果動態生成的一列遞增編號&#xff0c;表示 Oracle 從表中選擇該行的順序&#xff0c;選擇的第一行ROWNUM為1&#xff0c;第二行ROWNUM為2&#xff0c;以此類推。 注意1&#xff1a; ROWNUM偽列是在WHERE子句之…

torch.profiler

什么是torch.profiler PyTorch Profiler 是一個工具&#xff0c;它允許在訓練和推理期間收集性能指標。Profiler 的上下文管理器 API 可用于更好地了解哪些模型操作最昂貴&#xff0c;檢查它們的輸入形狀和調用堆棧&#xff0c;研究設備內核活動并可視化執行跟蹤。 性能指標&…

騰訊出品Pag動畫框架在Android端的使用-初級

Pag動畫框架作為一個第三方框架&#xff0c;它的優缺點與Lottie是相似&#xff0c;此處不過多贅述。如果你們的項目中打算用了&#xff0c;肯定是經過了一定的調研的。Pag動畫框架分幾個版本&#xff0c;有免費的有收費的。我們目前用的社區免費版&#xff0c;只用來展示Pag動畫…

項目實戰 — 消息隊列(8){網絡通信設計②}

目錄 一、客戶端設計 &#x1f345; 1、設計三個核心類 &#x1f345; 2、完善Connection類 &#x1f384; 讀取請求和響應、創建channel &#x1f384; 添加掃描線程 &#x1f384; 處理不同的響應 &#x1f384; 關閉連接 &#x1f345; 3、完善Channel類 &#x1f384; 編…

廣州華銳互動:VR3D課程在線教育平臺為職業院校提供沉浸式的虛擬現實學習體驗

隨著科技的飛速發展&#xff0c;虛擬現實(VR)和增強現實(AR)技術已經逐漸滲透到我們生活的各個領域。其中&#xff0c;VR3D課程在線教育平臺作為一種新興的教育方式&#xff0c;正在逐漸改變我們的學習方式和體驗。本文將詳細介紹VR3D課程在線教育平臺的應用前景及特點。 VR3D課…

VFP現代物流企業管理系統的設計與實現

摘要: 隨著計算機技術的廣泛應用,在現代流通企業管理中引入計算機管理技術,成為一個值得深入研究的問題。 本文首先概要的論述了數據庫的有關知識與現狀。之后,對當代計算機數據庫技術的現狀,尤其是對關系型數據庫作了系統的描述。在此基礎上,論文重點對數據庫的開發環境 …

【設計模式】工廠模式

工廠模式 工廠模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的設計模式之一。這種類型的設計模式屬于創建型模式&#xff0c;它提供了一種創建對象的最佳方式。 工廠模式提供了一種將對象的實例化過程封裝在工廠類中的方式。通過使用工廠模式&#xff0c;可以…

Mysql整理二 - 常見查詢語句面試題(附原表)

表結構&#xff0c;創建原表的代碼在最后 -- cid課程id; tid老師id; sid學生id; select * from t_mysql_course; select * from t_mysql_score; select * from t_mysql_student; select * from t_mysql_teacher; 1. 查詢" 01 “課程比” 02 "課程成績高的學生的信息…

uniapp軟鍵盤談起遮住輸入框和頭部被頂起的問題解決

推薦&#xff1a; pages.json中配置如下可解決頭部被頂起和表單被遮住的問題。 { "path": "pages/debug/protocol/tagWord", "style": { "app-plus": { "soft…