历史上的今天
今天是:2025年03月18日(星期二)
2019年03月18日 | STM32F103C8T6在Arduino IDE里编程
2019-03-18 来源:eefocus
前言
时代在进步,极客们手上的单片机也从古老的51、PIC变成了AVR、STM32,也出现了各种便捷的开发工具,例如盛极一时的Arduino;不过Atmega328所属的AVR单片机,终究还是老点了,算起来差不多是20年前的主流了,现在流行的是ARM,今天我们就来玩下Arduino与STM32的结合。
经过半天的努力,终于可以让Arduino IDE支持我的32小板子了,STM32的芯片性价比普遍高于arduino里avr的单片机,所以好处就不用多说了。在这分享下这个有趣的玩法,将会使得STM32的编程更加简单,而不会像KEIL里那么的麻烦(不需了解底层的运作),使得新手更加容易上手,话不多说,走起。。。
板子+USB转TTL(CH340)+USB线

但其实最经典也是最便宜的是下面这款,10块左右(淘宝)

引脚定义为:

好不容易找到一张图,感觉和uno一样功能一目了然,但不是很清晰(将就吧,下面会罗列出来)

软件下载
版本Arduino IDE1.8.7 https://www.arduino.cc/en/Main/Software
安装过程一路next就可以,但需要知道安装目录,默认C盘,本人安装在D盘。

安装完之后,界面非常简单。

Arduino_STM32下载
然后去github上下载代码
Arduino_STM32:
https://github.com/rogerclarkmelbourne/Arduino_STM32

下载压缩文件并解压,并重命名复制到你的Arduino IDE的安装目录里的hardware下,

现在你就可以在工具-开发板里找到STM32系列的板子了

下载安装Arduino SAM开发板
接下来打开Arduino IDE然后选项栏工具-开发板-开发板管理器,下载安装Arduino SAM开发板,不安装这个开发板后编译会出现arm-none-eabi-g++错误(这个应该是交叉编译器);

下载和烧写Bootloder
首先我们要下载Bootloader,进入刚刚那个人的另一个开源项目,地址如下:
https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/binaries
选择你的STM32最小系统板的除电源指示灯外的另一个LED所对应的接口名字的文件下载(一定要选择对应的),我的板子为PC13,所以下载这个:

然后使用USB转串口线连接开发板和电脑USB,其中串口线的TX RX分布连接开发板PA10 PA9,然后将BOOT0短接3.3V BOOT1短接GND进入烧写状态,串口线的VCC GND分布连接开发板的5V 即可无需另外供电。
所需工具:flash_loader_demo_v2.8.0
ST官方下载地址:http://www.st.com/en/development-tools/flasher-stm32.html
下载有些费劲,不知道是网的问题还是电脑的问题,好不容易才下完,为避免麻烦,这里提供网盘下载:
https://pan.baidu.com/s/1SfAn2l6k6tWdIS_jWSzVsg

选择USB串口线的串口号,注意需要boot0 为1,boot1 为0(默认全是0)




在下列红色框内添加下载的bin文件,next,即可完成下载(bootloder的烧写)


驱动安装
进入下面目录D:\Arduino\hardware\Arduino_STM32\drivers\win,以管理员身份运行install_drivers.bat和install_STM_COM_drivers.bat

然后将开发板的串口线断开,将开发板BOOT0接GND后按住重置键不松,使用手机数据线连接开发板MicroUSB和电脑USB开始安装驱动,会发现一个新的USB串行设备,下面为COM11

下载例程测试
将Arduino IDE的上传方式设置为STM32duino bootloader

端口号改成新的串口号

打开一个例程,LED闪烁的,例程里引脚为PB1,修改PC13(和板子对应,也可以不修改接一个LED即可)

例程如下,然后编译上传:

出现Done就代表上传成功了,

然后就可以看到LED闪烁了,大功告成,喝杯水休息下吧。

