stm32单片机可以用Keil5、STM32CubeIDE、IAR等进行编程。
1、Keil MDK:Keil支持目前大多数单片机,Keil根据不同内核单片机,分为几个版本,最常用的就是Keil C51和MDK-ARM。像STC和一些51内核的单片机,一般用KeilC51版本,STM32则用的MDK-ARM。
2、STM32CubeIDE:STM32CubeIDE是ST公司推出的免费多功能STM32开发工具,可以说专门为STM32而生,新增了很多STM32专用功能,比如说外设图形化配置。为工程师大大提高开发效率,降低开发成本。
3、IAR:IAR我是在开发Ti蓝牙产品和基于STM8单片机会用到的。IAR也可以用来开发STM32的程序。通过IAR编译出来的程序比Keil优化得更好,最直接的体现就是编译出来的程序更节约内存空间。和上面Keil类似,IAR同样支持很多单片机,有很多功能基本两者都有。
STM32的介绍:
在STM32F105和STM32F107互连型系列微控制器之前,意法半导体已经推出STM32基本型系列、增强型系列、USB基本型系列、互补型系列;新系列产品沿用增强型系列的72MHz处理频率。
内存包括64KB到256KB闪存和20KB到64KB嵌入式SRAM。新系列采用LQFP64、LQFP100和LFBGA100三种封装,不同的封装保持引脚排列一致性,结合STM32平台的设计理念,开发人员通过选择产品可重新优化功能、存储器、性能和引脚数量,以最小的硬件变化来满足个性化的应用需求。
意法半导体(STMicroelectronics)整个集团共有员工近50000名,拥有16个先进的研发机构、39个设计和应用中心、15主要制造厂,并在36个国家设有78个销售办事处。
这个应该是通过串口发送数据信息的,发送和接收在一根信号线上,手上没有现成的程序,你看看这个在其他网上的行不行,
最好根据手册自己写
#include <avr/ioh>
#include <util/delayh>
void InitUart0(void)
{
UCSR0A = 0x02; // 设置为倍速模式
UBRR0H = 0;
UBRR0L = 1;
UCSR0B = (1<<RXEN)|(1<<TXEN);// 接收器与发送器使能
UCSR0C = (3<<UCSZ0);
DDRE &= ~_BV(PE0); // 初始化RX 端口默认方向为输入
PORTE &= ~_BV(PE0); // 初始化RX 端口默认状态为高阻
DDRE |= _BV(PE1); // 初始化TX 端口默认方向为输出
PORTE |= _BV(PE1); // 初始化TX 端口默认状态为高电平
DDRA |= _BV(PA0); // 初始化使能端口状态方向为输出
PORTA &= ~_BV(PA0); // 初始化使能端口状态为RX 状态
DDRA |= _BV(PA1); // 初始化使能端口状态方向为输出
PORTA |= _BV(PA1); // 初始化使能端口状态方为TX 状态
}
void SendUart0Byte(unsigned char data)
{
while ( !( UCSR0A & (1<<UDRE)) );// 等待发送缓冲器为空
UDR0 = data;/ 将数据放入缓冲器,发送数据/
}
void SetServoLimit(unsigned char id, unsigned short int cw_limit, unsigned short int ccw_limit)
{
unsigned short int temp_ccw = 0; // 临时速度,用于进行方向判别
unsigned short int temp_cw = 0;
unsigned char temp_ccw_h = 0; // 待发送数据h 位
unsigned char temp_ccw_l = 0; // 待发送数据l 位
unsigned char temp_cw_h = 0;
unsigned char temp_cw_l = 0;
unsigned char temp_sum = 0; // 校验和寄存变量
if (ccw_limit > 1023)
{
temp_ccw = 1023; // 限制速度值在可用范围内
}
else
{
temp_ccw = ccw_limit;
}
if (cw_limit > 1023)
{
temp_cw = 1023;
}
else
{
temp_cw = cw_limit;
}
temp_ccw_h = (unsigned char)(temp_ccw >> 8);
temp_ccw_l = (unsigned char)temp_ccw; // 将16bit 数据拆为2个8bit 数据
temp_cw_h = (unsigned char)(temp_cw >> 8);
temp_cw_l = (unsigned char)temp_cw; // 将16bit 数据拆为2个8bit 数据
PORTA &= ~_BV(PA1);
PORTA |= _BV(PA0); // 使总线处于主机发送状态
UCSR0A |= (1<<TXC0); // 清除UART0写完成标志
SendUart0Byte(0xFF); // 发送启动符号0xFF
SendUart0Byte(0xFF); // 发送启动符号0xFF
SendUart0Byte(id); // 发送id
SendUart0Byte(7); // 发送数据长度为参数长度+2,参数长度为3
SendUart0Byte(0x03); // 命令数据为“WRITE DATA”
SendUart0Byte(0x06); // 舵机控制寄存器首地址
SendUart0Byte(temp_cw_l); // 发送顺时针位置限制低位
SendUart0Byte(temp_cw_h); // 发送顺时针位置限制高位
SendUart0Byte(temp_ccw_l); // 发送逆时针位置限制低位
SendUart0Byte(temp_ccw_h); // 发送逆时针位置限制高位
temp_sum = id + 7 + 0x03 + 0x06 + temp_cw_l + temp_cw_h + temp_ccw_l + temp_ccw_h;
temp_sum = ~temp_sum; // 计算校验和
SendUart0Byte(temp_sum); // 发送校验和
while ( !( UCSR0A & (1<<TXC0)) ) // 等待发送完成
{ // (Waiting for finishing sending)
;
}
PORTA |= _BV(PA1);
PORTA &= ~_BV(PA0); // 使总线处于主机接收状态
_delay_ms(2); //送完成后,总线会被从机占用,反馈应答数据,所以进行延时
}
void SetServoPosition(unsigned char id, unsigned short int position, unsigned short int
velocity)
{
unsigned short int temp_velocity = 0; // 临时速度,用于进行方向判别
unsigned short int temp_position = 0;
unsigned char temp_velocity_h = 0; // 待发送数据h 位
unsigned char temp_velocity_l = 0; // 待发送数据l 位
unsigned char temp_position_h = 0;
unsigned char temp_position_l = 0;
unsigned char temp_sum = 0; // 校验和寄存变量
if (velocity > 1023)
{
temp_velocity = 1023; // 限制速度值在可用范围内
}
else
{
temp_velocity = velocity;
}
if (position > 1023)
{
temp_position = 1023;
}
else
{
temp_position = position;
}
temp_velocity_h = (unsigned char)(temp_velocity >> 8);
// 将16bit 数据拆为2个8bit 数据
temp_velocity_l = (unsigned char)temp_velocity;
temp_position_h = (unsigned char)(temp_position >> 8);
// 将16bit 数据拆为2个8bit 数据
temp_position_l = (unsigned char)temp_position;
PORTA &= ~_BV(PA1);
PORTA |= _BV(PA0); // 使总线处于主机发送状态
UCSR0A |= (1<<TXC0); // 清除UART0写完成标志
SendUart0Byte(0xFF); // 发送启动符号0xFF
SendUart0Byte(0xFF);
SendUart0Byte(id); // 发送id
SendUart0Byte(7); // 发送数据长度为参数长度+2,参数长度为3
SendUart0Byte(0x03); // 命令数据为“WRITE DATA”
SendUart0Byte(0x1E); // 舵机控制寄存器首地址
SendUart0Byte(temp_position_l); // 发送速度数据低位
SendUart0Byte(temp_position_h); // 发送速度数据高位
SendUart0Byte(temp_velocity_l); //发送位置低字节
SendUart0Byte(temp_velocity_h); // 发送位置高字节
temp_sum = id + 7 + 0x03 + 0x1E + temp_position_l + temp_position_h + temp_velocity_l +
temp_velocity_h;
temp_sum = ~temp_sum; // 计算校验和
SendUart0Byte(temp_sum); // 发送校验和 (Send the checksum)
while ( !( UCSR0A & (1<<TXC0)) ) // 等待发送完成
{ // (Waiting for finishing sending)
;
}
PORTA |= _BV(PA1);
PORTA &= ~_BV(PA0); // 使总线处于主机接收状态
_delay_ms(2); // 发送完成后,总线会被从机占用,反馈应答数据,所以进行延时
}
void SetServoVelocity(unsigned char id, signed short int velocity)
{
unsigned char temp_sign = 0; // 临时符号,用于进行方向判别
unsigned short int temp_velocity = 0; // 临时速度,用于进行方向判别
unsigned char temp_value_h = 0; // 待发送数据h 位
unsigned char temp_value_l = 0; // 待发送数据l 位
unsigned char temp_sum = 0; // 校验和寄存变量
if (velocity < 0)
{
temp_velocity = -velocity; // 如果为负数,则取绝对值
temp_sign = 1; // 设置负数符号标志
}
else
{
temp_velocity = velocity;
temp_sign = 0; // 设置正数符号标志
}
if (temp_velocity > 1023)
{
temp_velocity = 1023; // 限制速度值在可用范围内
}
temp_velocity |= (temp_sign << 10);
temp_value_h = (unsigned char)(temp_velocity >> 8);
// 将16bit 数据拆为2个8bit 数据
temp_value_l = (unsigned char)temp_velocity;
PORTA &= ~_BV(PA1);
PORTA |= _BV(PA0); // 使总线处于主机发送状态
UCSR0A |= (1<<TXC0); // 清除UART0写完成标志
SendUart0Byte(0xFF); // 发送启动符号0xFF
SendUart0Byte(0xFF); // 发送启动符号0xFF
SendUart0Byte(id); // 发送id
SendUart0Byte(5); // 发送数据长度为参数长度+2,参数长度为3
SendUart0Byte(0x03); // 命令数据为“WRITE DATA”
SendUart0Byte(0x20); // 舵机控制寄存器首地址
SendUart0Byte(temp_value_l); // 发送速度数据低位
SendUart0Byte(temp_value_h); // 发送速度数据高位
temp_sum = id + 5 + 0x03 + 0x20 + temp_value_l + temp_value_h;
temp_sum = ~temp_sum; // 计算校验和
SendUart0Byte(temp_sum); // 发送校验和
while ( !( UCSR0A & (1<<TXC0)) ) // 等待发送完成
{
;
}
PORTA |= _BV(PA1);
PORTA &= ~_BV(PA0); // 使总线处于主机接收状态
_delay_ms(2); // 发送完成后,总线会被从机占用,反馈应答数据,所以进行延时
}
int main(void)
{
InitUart0();
SetServoLimit(2,0,1023);
while(1)
{
_delay_ms(1000); //延时1s
SetServoPosition(2, 1000, 500); //控制舵机以500的速度运动到1000的位置
_delay_ms(1000); //延时1s
SetServoPosition(2, 200, 100); //控制舵机以100的速度运动到200的位置
}
}
Keil5可以给STM32单片机烧录程序,也可以执行原有程序。
Keil5通过专用的烧录器,可以将程序直接烧入STM32单片机的内存中,实现程序的烧录。Keil5还支持从STM32单片机的内存中读取原有程序,实现程序的执行。因此,Keil5可以给STM32单片机烧录程序,也可以执行原有程序。
此外,Keil5还支持从STM32单片机的内存中读取原有程序,并进行编译、调试和优化,实现对原有程序的优化和改进。因此,可以说Keil5可以实现程序的完整管理,从烧录、执行到优化,可以用于STM32单片机的程序管理。
一、焊接好下载好后
二、连接ST-LINK V2
ST-LINK V2 STM32
33V 3V3
SWDIO SWIO
SWCLK SWCLK
GND GND
三、下载好keil5 MDK 版
计算机的,下载的软件应该很简单吧
四、安装驱动
先下载驱动
插上你的调试器,下载好打开下图这个,一直next就好,然后打开设备管理器
五、打开一个现成的工程
出现什么乱七八糟的先不要理他,后面我们慢慢调
六、配置
点击小魔术棒,找到debug,先找flash downlode
也可以去官网下载。
下载好后
file------------>import-------------------->找到刚刚下载的东西
一直next就好,前提你得安装好MDK版的keil5
Flash文件夹下就会多了很多东西
重新打开keil5,小魔术棒找到debug,进入setting,再选择debug,跟着选择这几个,点确定和OK,之后,如果出现,这是因为目标板的芯片处于休眠的状态,按复位键(板子上的小红色按键),再重新编译和下载就好,这样就是成功了的,现在可以看到板子一闪一闪的了。
Stm32不能跑了,程序跑飞这类的问题,我之前在开发过程中就遇到过,造成这种不良,有很多可能的原因,软件硬件都有可能,需要从几个方面去排查
硬件方面:
1 stm32的供电电压是否稳定,是否在正常工作电压范围内。电源文波大小一定要小,一般Ldo供电在33v在几个ma ,在stm32的vdda 和vssa引脚一定要接磁珠,各个电源硬件要接滤波电容
2 晶振以及旁路电容,一定要尽可能的靠近单片机,整个电路中是否有裸露的接口如usb io 口 这类的接口,因为冬天人体或者其他物体静电很大,当瞬间大静电通过接触,传导给单片机时,很容易引起单片机复位或者死机,所以有这样的接口需要做防静电电路,或者专用防静电芯片在保护单片机不死机。
3单片机复位电路,一定在设计的时候需要加旁路电容,同时需要保证复位电路电源稳定,这个与第一点原因说明一样。
4无线射频信号,当电路中有无线类如蓝牙wifi gsm等无线射频信号时,也很容易因为无线辐射干扰造成单片机死机,这个就需要找专业测试天线的公司或者设备或者人员去测试辐射状态。无线射频的电线一定要匹配好,否则很容易会有无法预测的不良状态出现。
可以。根据查询相关公开信息显示,stm32的芯片,出厂时都自带了串口烧写功能,可以在不使用特殊的下载器、只用串口的条件下将程序烧写进去。STM32系列专为要求高性能、低成本、低功耗的嵌入式应用设计的ARMCortex-M0,M0+,M3,M4和M7内核。
以上就是关于stm32用什么软件编程全部的内容,包括:stm32用什么软件编程、求stm32控制四自由度舵机的程序、keil5给stm32单片机烧录程序还是执行原来程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)