导航:首页 > 编程知识 > 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怎么上位编程相关的资料

热点内容
怎么u盘里的文件打不开 浏览:97
如何发word文件怎么打开 浏览:176
惠普还原系统win10教程 浏览:167
iphone6ssunspider 浏览:796
java获取摄像头 浏览:959
怎么用网线传文件 浏览:24
电导增量法matlab程序 浏览:366
手机文件管理在那里 浏览:205
如何取消卸载app的续费 浏览:316
数控编程哪个最容易 浏览:170
光速互动官方教程 浏览:411
谷歌登陆网站打不开怎么办 浏览:937
java什么是异步编程 浏览:898
怎么删除qq里面的文件 浏览:503
qq铃声设置的铃声文件在哪里找 浏览:421
有哪些有助于考公的app 浏览:237
四字qq网名 浏览:666
dcm格式文件能发给医圣吗 浏览:998
ps文件大卡顿是显卡问题吗 浏览:616
win7可以用win10易升吗 浏览:56

友情链接