最后来看下一些常用功能。
1、PWM引脚
序号 物理引脚
0 PA0
1 PA1
2 PA2
3 PA3
6 PA6
7 PA7
8 PA8
9 PA9
10 PA10
16 PB0
22 PB6
23 PB7
PWM引脚简易测试程序,总共有12个PWM引脚,16bit即65536级PWM,很精密了:
void setup()
{
pinMode(PB0, PWM);
pinMode(PA7, PWM);
pinMode(PA6, PWM);
pinMode(PA3, PWM);
pinMode(PA2, PWM);
pinMode(PA1, PWM);
pinMode(PA0, PWM);
pinMode(PB7, PWM);
pinMode(PB6, PWM);
pinMode(PA10, PWM);
pinMode(PA9, PWM);
pinMode(PA8, PWM);
}
void loop()
{
for (int i = 0; i < 65536; i++)
{
delayMicroseconds(40);
pwmWrite(PB0, i);
pwmWrite(PA7, i);
pwmWrite(PA6, i);
pwmWrite(PA3, i);
pwmWrite(PA2, i);
pwmWrite(PA1, i);
pwmWrite(PA0, i);
pwmWrite(PB7, i);
pwmWrite(PB6, i);
pwmWrite(PA10, i);
pwmWrite(PA9, i);
pwmWrite(PA8, i);
}
}
也可以用序号表示:
int pins[12] = {0, 1, 2, 3, 6, 7, 8, 9, 10, 16, 22, 23};
void setup()
{
for (int i = 0; i < 12; i++)
{
pinMode(pins[i], PWM);
}
}
void loop()
{
for (int i = 0; i < 100; i++)
{
for (int j = 0; j < 12; j++)
{
pwmWrite(pins[j], i * i);
}
delay(20);
}
}
2、ADC引脚
物理引脚 ADC通道
PA0 CH0
PA1 CH1
PA2 CH2
PA3 CH3
PA4 CH4
PA5 CH5
PA6 CH6
PA7 CH7
PB0 不能用序号表达
PB1 不能用序号表达
ADC测试程序:
void setup()
{
Serial.begin(115200);
pinMode(PB0, INPUT_ANALOG);
pinMode(PA7, INPUT_ANALOG);
pinMode(PA6, INPUT_ANALOG);
pinMode(PA5, INPUT_ANALOG);
pinMode(PA4, INPUT_ANALOG);
pinMode(PA3, INPUT_ANALOG);
pinMode(PA2, INPUT_ANALOG);
pinMode(PA1, INPUT_ANALOG);
pinMode(PA0, INPUT_ANALOG);
pinMode(PB1, INPUT_ANALOG);
}
void loop()
{
delay(50);
Serial.print("\tPB0="); Serial.print(analogRead(PB0));
Serial.print("\tPA7="); Serial.print(analogRead(PA7));
Serial.print("\tPA6="); Serial.print(analogRead(PA6));
Serial.print("\tPA5="); Serial.print(analogRead(PA5));
Serial.print("\tPA4="); Serial.print(analogRead(PA4));
Serial.print("\tPA3="); Serial.print(analogRead(PA3));
Serial.print("\tPA2="); Serial.print(analogRead(PA2));
Serial.print("\tPA1="); Serial.print(analogRead(PA1));
Serial.print("\tPA0="); Serial.print(analogRead(PA0));
Serial.print("\tPB1="); Serial.println(analogRead(PB1));
}
3、允许的串口
总共3个硬件外接串口Serial1、Serial2、Serial3,一个USB虚拟串口Serial:
void setup()
{
Serial.begin(115200);
Serial1.begin(115200); //TX=PA9,RX=PA10
Serial2.begin(115200); //TX=PA2,RX=PA3
Serial3.begin(115200); //TX=PB10,RX=PB11
}
void loop()
{
delay(100);
Serial.println("Test Serial");
Serial1.println("Test Serial1");
Serial2.println("Test Serial2");
Serial3.println("Test Serial3");
}
还有I2C,SPI等,下载的Arduino_STM32里有相关的例程。
结语
STM32的主频72M,比atmega系列的快多了,而且AD多PWM多串口还多(总之强大太多了),我觉得如果它的库能像Arduino一样丰富,基本它就淘汰了,优胜劣汰,学无止境,奋斗吧!
史海拾趣
|
加了全拼之后,系统会在很多地方进去就以全拼中文的形式,我们可以点全拼语言栏点\"中\"会切换到英文,现在我想让他默认的是全拼英文的形式,不知道怎么弄,我尝试改了注册表几处地方,都没成功. 希望有弄过的朋友指点一下… 查看全部问答> |
|
题目是:信号采集的GUI设计: 要求:(1)能实时采集和显示声音信号或音乐信号。 (2)界面上至少应有信号采集和显示按钮, 信号频谱显示按钮,信号采样频率选择按钮 和信号停止采集按钮四个按钮。 (3)具体流程可参考如下:先启动MATLAB程序 ...… 查看全部问答> |
|
在使用ADS Debug uC/OS系统和一个简单的让蜂鸣器响的应用程序时,AXD loading image后,没有进入StartUP函数而是进入Disassembly,Go后不停的running image ,蜂鸣器不响,也不知道是不是下到板子里了。 请问是怎么回事?… 查看全部问答> |
|
stm8S208仿真时CAN发送报文错误状态寄存器提示格式错误,用的IAR CAN_MCR_TTOM = 0; //禁止时间触发通信 CAN_MCR_ABOM = 1; ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 13:11 编辑 两会(CES,MWC)上,手机“拼爹”(拼硬件)的现象依然严重,但也能看出一些厂商开始更理性的思考问题,譬如三星,在MWC上无大动作,而是推出了带微投功能的智能手机,试图从外围功能上找突破。今天 ...… 查看全部问答> |
|
FOSCAM:国际品牌,外形磨砂、功能稳定、服务质量好。 威视达康: 主攻网络摄像机,产品设计比较美观。 普顺达:买过他们的产品,图像有点偏红,但是不会影响画质。 凯聪: 销售量非常很大,产品营销做的好 青青子木:产品种类不多,主营几款产 ...… 查看全部问答> |




