你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

初试STM32基于Arduino的使用

[复制链接]
STMCU小助手 发布时间:2023-2-5 16:02

059528864f3c4a5ba4d3968e5caf3e8a.jpg

Arduino的板子虽然有国内的兼容板子,但最终价格也要在40+(意大利原产的就要100+了)。虽然也已经不贵了,但是如果一个方案里用的板子多了,整体成本也是在那里的。况且谁又不希望用最低的价格做最多的事呢?就在儿子4年级时,他们的信息课开始在学习Arduino的简单开发。当时学校发了2块Arduino Uno,这没有毛病。但又过了一个学期,换了一个供应商,发过来的是长这样的板子。

5c17697ac4824bc0a285f556a7da6886.png

STM32F030 Demo Board


那一下我就懵了,还有这种玩法?但是其实当时老师并没有让他们直接在上面编程的,而是老师已经写好代码,固定了输入和输出口,学生只要根据需要换输入和输出的模块就可以实现很多功能了。而我的确上网查了一下,STM32是可以基于Arduino来写代码的,但是因为老师的这种操作,所以我就没有机会接触到是怎么用Arduino来编写STM32的代码了。这事一放就放下几年。最近在搞那个乘车方案,要用到3个端,特别是用户手持端是要人手一个的。它需要做到体积小,成本低。这就让我重新想起STM32了。但是开始搞了一下,不得要领,最后还是放弃了。这两天折腾别的板子时,顺手拿起来,发现搞定了。那现在就记录一下吧。

一、在Arduino开发环境中增加STM32

1️⃣ 添加“附加开发板管理网址”
找到“首选项”

a9e28c5cf7434339911494a071079bf1.png

修改“附加开发管理器网址”

64f9fc77e2e343f992a735e9876dfefb.png

链接是这个,直接拷贝进去就行。这个是比较新的,一些兄弟分享的网址因为是过去分享的,已经无效的,所以请使用我分享的这个。有助于避坑。(如果你修改完这个后发现Arduino启动不了了,请看本文最后的解决方法。)

如果你好奇,可以用浏览器打开它,它是长下面这个样的。具体内容就是一些板子的信息和对应的工具及所有相关代码和包的下载地址等。

46e1a72b468147f4a175ddcf373a15af.png

然后点击界面上的“好”。就完成了这一步。

2️⃣ 增加STM32开发板
在“工具”=>"开发板:XXX"里找到“开发板管理器”

85addf94bedf4ce98cae657686c20258.png

然后选择“贡献”,找到STM32 MCU based boards,将它安装就行了。我这里因为已经安装了,所以“安装”按钮是灰的。安装过程需要点时间, 国内连Github有点慢,如果你有加速的方式的话这时可以拿出来用了。

dc22793498db4b8fa6b68822ba6d6271.png

3️⃣ 选择STM32开发板
安装完后,你就可以在这里选择你的开发板了。我的是STM32F0系列,所以选择了Generic STM32F0 Series。

670ea3f814674982999adeb8c296483c.png

记得选择STM32CubeProgrammer(Serial),这是我们通过UART(也就是TX, RX方式连接)的上传方式。

a002cfefa8e544f89a225addd6b6711d.png

4️⃣ 写代码测试
到这里我们就可以写代码试一试了。

我从Arduino的示例中找到了"Blink"这个示例。

12abdd556914487ea2b60d217e3c9ad6.png

得到如下代码:
  1. void setup() {
  2.   // initialize digital pin LED_BUILTIN as an output.
  3.   pinMode(LED_BUILTIN, OUTPUT);
  4. }

  5. // the loop function runs over and over again forever
  6. void loop() {
  7.   digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  8.   delay(1000);                       // wait for a second
  9.   digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  10.   delay(1000);                       // wait for a second
  11. }
复制代码


如果你细心看,这里的“LED_BUILTIN”是蓝色的。但是STM32是不支持这个宏定义的,那我要怎么操作STM32的各个PIN呢?我找了很多文章,发现原来其实使用起来很简单,看下图,你要用到哪个PIN,直接用哪个PIN的名字就行了。比如我用的是PA4,代码里面直接用PA4就行了。另外,如果你细心看,你会发现下图中用绿色圈出来的LED灯其实就是有2根深色的线连着PA4的。所以我们只要设置PA4的电平,就能让这个LED灯亮起来。

a1c815c2198c429c809173a33d78427f.png

