導航:首頁 > 軟體知識 > stm32如何簡化程序代碼

stm32如何簡化程序代碼

發布時間:2022-12-18 17:53:35

Ⅰ STM32怎麼纏寫用戶程序

1、為你的bootloader程序選擇存儲器地址,因為STM32的存儲器FLASH存儲程序代碼空間為512K,需要進行劃分。

2、如果需要使用JTAG在線調試,則需要配置區域:

3、為您的用戶程序選擇合適的存儲空間:同時配置在線調試區域:

4、bootloader程序編寫基本流程如下:

)檢測有無需要更新的標志,用戶可自定義。比如說讀取flash某位置存儲的位元組作為標志位。

2)如需更新,則調用STM32的FLASH程序擦鞋用戶代碼部分。

3)將新的bin文件(即2進制文件直接燒寫進去,需要將keil生成的hex文件轉換為bin文件,然後存儲到外擴展的flash中)寫入到STM32自帶的FLASH中去,記住需要與上述設置的用戶代碼存儲區一致。

4)更新成功後再跳轉至用戶程序。

5、用戶程序需要注意一點,需要在程序運行前重新設置中斷向量表,即:NVIC_SetVectorTable()。

6、用STM32自帶的燒錄軟體進行燒錄時,需要修改項目如下:

1)打開安裝後目標文件中的map文件夾,我們所用的STM32為512Kflash,所以選取STM32_High-density_512K.STmap,將其分解為兩個STmap文件(此文件可用記事本 打開)

STmap文件中,扇區是以每2K為一page來顯示的,所以boot區我們只需要到page7,用戶區我們需要page8到最後。

修改完成後再次打開此軟體會發現多出了兩個flash選項,可以根據此處來選擇需要存儲的代碼區。

然後還有一處需要修改

Ⅱ STM32 新手要怎麼才能快捷的入門,有那種一邊寫代碼一邊視頻教學的視頻教程嗎

