最近在淘宝上看到NUCLEO-F411RE能兼容Arduino,于是入手一块玩玩。于是查找资料搭建化境和做相关实验。断断续续花了好几天,总结一下,供其他人少走弯路。
在Arduino里兼容stm32(NUCLEO-F411RE),第一步是搭建环境然后让板子亮起闪烁灯。
一、Arduino环境搭建:由于网络等等原因,不能用Arduino IDE在线开发板管理器下载的请根据参考(1)进行操作。(建议通读参考(1)文章再操作)
参考(1)https://blog.csdn.net/sinat_41690014/article/details/105456572?utm_medium=distribute.pc_relevant_t0.none-task-blog-searchFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-searchFromBaidu-1.control
若网络好,就很方便。跳过参考(1),直接就可以实现环境搭建。在环境搭建过程就是巨坑,网络问题下载不了。看到了参考(1)文章才解决,在此感谢他。
对于NUCLEO-F411RE不了解,可以看看补充知识阅读:【ST开发板评测】Nucleo-F411RE开箱报告(参考(2)https://blog.csdn.net/whik1194/article/details/90295910)里面还有简介和Nucleo-F411RE相关资料下载。
第二个坑:win10的新电脑CH340驱动安装不了,win10安装CH340失败解决过程及解决(https://blog.csdn.net/js_xiaocainiao/article/details/88662362)
后来直接用STLink,发现可以不用装CH340的驱动。很多的Arduino的板子用的都是CH340芯片下载程序。所以还得装。
二、搭建完环境,开始闪烁灯之旅。
利用Arduino IDE对stm32板子NUCLEO-F411RE进行闪烁灯(LD2对应NUCLEO-F411RE的PA5引脚)程序下载,下载是通过板子上的STLink直接在arudinio里下载程序。
直接用Arduino自带的闪烁灯例程,把引脚改成PA5就可以了(NUCLEO-F411RE文档里有提到是PA5,文档在参考(2)里可以下载)。
void setup() {
// initialize digital pin PB1 as an output.
pinMode(PA5, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(PA5, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(PA5, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
到此NUCLEO-F411RE告一段落,发现STM32F103C8T6小蓝板(STM32 BluePill)也可以用Arduino IDE进行下载和闪烁灯以及OLED液晶显示,于是开始STM32F103C8T6之旅。
上图一张:
三、Arduion IDE下的STM32F103C8T6小蓝板(STM32 BluePill)闪烁灯以和IIC的0.96寸OLED 液晶显示之旅以及mini USB直接下载(无需STLink和USB转TTL设备进行下载)
(1)利用STLink(手头有)在ArduinoIDE下对stm32STM32F103C8T6小板子进行下载闪烁灯程序:
利用自带的闪烁示例,需要把引脚改成PC13(根据前面的引脚图可以看到LED连的是PC13),程序如下:
void setup() {
// initialize digital pin PB1 as an output.
pinMode(PC13, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(PC13, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(PC13, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
板子的相关设置如下图设置即可成功,无需端口设置,Arduino就能识别设备。
(2)STM32F103C8T6在Arduino IDE下用IIC的0.96寸OLED液晶显示
可以阅读参考(3):
https://blog.csdn.net/weixin_44762306/article/details/90443122
https://my.oschina.net/hechunc/blog/4288934
https://www.stmcu.org.cn/module/forum/thread-618559-1-9.html
OLED液晶显示踩了好多坑(第三个坑:u8g2的库下载不了,已上传csdn,可下载U8g2-2.28.10.zip,地址:https://download.csdn.net/download/veteran412/14153542),由于不能用自带的库管理进行下载,改用迅雷下载:https://downloads.arduino.cc/libraries/github.com/olikraus/U8g2-2.28.10.zip 下载完后解压放到\libraries下即可。或者通过加载库的方式找到下载的zip库文件:
剩下操作可以参考https://blog.csdn.net/weixin_44762306/article/details/90443122
注意连线为:oled的SCL连PB6, oled的SDA连PB7
整个程序如下:
/*STM32F103C8T6*/
#include
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* clock=*/ PB6, /* data=*/ PB7, /* reset=*/ U8X8_PIN_NONE);
void setup(void) {
u8g2.begin();
u8g2.enableUTF8Print();
}
void loop(void) {
u8g2.setFont(u8g2_font_6x13_tf);
u8g2.setFontDirection(0);
u8g2.clearBuffer();
u8g2.setCursor(25, 12);
u8g2.print("STM32 ARDUINO");
u8g2.setCursor(0, 26);
u8g2.print("123456789012345678901");
u8g2.setCursor(0, 38);
u8g2.print("Hello OLED Wrold!");
u8g2.setCursor(0, 50);
u8g2.print("Welcome to STMduino.");
u8g2.setCursor(0, 62);
u8g2.print("See you later!");
u8g2.drawFrame(0, 0, 128, 16);
u8g2.sendBuffer();
delay(1000);
}
(3)利用U8g2库在Arduino下的STM32F103C8T6的汉字显示,介绍两种不同的显示方式。
3.1方法一
参考:https://my.oschina.net/hechunc/blog/4288934
U8g2库的自带例程:
去掉U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);前面的注释如下图:
下载成功即可显示:
下载前选择板子(选择Generic STM32F103C6,否则又是一个坑):
如果选了“Generic STM32F103C6/fake STM32F103C8”编译出错,提示如下:(跟ROM有关,猜想是大小超了)
‘rodata’ will not fit in region `rom'。
全部错误提示如下:
c:/users/��/appdata/local/arduino15/packages/arduino/tools/arm-none-eabi-gcc/4.8.3-2014q1/bin/../lib/gcc/arm-none-eabi/4.8.3/../../../../arm-none-eabi/bin/ld.exe: C:\Users\��\AppData\Local\Temp\arduino_build_152514/hanzi2.ino.elf section `.rodata' will not fit in region `rom'
c:/users/��/appdata/local/arduino15/packages/arduino/tools/arm-none-eabi-gcc/4.8.3-2014q1/bin/../lib/gcc/arm-none-eabi/4.8.3/../../../../arm-none-eabi/bin/ld.exe: region `rom' overflowed by 16528 bytes
collect2.exe: error: ld returned 1 exit status
"Wire.h" 对应多个库
已使用: C:\Program Files (x86)\Arduino\hardware\Arduino_STM32\STM32F1\libraries\Wire
未使用:C:\Program Files (x86)\Arduino\hardware\Arduino_STM32\STM32F1\libraries\WireSlave
exit status 1
查看STM32F103C8T6数据手册看到flash有64k。
显示汉字程序如下:
#include
#include
#ifdef U8X8_HAVE_HW_SPI
#include
#endif
#ifdef U8X8_HAVE_HW_I2C
#include
#endif
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
void setup(void) {
u8g2.begin();
u8g2.enableUTF8Print(); // enable UTF8 support for the Arduino print() function
}
void loop(void) {
u8g2.setFont(u8g2_font_unifont_t_chinese2); // use chinese2 for all the glyphs of "你好世界"
u8g2.setFontDirection(0);
u8g2.firstPage();
do {
u8g2.setCursor(0, 15);
u8g2.print("Hello World!");
u8g2.setCursor(0, 40);
u8g2.print("你好世界"); // Chinese "Hello World"
} while ( u8g2.nextPage() );
delay(1000);
}
3.2 方法二:
参考:https://blog.csdn.net/weixin_44762306/article/details/90443122
在参考的往里加如下图所示:
u8g2.setFont(u8g2_font_unifont_t_chinese2);
u8g2.print("你好世界");
现象如下:(图中的stlink没有用到,想直接用minUSB线直接看下面内容,再回来做液晶显示,液晶显示也可以用上面的STLink的下载方式)
整个程序如下:
/*STM32F103C8T6*/
#include
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* clock=*/ PB6, /* data=*/ PB7, /* reset=*/ U8X8_PIN_NONE);
void setup(void) {
u8g2.begin();
u8g2.enableUTF8Print();
}
void loop(void) {
u8g2.setFont(u8g2_font_6x13_tf);
u8g2.setFontDirection(0);
u8g2.clearBuffer();
u8g2.setCursor(25, 12);
u8g2.print("STM32 ARDUINO");
u8g2.setCursor(0, 26);
u8g2.print("123456789012345678901");
u8g2.setCursor(0, 38);
u8g2.setFont(u8g2_font_unifont_t_chinese2);
u8g2.print("你好世界");
//u8g2.print("Hello OLED Wrold!");
//u8g2.setCursor(0, 50);
//u8g2.print("Welcome to STMduino.");
//u8g2.setCursor(0, 62);
//u8g2.print("See you later!");
u8g2.drawFrame(0, 0, 128, 16);
u8g2.sendBuffer();
delay(1000);
}
(4)在Arduino IDE下直接用mini USB先对的STM32F103C8T6进行下载。不用usb转串口(CH340/CH341)或者STLink。
请认真阅读参考:https://www.bilibili.com/read/cv5988943/
第一步:利用STLink把对应板子的bootloader下载到stm32板子里去。(不同板子的板子的bootloader文件根据stm32上的Boot1引脚找到。)
手头的板子如下图:
用的是smart-v2.bin文件。(试过参考中的generic_boot20_pc13.bin,能识别设备但是没有串口显示出来。后来试了smart-v2.bin成功了,烧录完还要“maple串口驱动的安装”maple串口驱动安装请参考:https://blog.csdn.net/sinat_41690014/article/details/105456572?utm_medium=distribute.pc_relevant_t0.none-task-blog-searchFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-searchFromBaidu-1.control
成功烧录bootloader和安装maple之后,按住STM32F103C8T6板子的复位按钮再插入电脑显示后,在设备管理器里显示:
若bootloader烧录错了,驱动安装正确了,则没有出现COM6。设备管理器只有Maple。
STM32F103C8T6的板子最后可以按下图所示步骤设置就可以直接下载示例闪烁灯或者OLED液晶显示程序了,这样可以摆脱STLink和串口转USB设备直接在Arduino下对stm32F103的板子进行下载程序。
(5) 烧录DS18B20例程
改引脚即可成功,程序如下图,我连的PA7引脚:
打开串口现象如下:
最后有兴趣的可以去了解一下:
Stduino IDE
http://www.stduino.com/pindex.php
总结:走了好几个坑,弄了好几天,最后发现用一个MiniUSB线Maple Mini的串口方式下载很方便。不用STLink。若不想用arduino IDE下载,据说直接烧录一个stm32例程就可以还原。(暂时还没有试,手头板子多)
后面的路大家自己兴趣去做。例程中的ws2812的例程也可以是可以的,这里不再贴图。玩过ws2812的基本都会用。