代码我改成了这样:
  1. void setup() {
  2.   // initialize digital pin LED_BUILTIN as an output.
  3.   pinMode(PA4, OUTPUT);
  4. }

  5. // the loop function runs over and over again forever
  6. void loop() {
  7.   digitalWrite(PA4, HIGH);   // turn the LED on (HIGH is the voltage level)
  8.   delay(1000);                       // wait for a second
  9.   digitalWrite(PA4, LOW);    // turn the LED off by making the voltage LOW
  10.   delay(1000);                       // wait for a second
  11. }
复制代码


* 注意,观察,当你选择了STM32的板子后,这个代码里的“PA4”会变成蓝色。而如果你选回Arduino Uno,那PA4就变回黑色。也就是说,如果看到是蓝色的,那表示你没有写错了。

5️⃣ 下载
1. 关于连线
接下来就是要下载了。还记得我一开篇说我之前曾经不得要领吗?问题就在这里。我根据使用Arduino的经验,想当然地连上了MicroUSB线,但发现电脑找不到我的STM32F030。我一直以为这块板子时间长了,坏掉了。然后另一篇文章中,我提到新买的那块Arduino Nano不能用(其实是选错芯片类型了),我以为是USB控制器坏了,所以我用USB转TTL(下图这个东西)来连它,发现原来这样也是可以正常使用的。所以啦,我在想,那这个STM32应该是USB控制器坏了,我用USB转TTL不就好了?

fff47f98b6094b0abbc58202b7dbec66.png

连上后,发现可以正常下载代码了。你猜怎么着?我又查了一下STM32F030 Demo Board的文档。发现人家就写着"Power only"。为我的无知感到汗颜。

b00b226fb7e442e99c2b5ffd7df6ae91.png

连线方式如下,因为没有找到Fritzing的对应STM32的部件,所以直接拍照。(有STM32的Fritzing部件的同学请分享给我一下。先谢过!)

23ca7002620b4f80ac4c2e2e58eefc11.png

具体连法如下。其实习惯了的话都知道,看到Tx和Rx,只要反着对连就能跟模块通信了。我一个做软件的觉得这种方式很无敌啊。

1NGK@AOS0OXA(1D}}@{I)Y4.png

2. 下载
这时准备要点击Arduino的下载,但在此之前,记得让板子启动到bootloader模式。就是将板子上的跳线跳到3v3的位置然后接通电源(跳完按“重置按钮”效果也一样)。

642b7ffbc5db49d99ef2cbd2cee46e22.png

这时就可以点“下载”了。

870ad0ec2f2e407a918bdcb49b9640ff.png

下载完成后,再将跳线跳回GND去,再按重置按钮。板子就会启动到工作状态,代码运行了。

8167c89633ea4e909cb9706572b656a6.png

二、参考资料:

三、附录
你在修改“附加开发管理器网址”时,不知道有没有遇到问题。我因为用了旧的地址,最后导致Arduino的IDE打不开了。我通过cmd.exe,然后手工运动Arduino里的Arduino_debug.exe看到了报错信息,发现报这个错。


  1. java.io.FileNotFoundException: C:\Users\Eric.Li\AppData\Local\Arduino15 (拒绝访问。)
  2.         at java.io.FileInputStream.open0(Native Method)
  3.         at java.io.FileInputStream.open(FileInputStream.java:195)
  4.         at java.io.FileInputStream.<init>(FileInputStream.java:138)
  5.         at cc.arduino.contributions.packages.ContributionsIndexer.parseIndex(ContributionsIndexer.java:234)
  6.         at cc.arduino.contributions.packages.ContributionsIndexer.mergeContributions(ContributionsIndexer.java:179)
  7.         at cc.arduino.contributions.packages.ContributionsIndexer.parseIndex(ContributionsIndexer.java:116)
  8.         at processing.app.BaseNoGui.initPackages(BaseNoGui.java:483)
  9.         at processing.app.Base.<init>(Base.java:272)
  10.         at processing.app.Base.main(Base.java:150)
复制代码
99eee2956dbf4e18a46ddd342f1200b3.png