STM32 神舟I號 開發板資料 目 錄
術 語 表 8
前言必讀(文檔結構與快速入門) 8
第0章 入門了解篇 8
0.1 STM32嵌入式入門必看之文章(學習STM32的理由!!!!) 8
0.2 如何從零開始開發一款嵌入式產品(20年的嵌入式經驗分享學習神舟系列) 10
0.2.1 需求定義 10
0.2.2 處理器的選擇 12
0.2.3 開發成本的預測和估計 16
0.2.4 產品開發設計文檔(需要包括硬體和軟體兩個方面) 16
0.2.5 嵌入式高手對技術的理解(含辛茹苦這么多年的精華體驗) 18
第1章 神舟I號開發套件硬體結構 19
1.1. 電路原理圖 19
1.2. 功能特點 19
1.3. 神舟I號開發板硬體電路分析 21
1.3.1. STM32F103RBT6處理器 21
1.3.2. LED指示燈 24
1.3.3. 普通按鍵與復位按鍵 25
1.3.4. USB介面 26
1.3.5. USB轉串口介面 27
1.3.6. 供電電源 28
1.3.7. RTC實時時鍾 29
1.3.8. 電位器(ADC介紹) 31
1.3.9. EEPROM存儲器(IIC介面控制) 31
1.3.10. W25X16 16M SPI FLASH(LCD屏上安裝) 32
1.3.11. MicroSD卡介面 33
1.3.12. JTAG調試介面 35
1.3.13. 液晶顯示模塊 37
1.3.14. 溫度感測器 38
1.3.15. 315M無線模塊 39
1.3.16. 2.4G無線模塊 40
1.3.17. 液晶屏 41
1.3.18. 其他擴展介面 41
1.4. 硬體結構說明 43
1.5. 連接器說明 44
1.6. 硬體資源分配 46
1.6.1. 處理器連接外圍器件管腳分配 46
1.7. STM32系列ARM最小系統設計 48
第2章 其他篇 53
2.1. 帶觸摸的液晶屏顯示屏 53
2.2. 液晶屏底板設計說明 53
第3章 STM32神舟I號基本操作篇 53
3.1 簡介 53
3.2 MDK 4.12集成開發環境的組成 53
3.3 安裝MDK的流程步驟 54
3.4 工程的編輯 54
3.4.1 建立工程 54
3.4.2 建立文件 58
3.4.3 添加文件到工程 59
3.4.4 管理工程目錄以及源文件 60
3.4.5 編譯和連接工程 64
3.4.6 打開舊工程 66
3.5 RVMDK使用技巧 68
2.3.1. 快速定位函數/變數被定義的地方 68
2.3.2. 快速注釋與快速消注釋 69
2.3.3. 快速打開頭文件 69
3.6 JLINK V8模擬器的安裝與應用 70
3.6.1 JLINK V8模擬器簡介 71
3.6.2 JLINK ARM主要特點 71
3.6.3 JLINK V8模擬器安裝 71
3.6.4 JLINK V8模擬器配置(MDK KEIL環境) 73
3.6.5 JLINK V8模擬器配置(IAR 環境) 79
3.6.6 J-FLASH如何燒寫固件到晶元FLASH里 83
3.6.7 JLINK Commander工具查看相關信息 87
3.6.8 JLINK V8模擬器如何自動升級 88
3.7 在MDK開發環境中JLINK V8的調試技巧 90
3.8 如何通過串口下載一個固件到神舟I號開發板 92
3.9 從零開始新建一個STM32的工程模板 95
第3章 STM32神舟I號快速入門篇 115
3.1. STM32神舟I號實驗常式結構 115
3.2. 如何給神舟I號板供電 117
3.1.1. 使用USB供電 117
3.1.2. 使用USB轉串口介面供電 117
3.1.3. 使用JLINK V8供電 117
3.3. 燒錄固件程序的三種方法 118
3.4. 如何編譯和運行光碟里的第一個程序: 119
3.10 如何用JLINK V8模擬和調試第一個程序 123
第4章 STM32神舟I號功能部件基礎篇 127
4.1 通用輸入/輸出(GPIO) 127
4.1.1. 特性 127
4.1.2. 應用領域 127
4.1.3. 管腳描述 127
4.1.4. 功能描述 127
4.1.5. 寄存器描述 133
4.1.6. 寄存器小結 137
4.1.7. 常式01 單個LED點燈程序 137
4.1.8. 常式02 單個LED燈閃爍 139
4.1.9. 常式03 LED流水燈程序 140
4.2 中斷控制器 143
4.2.1 簡介 143
4.2.2 特性 143
4.2.3 關於NVIC 143
4.2.4 電平中斷與脈沖中斷 144
4.2.5 中斷初始化與設置流程概述 144
4.2.6 寄存器描述 145
4.2.7 中斷控制函數 148
4.2.8 外部中斷示例 148
4.2.9 嵌套向量中斷控制器(NVIC)使用示例 148
4.2.10 IRQ使用示例 148
4.2.11 軟體中斷使用示例 148
4.2.12 中斷嵌套使用示例 148
4.2.13 這個例子說明如何設置在特定的CortexM3量表 地址以外的默認使用的功能的NVIC_SetVectorTable misc.h / .c驅動程序。 148
4.2.14 實驗的意義與作用 148
4.3 KEY_LED按鍵與315M無線模塊實驗 149
4.2.1. 實驗的意義與作用 149
4.2.2. 實驗原理 149
4.2.3. 硬體設計 150
4.2.4. 軟體設計 150
4.2.5. 下載與測試 154
4.4 USART-COM串口發送實驗 155
4.3.1. 實驗的意義與作用 155
4.3.2. 實驗原理 155
4.3.3. 硬體設計 157
4.3.4. 軟體設計 157
4.3.5. 下載與現象 159
4.5 USART-COM串口發送與接收實驗 162
4.4.1. 實驗的意義與作用 162
4.4.2. 實驗原理 162
4.4.3. 硬體設計 162
4.4.4. 軟體設計 162
4.4.5. 下載與現象 164
4.6 ADC模數轉換實驗 165
4.5.1 實驗的意義與作用 165
4.5.2 實驗原理 165
4.5.3 硬體設計 166
4.5.4 軟體設計 166
4.5.5 下載與現象 168
4.7 EEPROM讀寫程序實驗 169
4.6.1. 實驗的意義與作用 169
4.6.2. 試驗原理 169
4.6.3. 硬體設計 170
4.6.4. 軟體設計 171
4.6.5. 下載與測試 174
4.8 SPI FLASH(W25X16)讀寫程序實驗 175
4.7.1. SPI FLASH(W25X16)讀寫程序實驗的意義與作用 175
4.7.2. 實驗原理 175
4.7.3. 硬體設計 178
4.7.4. 軟體設計 178
4.7.5. 下載與測試現象 185
4.9 實時時鍾與年月日實驗 186
4.8.1. 實驗的意義與作用 186
4.8.2. 實驗原理 186
4.8.3. 硬體設計 187
4.8.4. 軟體設計 188
4.8.5. 下載與測試 194
4.10 獨立看門狗實驗 195
4.9.1. 實驗的意義與作用 195
4.9.2. 實驗原理 195
4.9.3. 硬體設計 197
4.9.4. 軟體設計 197
4.9.5. 下載與測試 199
4.11 SYSTICK實驗 200
4.10.1. 硬體設計 200
4.10.2. 軟體設計 201
4.10.3. 下載與測試 202
4.12 TFT彩屏顯示實驗 203
4.11.1 實驗的意義與作用 203
4.11.2 實驗原理 203
4.11.3 硬體設計 205
4.11.4 軟體設計 206
4.11.5 下載與現象 211
4.13 TFT觸摸屏顯示加觸摸實驗 212
4.12.1. 實驗的意義與作用 212
4.12.2. 實驗原理 212
4.12.3. 硬體設計 213
4.12.4. 軟體設計 213
4.12.5. 下載與現象 218
4.14 DS18B20溫度感測器實驗 219
4.13.1. 實驗的意義與作用 219
4.13.2. 試驗原理 219
4.13.3. 硬體設計 220
4.13.4. 軟體設計 220
4.13.5. 下載與現象 222
4.15 2.4G模塊通信試驗 223
4.14.1. 2.4G模塊通信實驗的意義與作用 223
4.14.2. 實驗原理 223
4.14.3. 硬體設計 223
4.14.4. 軟體設計 224
4.14.5. 下載與測試現象 230
4.16 USB遙控滑鼠實驗 231
4.15.1. 實驗的意義與作用 231
4.15.2. 實驗原理 231
4.15.3. 硬體設計 232
4.15.4. 軟體設計 233
4.15.5. 下載與測試 236
4.17 MICRO SD卡實驗 237
4.16.1. 實驗的意義與作用 237
4.16.2. 實驗原理 237
4.16.3. 硬體設計 239
4.16.4. 軟體設計 240
4.16.5. 下載與測試 244
4.18 SD-USB讀卡器實驗 245
4.17.1. 實驗的意義與作用 246
4.17.2. 試驗原理 246
4.17.3. 硬體設計 246
4.17.4. 軟體設計 247
4.17.5. 下載與測試 250
4.19 UCOS_UCGUI_DEMO實驗 251
第5章 高級實驗 252
第6章 實驗現象 252

