導航:首頁 > 編程知識 > stm32怎麼上位編程

stm32怎麼上位編程

發布時間:2022-09-17 20:37:35

Ⅰ 求指導,用電腦做上位機,利用串口怎麼實現對STM32各個引腳的控制

通過電腦連接stm32的usart外設,通過你自己定義的通訊協議,在usart接收中斷中編寫中斷處理程序,比如收到 GPIOA1就改變這個io的功能什麼的。主要看你電腦和stm32的通訊協議怎麼編寫了。

Ⅱ 求教,下位機(基於stm32)能否實現上位機的部分功能

就 stm32 而言,處理速度是夠用了,只是RAM太小,裝不了多少文本的,如果用FSMC擴展一下RAM應該夠了。
還有就是軟體,目前好像沒有什麼可供stm32運行的文本編輯器程序,你可能需要移植一個,最簡單的是以前PC機的DOS系統下的文本編輯器,體積也不大。

Ⅲ STM32是否需要PC機編程用哪些軟體

必須要PC機編程啊,STM32自己可不能編譯程序!
用的軟體,一般就是keil MDK,最好的就是IAR for stm32,還有聽說不多的TASKING編譯器。

Ⅳ stm32如何接受到來自上位機的指令啊

串口通信,需要哪些數據傳輸,根據你設計的程序確定。比如程序中用到A,那麼你可以在上位機中改變,然後判斷A是否改變,如改變怎使用最新的值。

Ⅳ 給stm32做上位機,用什麼語言編程合適

支持較底層的語言都可以,像C#、C++、Delphi等。。。。。。甚至java。。。。。還要看是作什麼服務用的,最後才確定語言
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Ⅵ 單片機使用的是stm32,將採集到的數據進行上位機顯示。對上位機小白,該使用什麼軟體來編寫

多數用VB寫的,也有用C++等其它編寫的。

Ⅶ 【上下位機通信】:下位機(STM32)通過網口(DM9000之類的.)向上位機PC發送數據。求上位機例子程序~

用socket 類 udp tcp 我這給你個 最簡單的例子 udp

伺服器端

ImportsSystem.Net.Sockets

ImportsSystem.Net

Molesocketsever

Submain()

startserver()

EndSub

PrivateSubstartserver()

'創建伺服器端的socket

DimsServerAsNewSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp)

DimmyipAsIPAddress

'制訂本地迴路的ip地址

myip=IPAddress.Parse("10.13.115.105")

'設置伺服器埠號

DimsServerepAsNewIPEndPoint(myip,2001)

'設置客戶端的埠號

DimclientepAsNewIPEndPoint(myip,2002)

'將埠與socket綁定

sServer.Bind(sServerep)

WhileTrue

Try

Dimbytes(100)AsByte

'等待客戶端的請求

sServer.ReceiveFrom(bytes,clientep)

DimstrAsString=System.Text.Encoding.ASCII.GetString(bytes)

'將字元轉化成大寫

str=str.ToUpper

bytes=System.Text.Encoding.ASCII.GetBytes(str)

'返回結果

sServer.SendTo(bytes,clientep)

CatcheAsSocketException

EndTry

EndWhile

EndSub

EndMole

客戶端

界面 和程序

ImportsSystem.Net.Sockets

ImportsSystem.Net

PublicClassForm1

InheritsSystem.Windows.Forms.Form

PrivateSubbsend_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)Handlesbsend.Click

'創建客戶端的socket

DimcClientAsNewSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp)

'指定本地迴路的ip地址

Dimmyip,myip1AsIPAddress

myip=IPAddress.Parse("10.13.115.105")

myip1=IPAddress.Parse("10.13.115.136")

'設置伺服器埠號

DimServerepAsNewIPEndPoint(myip1,2001)

'設置客戶端的埠號

DimclientepAsNewIPEndPoint(myip,2002)

'將埠與socket綁定

cClient.Bind(clientep)

Try

DimstrAsString=Textinput.Text

Dimbytes()AsByte=System.Text.Encoding.ASCII.GetBytes(str)

'向伺服器發出請求

cClient.SendTo(bytes,Serverep)

Dimbytes2(100)AsByte

'接受伺服器的響應結果