然后在网上查了,然后做了如下操作。
有兄弟将这个"Arduino15“目录给删除掉了就好了。我试了将这个目录修改名字(Arduino15改为Arduino15X),有效的,Arduino的IDE能打开了。
但是我觉得这种做法不科学,所以我进入目录看,发现Arduino的IDE重新创建了Arduino15这个目录,而里面只有一个"preferences.txt"文件。
我用这个文件覆盖我原来那个目录(Arduino15X),又将新目录(Arduino15)删除,再将原来那个目录(Arduino15X)修改名字变回Arduino15,一切工作正常。
那其实问题就很明确了,就是”preferences.txt“文件里有错。
修复操作就是将最新加的内容,也就是开发板管理器地址去掉就好了。

  1. board=uno

  2. /***********干掉下面这行就可以了***********/

  3. boardsmanager.additional.urls=https://raw.githubusercontent.com/stm32duino/BoardManagerFiles/main/package_stmicroelectronics_index.json

  4. /****************************************/

  5. build.verbose=false
  6. build.warn_data_percentage=75
  7. cache.enable=true
  8. compiler.cache_core=true
  9. compiler.warning_level=none
  10. console=true
  11. console.auto_clear=true
  12. console.error.file=stderr.txt
  13. console.length=500
  14. console.lines=4
  15. console.output.file=stdout.txt
  16. editor.antialias=true
  17. editor.auto_close_braces=true
  18. editor.caret.blink=true
  19. editor.code_folding=true
  20. editor.divider.size=2
  21. editor.external=false
  22. editor.font=Monospaced,plain,12
  23. editor.indent=true
  24. editor.invalid=false
  25. editor.keys.alternative_cut_copy_paste=true
  26. editor.keys.home_and_end_beginning_end_of_doc=false
  27. editor.keys.shift_backspace_is_delete=true
  28. editor.languages.current=
  29. editor.linenumbers=true
  30. editor.save_on_verify=true
  31. editor.tabs.expand=true
  32. editor.tabs.size=2
  33. editor.update_extension=true
  34. editor.window.height.default=600
  35. editor.window.height.min=290
  36. editor.window.width.default=500
  37. editor.window.width.min=400
  38. export.applet.separate_jar_files=false
  39. export.application.fullscreen=false
  40. export.application.platform=true
  41. export.application.stop=true
  42. export.delete_target_folder=true
  43. gui.scale=auto
  44. ide.accessible=true
  45. last.folder=C:\Users\Eric.Li\Desktop\Temp\stm32test\stm32test.ino
  46. last.ide.1.8.19.daterun=1649298830
  47. last.ide.1.8.19.hardwarepath=C:\Program Files (x86)\Arduino\hardware
  48. last.screen.height=1080
  49. last.screen.width=1920
  50. last.sketch.count=2
  51. last.sketch.default.location=760,290,500,600,414,0
  52. last.sketch.default.path=C:\Users\Eric.Li\Desktop\Temp\stm32test\stm32test.ino
  53. last.sketch0.location=650,240,500,600,-1,0
  54. last.sketch0.path=C:\Program Files (x86)\Arduino\examples\01.Basics\Blink\Blink.ino
  55. last.sketch1.location=-8,-8,1936,1056,870,6
  56. last.sketch1.path=C:\Users\Eric.Li\Desktop\Temp\stm32test\stm32test.ino
  57. platform.auto_file_type_associations=true
  58. preferences.readonly=false
  59. preproc.color_datatype=true
  60. preproc.enhanced_casting=true
  61. preproc.imports.list=java.applet.*,java.awt.Dimension,java.awt.Frame,java.awt.event.MouseEvent,java.awt.event.KeyEvent,java.awt.event.FocusEvent,java.awt.Image,java.io.*,java.net.*,java.text.*,java.util.*,java.util.zip.*,java.util.regex.*
  62. preproc.output_parse_tree=false
  63. preproc.save_build_files=false
  64. preproc.substitute_floats=true
  65. preproc.substitute_unicode=true
  66. preproc.web_colors=true
  67. programmer=arduino:avrispmkii
  68. proxy.manual.hostname=
  69. proxy.manual.password=
  70. proxy.manual.port=
  71. proxy.manual.type=HTTP
  72. proxy.manual.username=
  73. proxy.pac.url=
  74. proxy.type=auto
  75. recent.sketches=C:\Program Files (x86)\Arduino\examples\01.Basics\Blink\Blink.ino,C:\Users\Eric.Li\Desktop\Temp\stm32test\stm32test.ino
  76. run.display=1
  77. run.options=
  78. run.options.memory=false
  79. run.options.memory.initial=64
  80. run.options.memory.maximum=256
  81. run.present.bgcolor=#666666
  82. run.present.exclusive=false
  83. run.present.stop.color=#cccccc
  84. serial.databits=8
  85. serial.debug_rate=9600
  86. serial.line_ending=1
  87. serial.parity=N
  88. serial.stopbits=1
  89. sketchbook.path=C:\Users\Eric.Li\Documents\Arduino
  90. software=ARDUINO
  91. target_package=arduino
  92. target_platform=avr
  93. theme.file=
  94. update.check=true
  95. update.id=2142332045165484339
  96. update.last=1649297850467
  97. upload.using=bootloader
  98. upload.verbose=false
  99. upload.verify=true
复制代码


————————————————
版权声明:本文为CSDN博主「长风Eric(fengcan)」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fengcan/article/details/124009060

收藏 评论0 发布时间:2023-2-5 16:02

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版