Ⅲ 誰來分享下STM32的程序框架

首先我對框架的看法:框架是為了方便我們程序員開發 減少代碼量,及代碼質量的工具 。框架(Framework)是整個或部分系統的可重用設計,表現為一組抽象構件及構件實例間交互的方法。

也就說,程序框架更多的從代碼可用性角度來定義,對於應用層,這樣的概念很多,比如java開發框架,net框架等等,在單片機裡面,我認為:可能更多的框架應該是面向硬體操作行為,即做好單片機基本硬體模塊的操作函數,封裝成一個API函數,然後再你main route裡面使用這些API函數的介面,建立與外界的聯系。

我一般的做法是:

1.做好基本數據結構的重定義,比如typedef一些基本數據類型,使之能夠通用。。

2.做好所有埠的映射,因為單片機的管腳是很多是復用的,做好這些cross-pin,對於復用很有幫助。。

3.做好涉及部件介面的操作函數介面,比如IIC匯流排,做好IIC匯流排操作的代碼,包括read,write函數;

4.做好基本的通用函數介面,比如延時功能,串口調試功能,這些功能介面盡量做到與通用匹配,比如使用delay_ms(),sprintf等等;

5.每一個介面對應一個C文件和H文件,這樣組織框架很容易,而且也容易尋找不同介麵包含在那些文件裡面。。