cClient.ReceiveFrom(bytes2,Serverep)

str=System.Text.Encoding.ASCII.GetString(bytes2)

'將結果顯示在文本框中

Textdisplay.Text=Textdisplay.Text&vbNewLine&str

CatcherAsSocketException

MsgBox(er.ToString)

EndTry

cClient.Close()

EndSub

EndClass

Ⅷ stm32怎麼通過printf發送數據到上位機

這個需要通過STM32的串口。

①如果你的上位機是電腦,那麼需要一個USB轉TTL,TTL端接STM32串口。

②編寫STM32串口驅動(這個很容易的,配置引腳和串口)

③通過標准庫的printf或自己編寫printf與串口驅動對接。

我以前做智能小車寫了一份串口驅動,你可以自己看然後改一下:

(或者可以用庫函數,網路很容易找到,我不太喜歡庫函數)


/*******************usart_asm.s*******************/

;****usart驅動,匯編版****

USART1 EQU 0X40013800

USART2 EQU 0x40004400

DROS EQU 0X04

SROS EQU 0X00


;介面聲明

EXPORT printChar

EXPORT printStr

EXPORT printNum

EXPORT SelectUsart

;介面聲明,END


;引用聲明

IMPORT Div_U32

;引用聲明,end


;數據區

AREA USART_ADDRESS,DATA,READWRITE

Cur_Usart DCD USART2 ;當前usart地址存儲,默認為usart2

Num_Buffer SPACE 12 ;定義10byte緩沖堆棧

;數據區,end


AREA USART_CODE,CODE,READONLY

;SelectUsart,選擇Usart,參數2:usart器件代號(1=usart1,非1=usart2)

SelectUsart

STMFD SP!,{R1,LR} ;入棧

LDR R1,=Cur_Usart ;讀入usart地址暫存器地址

CMP R0,#1

BNE U2

U1 LDR R0,=USART1

B SETSR

U2 LDR R0,=USART2

SETSR

STR R0,[R1]

LDMFD SP!,{R1,PC} ;出棧

;SelectUsart,end



;***printChar ,參數1:char

printChar

STMFD SP!,{R1-R2,LR} ;入棧

LDR R1,=Cur_Usart

LDR R1,[R1] ;載入Usart地址

CHR_WAIT

LDR R2,[R1,#SROS] ;讀狀態寄存器

TST R2,#0X80

BEQ CHR_WAIT ;等待上次傳輸完成

STRB R0,[R1,#DROS] ;寫入

LDMFD SP!,{R1-R2,PC} ;出棧

;***printChar ,end



;***printStr ,參數1:str

printStr

STMFD SP!,{R1-R3,LR} ;入棧

LDR R1,=Cur_Usart

LDR R1,[R1] ;載入Usart地址

SEND_STR

LDR R2,[R1,#SROS]

TST R2,#0X80

BEQ SEND_STR ;等待上次傳輸完成

LDRB R3,[R0],#1 ;將指針(R0)處字元讀入R3

STRB R3,[R1,#DROS];寫入

CMP R3,#0

BNE SEND_STR;循環直到結束符''

LDMFD SP!,{R1-R3,PC} ;出棧

;***printStr ,end



;printNum ,參數1:NUM,參數2:usart器件代號(1=usart1,非1=usart2)

printNum

STMFD SP!,{R1-R5,LR} ;入棧

LDR R1,=10 ;除數為10,被除數已在R0中

LDR R3,=Num_Buffer ;載入緩沖區首地址

LDR R4,=0

LDR R5,=0 ;負數指示器,1=負數

TST R0,#0x80000000

BEQ STR_NUM ;正數

EOR R0,#0xFFFFFFFF ;負數,反轉

ADD R0,#1

LDR R5,=1

STR_NUM

BL Div_U32

ADD R2,R2,#0x30 ;轉換為char

STRB R2,[R3],#1 ;余數存入緩沖區

ADD R4,R4,#1 ;計數+1

CMP R0,#0

BNE STR_NUM ;直到商為0

CMP R5,#1

LDR R1,=Cur_Usart

LDR R1,[R1] ;載入Usart地址

BNE SEND_NUM ;正數

LDR R2,='-'

STRB R2,[R3],#1 ;'-'號存入緩沖區

ADD R4,R4,#1 ;計數+1

SEND_NUM

LDRB R0,[R3,#-1]!

SEND_WAIT

LDR R2,[R1,#SROS] ;讀狀態寄存器

TST R2,#0X80

BEQ SEND_WAIT ;等待上次傳輸完成

STRB R0,[R1,#DROS] ;寫入

SUBS R4,R4,#1

BNE SEND_NUM

LDMFD SP!,{R1-R5,PC} ;出棧

;printNum ,end



usart.h

/*********************************************
USART2{TX=PA2,Rx=PA3},USART1{TX=PA9,Rx=PA10}
*********************************************/
#ifndefUSART_H_
#defineUSART_H_

#include"Common.h"
#include"I2C.h"
#include"SG90.h"
#include"SRF05.h"

#defineUSART_RECV_BUFF_SIZE15

#definePclk1_36MHz36000000//其他USART
#definePclk2_72MHz72000000//USART1
#defineUSART_PSC16 //PrescalerValue時鍾預分頻

//#defineCrLf{0x0D,0x0A,0x00}

voisart_init(void);


u32calcBRRDiv(u32BaudRate,u32Pclk);

externvoidSelectUsart(u32Usart);//Usart為usart代號1為usart1,非1為usart2
externvoidprintChar(charch);//由匯編實現
externvoidprintStr(char*str);
externvoidprintNum(s32num);

#ifdefDEBUG
voidprintf(char*s,...);
#endif

#endif


usart.c

#include"usart.h"
#include"stdarg.h"
//串口

/***私有函數聲明***/
u32calcBRRDiv(u32BaudRate,u32Pclk);

//------------------------------------------------------------------
//函數名:voisart_init(void)
//輸入參數:無
//返回參數:無
//說明:初始化串口寄存器
//備註:DEBUG模式下將會初始化USART1
//------------------------------------------------------------------
voisart_init(void)
{
//Usart2配置
USART2->BRR=calcBRRDiv(9600,Pclk1_36MHz);//(USART_BRR)
USART2->GTPR=USART_PSC/2;//(USART_GTPR)
USART2->CR1=0x0000202C;//(USART_CR1)0x000020EC
USART2->CR2=0; //(USART_CR2)
USART2->CR3=0; //(USART_CR3)
#ifdefDEBUG
//Usart1配置
USART1->BRR=calcBRRDiv(9600,Pclk2_72MHz);//(USART_BRR)
USART1->GTPR=USART_PSC/2;//(USART_GTPR)
USART1->CR1=0x0000202C;//(USART_CR1)
#endif
}


#ifdefDEBUG

voidprintf(char*format,...)
{
va_listargs;

va_start(args,format);

while(*format)
{
if(*format=='%')
{
switch(*++format)
{
case'c':
printChar((char)va_arg(args,int));
break;
case's':
printStr(va_arg(args,char*));
break;
case'd':
printNum((s32)va_arg(args,s32));
break;
case'%':
printChar('%');
break;
}
}
else
{
printChar(*format);
}
format++;
}

va_end(args);
}
#endif

//------------------------------------------------------------------
//函數名:voidUSART2_IRQHandler(void)
//輸入參數:null
//返回參數:null
//說明:串口接收中斷服務
//------------------------------------------------------------------
constucharBTCtrl_DataFrameHeader[5]={0xa5,0x5a,0x11,0xf5,0};//藍牙控制數據幀頭
ucharser_dat[USART_RECV_BUFF_SIZE];//數據緩沖區
boolbProcessCompleted=true;//判斷一幀數據是否處理完成,當一幀數據接收完畢,則該變數被置為false

enumBTProcessingFlag/*藍牙數據接收模式*/
{
CheckingFrameHeader,//檢測數據幀頭
ReceivingData//接收數據包
};
voidUSART2_IRQHandler(void)
{
staticucharser_x=0;
staticucharmat_x=0;//matchx
staticucharsum=0;
=CheckingFrameHeader;

if(bProcessCompleted)//!上一幀數據處理完成之後
{
if(USART2->SR&1<<5)//!判斷讀寄存器是否非空
{
if(dflag==CheckingFrameHeader)
{
if(USART2->DR==BTCtrl_DataFrameHeader[mat_x])
{
mat_x++;
}
else
{
mat_x=0;
}
if(BTCtrl_DataFrameHeader[mat_x]==0)//!數據頭結束,更換模式准備接收數據
{
dflag=ReceivingData;
ser_x=0;
mat_x=0;
sum=0;
}
}
elseif(dflag==ReceivingData)
{
ser_dat[ser_x]=USART2->DR;
if(ser_x==USART_RECV_BUFF_SIZE-1)//!只接收USART_RECV_BUFF_SIZE位元組
{
sum+=BTCtrl_DataFrameHeader[2];
sum+=BTCtrl_DataFrameHeader[3];
dflag=CheckingFrameHeader;//!切換接收模式
if(ser_dat[USART_RECV_BUFF_SIZE-1]==sum)//!數據檢驗
{
bProcessCompleted=false;//!數據正確,置接收完成標志
USART2->CR1&=~(1<<13);//!停止usart2
}
}
sum+=ser_dat[ser_x];//!數據驗證
ser_x++;
}
}
}
}

//------------------------------------------------------------------
//函數名:u32calcBRRDiv(u32BaudRate,u32Pclk)
//輸入參數:BaudRate=波特率,Pclk=RCC時鍾頻率
//返回參數:應置入寄存器的值
//說明:計算相應波特率以及時鍾頻率對應的BRRDiv寄存器中應該填入的值
//備註:計算方法參照(分數波特率的產生)
//------------------------------------------------------------------
u32calcBRRDiv(u32BaudRate,u32Pclk)
{
u32div_mant;
u32div_frac;
floatfrac;
div_mant=Pclk/(USART_PSC*BaudRate);
frac=(float)Pclk/(USART_PSC*BaudRate);
frac-=div_mant;
frac*=USART_PSC;
div_frac=(u32)frac;
div_frac+=(frac-div_frac)>=0.5?1:0;//四捨五入

if(div_frac==USART_PSC)//滿USART_PSC進位
{
div_frac=0;
div_mant++;
}
div_mant<<=4;
div_mant|=div_frac;
returndiv_mant;
}

Ⅸ stc 32位單片機怎麼編程

stm32和51單片機相比,代碼效率高(32位包含信息量大,多數指令一個位元組搞定)、執行速度快(72MHz系統時鍾不是蓋的)、功能強大(外設豐富、管腳多、管腳功能可重映射),優點多多。編程的區別,stm32基本別比劃匯編了,能把腦袋搞大大滴,寄存器太多了,位數也多,我一直搞51匯編也放棄了。C語言編程區別就不大了,況且stm32在國內技術支持很到位,資料豐富(關鍵是不但有E文,中文資料翻譯的也多),還有完整的庫函數支持,從51轉過去沒太大困難。有51相似電路的程序,移植的話好多都不用改的,只是針對寄存器、IO口、中斷等的修改,軟體流程、控制邏輯基本不用改。
說了一大堆,不是說stm32有多好學,還是有點難度,但比起它的優越來,付出是值得的。希望對你有所幫助。

閱讀全文

與stm32怎麼上位編程相關的資料

熱點內容
ps3文件分割視頻 瀏覽:280
微信圖片一鍵轉發軟體 瀏覽:331
如何判斷s200plc編程電纜 瀏覽:691
太原編程培訓班哪個好 瀏覽:171
樹葉吹奏教程 瀏覽:6
社交app帶來了哪些社會問題 瀏覽:394
如何安裝愛寶8800數據採集器 瀏覽:712
文件保存了怎麼找不到了 瀏覽:476
彩票網站怎麼辨真假 瀏覽:840
pr找不到該文件 瀏覽:963
java移除panel 瀏覽:354
jsp填充jsp 瀏覽:166
海關外貿大數據在哪裡查 瀏覽:381
思特奇java筆試題 瀏覽:121
葫蘆俠在手機中的文件名 瀏覽:813
plc編程應該怎麼收錢 瀏覽:584
c語言中源文件由什麼組成 瀏覽:890
linuxhttpdphp配置文件 瀏覽:607
拆單數據要怎麼保存 瀏覽:17
mac電腦怎樣壓縮文件到100m 瀏覽:645

友情鏈接