其他的,就是自己的一些開發習慣了吧。。

Ⅳ stm32用一個按鍵控制兩位數碼管從00-99,代碼怎麼寫

/按鍵控制加、減顯示00-99(P1接8個獨立按鍵,P10按下為加,P11按下為減,P2

接LED數碼管的A- -H並加一個560歐的上拉排阻,P0接數碼管DS1- -DS8位選)

**************************************************************//

按鍵控制加、減顯示00-99(P1接8個獨立按鍵,P10按下為加,P11按下為減,P2

接LED數碼管的A- -H並加一個560歐的上拉排阻,P0接數碼管DS1- -DS8位選)//

#include<reg52.h>

sbit P0_0=P0^0; //個位數字

sbit P0_1=P0^1; //十位數字

void delay(int k); //Tab為數碼管顯示值,存入一個數組內

void key_ccan(void); //聲明按鍵掃描函數

unsigned char code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}unsigned char i,shi,ge,num,count=10; //num為被顯示的數字

void main()

{

P2=Tab[0];P0_0=0;P0_1=0;//顯示00

num=0; //被顯示的數置0

while(1)

{

key_ccan(); //調用按鍵掃描程序

for(i=0;i<count;i++) //顯示個位、十位count次後顯示的數加1

shi=num/10; //取出十位數

ge=num%10; //取出個位數

P0_0=1;P0_1=1; //關閉顯示

P2=Tab[shi]; //P2口送出十位數據顯示代碼

P0_0=0; //打開十位顯示

delay(10); //延時

P0_0=1; //關閉顯示

P2=Tab[ge]; //P2口送出個位數據顯示代碼

P0_1=0; //打開個位顯示

delay(10); //延時

P0_1=1; //關閉個位顯示

}

}

void key_ccan(void)

{

unsigned char ii;

P1=0xff;

ii=P1;

if(ii!=0xff)

{

P1=0xff;

delay(50);

ii=P1;

if(ii!=0xff)

{

switch(ii)

{

case 0xfe: num++;if(num==100) num=0; break;

case 0xfd: if(num==0) num=99;else num--;break;

default: break;

}

}

}

}

void delay(int k) //最簡單的C延時程序

{ unsigned char i;

while(k--) //直至K減為0則跳出

{for(i=100;i>0;i--);}

}


5.9
網路文庫VIP限時優惠現在開通,立享6億+VIP內容
立即獲取
單片機_兩個數碼管顯示00~99
/按鍵控制加、減顯示00-99(P1接8個獨立按鍵,P10按下為加,P11按下為減,P2

接LED數碼管的A- -H並加一個560歐的上拉排阻,P0接數碼管DS1- -DS8位選)

**************************************************************//

按鍵控制加、減顯示00-99(P1接8個獨立按鍵,P10按下為加,P11按下為減,P2

接LED數碼管的A- -H並加一個560歐的上拉排阻,P0接數碼管DS1- -DS8位選)//

#include<reg52.h>

sbit P0_0=P0^0; //個位數字

Ⅳ STM32F,簡單的點亮LED的程序

int main(void)
{
SystemInit();
/* 開啟GPIO時鍾 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
while(1);
}

Ⅵ stm32和vs1003b程序怎麼寫

下面是我的VS1003b_Init代碼:
void My_VS1003b_Init()
{
u16 uReadVal = 0;
My_VS1003b_GPIOConfig();

My_SPI_Init(SPI1);
SPI_SetSpeed(SPI1,SPI_BaudRatePrescaler_16); //在模塊為初始化之前SCLKI = 12MHZ,SPI允許的通信速率為SCLKI/6= 2MHZ
//SDI、SCI為SCLKI/4
// My_VS1003b_ExitConfig();
My_VS1003b_HardReset();
XDCS_H;
XCS_H;
My_TimeDelay(2);
My_VS1003b_WriteSCI(MODE,0x08,0x00);//軟體復位,向0號寄存器寫入0x0804 SM_SDINEW為1 SM_RESET為1 SM_DIFF為1環繞聲
while(My_VS1003b_GetDREQState() == LOW);

My_VS1003b_WriteSCI(CLOCKF,0x98,0x00); //設置 VS1003 的時鍾:例如SCI_CLOCKF=0x9800,向3號寄存器寫入0x9800
//100 11 000 0000 0000 SC_MULT 為4 SC_ADD 為3 SC_FREQ為 0
// 設置完以後XTAIL不變,SCLKI = XTAIL*SC_MULT = 36MHZ,編解碼速率 SCLKI*1.5 = 48MHZ;

uReadVal = My_VS1003b_Read(CLOCKF);
uReadVal += 0 ;

// SPI_SetSpeed(SPI1,SPI_BaudRatePrescaler_8);

My_VS1003b_WriteSCI(AUDATA,0xBB,0x81); //設置 VS1003 的采樣率:SPI_AUDATA=0xbb81,采樣率 0xBB80 48k,0x0001立體聲

uReadVal = My_VS1003b_Read(AUDATA);
uReadVal += 0 ;

My_VS1003b_WriteSCI(BASS,0x00,0x00); //SPI_BASS=0x0055,重音設置,向2號寄存器寫入0x0055
//SB_AMPLITUDE=5 SB_FREQLIMIT=5 低於50Hz時進行5dB的增強
uReadVal = My_VS1003b_Read(BASS);
uReadVal += 0 ;

My_VS1003b_WriteSCI(VOL,VOL_VALUE,VOL_VALUE); //初始設置音量:SCI_VOL=0x2020 左右聲道相同
// while(1)
// {
// uReadVal = My_VS1003b_Read(VOL);
// uReadVal += 0 ;
// }
// VS1003_ResetDecodeTime();
SPI_WriteByte(SPI1,0); //SDI測試
SPI_WriteByte(SPI1,0);
SPI_WriteByte(SPI1,0);
SPI_WriteByte(SPI1,0);
while(My_VS1003b_GetDREQState() == LOW);

VS1003_Sintest(5);
}

SPI初始化代碼:

GPIO初始略過。。。

SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStruct.SPI_CRCPolynomial = 7;

SPI_Cmd(pstSPIx,DISABLE);
SPI_Init(pstSPIx,&SPI_InitStruct);
SPI_Cmd(pstSPIx,ENABLE);

由於我的HCLK = 36MHZ,所以此處為16分頻。。。。

這是我的100b 的 GPIO_Init代碼:
void My_VS1003b_GPIOConfig()
{
GPIO_InitTypeDef GPIO_InitStruct = {0};

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

GPIO_InitStruct.GPIO_Pin = VS1003b_DREQ;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;

GPIO_Init(GPIOC,&GPIO_InitStruct);

GPIO_InitStruct.GPIO_Pin = VS1003b_XDCS | VS1003b_XCS | VS1003b_RSET;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOC,&GPIO_InitStruct);

}

1003b 讀寫模塊函數:

u16 My_VS1003b_Read(u8 uAddress)
{
u16 uReturnVal = 0;

// while(My_VS1003b_GetXCSState() == HIGH);

My_VS1003b_SCIStart();
SPI_WriteByte(SPI1,VS1003b_Read);
SPI_WriteByte(SPI1,uAddress);
uReturnVal = (SPI_ReadWriteByte(SPI1,0xff) << 8);
uReturnVal |= SPI_ReadWriteByte(SPI1,0xff);
My_VS1003b_SCIStop();
return uReturnVal;
}

void My_VS1003b_WriteSDI(u8 uAddress,u8 uVal)
{
// while(My_VS1003b_GetXCSState() == HIGH);

My_VS1003b_SDIStart();
SPI_WriteByte(SPI1,VS1003b_Write);
SPI_WriteByte(SPI1,uAddress);
SPI_ReadWriteByte(SPI1,uVal % 0x100);
My_VS1003b_SDIStop();
My_TimeDelay(1);

}

void My_VS1003b_WriteSCI(u8 uAddress,u8 uHbyte,u8 uLbyte)
{
// while(My_VS1003b_GetXCSState() == HIGH);

My_VS1003b_SCIStart();
SPI_WriteByte(SPI1,VS1003b_Write);
SPI_WriteByte(SPI1,uAddress);
SPI_WriteByte(SPI1,uHbyte);
SPI_WriteByte(SPI1,uLbyte);
My_VS1003b_SCIStop();
My_TimeDelay(1);
}

Ⅶ stm32通過串口與RLM060(RFID模塊)通信,代碼怎麼寫

STM32有個程序叫stm32cubemx,非常方便,然後去花10min看個視頻cubemx如何自動生成代碼並發送簡單字元的,比如你用UART通信,在cubemx里把uart打上勾,設置好DMA中斷之類的直接生成就行了,至於如何通信,要發什麼樣的數據到模塊,就要看模塊具體怎麼定義的了

Ⅷ stm32用一個按鍵控制兩位數碼管從00-99,代碼怎麼寫

按下值加一,然後顯示唄,還不簡單?

Ⅸ 如何生成stm32單片機程序

1,下面以流水燈為例說明STM32CubeMX軟體的使用。
2,
第一步,建立並保存工程。
3,啟動STM32CubeMX軟體,界面如圖2所示。
4,點擊New
Project,在New
Project對話框中選擇Board
Selector標簽頁,在這里有各種ST評估板可以選擇,我們選擇STM32F429I-DISCO,最後點擊OK,如圖3所示。這樣就建立起了STM32F429I-DISCO評估板的工程,這個工程已經根據評估板設置好了,然後可以生成相應的代碼。
5,為了演示如何使用STM32CubeMX軟體,關閉剛剛建立的工程,從頭建立一個新的工程。點擊New
Project,在New
Project對話框中選擇Mcu
Selector標簽頁,然後在MCU
Filter中依次選擇STM32F4,STM32F429/439,在下面列表中選擇STM32F429ZITx,最後點擊OK,如圖4所示。
6,新建立的工程界面如圖5所示。

閱讀全文

與stm32如何簡化程序代碼相關的資料

熱點內容
銀杏的產品都有什麼 瀏覽:819
汽車辦牌照程序怎麼走 瀏覽:829
聯通4g數據網速慢怎麼辦 瀏覽:76
怎麼當哈狗的代理 瀏覽:519
如何查看一列數據有多少是一致的 瀏覽:660
查機動車信息備案是什麼意思 瀏覽:639
專業技術人員保留工資怎麼計算 瀏覽:92
信息不顯示如何解決 瀏覽:946
西安市南二環人才市場處於哪個區 瀏覽:930
代理商需要怎麼管理 瀏覽:857
圖表中的數據標簽如何顯示萬元 瀏覽:634
餐飲市場為什麼沒出現巨頭 瀏覽:150
回收農產品的平台有哪些 瀏覽:517
拼多多產品駁回怎麼辦 瀏覽:310
舟山水產干品交易區怎麼樣 瀏覽:357
高安貨車提檔二手交易稅是多少 瀏覽:114
農民工去菜市場買什麼下酒菜 瀏覽:288
濟南黃岡衛浴市場在哪個位置 瀏覽:835
資料庫坐標怎麼做 瀏覽:274
怎麼樣開發電商產品 瀏覽:664