转载请注明:http://www.javashuo.com/article/p-ccrgjusf-dc.htmlhtml
没有时间只是本身找的借口罢了!
开篇必定要精彩,否则路人不理睬!下述是笔者做为arm小白的填坑之旅python
没错,这个以前一直从事软件开发的笔者,开始搞硬件了,固然仅仅是数电!模电须要有很扎实的电路基础,而笔者有的只有“扎实”的逻辑基础。
那为何笔者要开始搞硬件呢?
其实早在大学期间,笔者所在专业(计算机科学与技术)中就有一门课就专门讲了硬件-软件的链接以及实现,只怪当初没有好好学,只是心中有那么个印象,就是时钟驱动逻辑电路去处理每个指令而后完成整个逻辑(固然,这个印象很重要,在arm中,时钟就是它的心脏!)。
毕业后若干年,物联网行业开始兴起,因而手痒痒了,仅凭这一印象,开始入手了人生中的第一块板子——树莓派3B,用来作了一些小玩意儿,但那都是在linux的基础上作的,和软件开发没什么区别,因而乎,这块树莓派至今都在吃灰。
第二块板子即是arduino,比树莓派稍微有点难度了,没有OS,且ram也只有几百KB,作了几个demo后,发现太依赖arduino的环境了,也不是C开发,并无真正接触底层,因而这块arduino跟树莓派正在一块儿吃灰中。
笔者的主开发语言是js,出于对脚本语言的熟练,我偶然间发现了NodeMCU这个东西,发现是块能够用lua脚本写逻辑的板子,甚是欢喜,后来还烧录了espruino固件和micropython固件,把玩了许久后终于仍是去吃灰了!
看来IoT行业并无那么简单,因而收收心搞主业了!直到上个月手头没啥业务了,又开始手痒痒,查阅了avr和arm的利弊后,最终选择了arm,毕竟大佬的意见是想挑战就选arm(其实arduino板就是使用了avr架构的atmega芯片)!因而开始某宝之路。linux
笔者做为arm初学者,不能上来就搞大货(好比xx开发套件,xx集成开发板),一是贵,二是不必。再三某宝后,最终选定了stm32最便宜的板子STM32f103c8t6,是国产的板子,应该是st受权过的板子,而后各类仿制。
笔者入的是块黑色板子,以下图:
这块板子对于初学者来讲太实惠了,RMB11,65536b(64kb)的flash和20480b(20kb)的sram,彻底够用了,还有一个microUSB口,舒服!
固然,某宝上还有其余各类颜色的板子,电路排布略有不一样,但功能都不尽相同。架构
兴致勃勃地拿了快递,兴致勃勃地拆了快递,兴致勃勃地拿USB线链接到了电脑,尴尬的是毫无反应,USB信息里也没有任何st字样的项,因而开始查阅各类资料才发现,stm32f103x的microUSB口是用做电源和DFU烧录用的,因而又查了DFU的资料,发现stm32f103x并无烧录dfu的支持固件,因此不能用DFU烧录,因此仍是要其余烧录方式!编辑器
在采坑#1后,我查到了stm32的另外两种烧录方式:JTag和st-link,JTag在某宝上的价格要几十块,而st-link则是10块上下,可是JTag比st-link要好用,因而果断选了st-link,便宜和爱折腾才是王道(一位图拉丁人说)。
因而在某宝上又入了一个st-link v2,RMB10.5。工具
拿到st-link后,才意识到stm板子上的引脚没有焊接,因而就把swd引脚和跳线引脚给焊接上了。
而后照着板子上的swd的引脚说明,链接到st-link对应的引脚!
完美,一插上,板子上的贴片蓝色LED就开始闪烁起来了(听说蓝灯闪烁是出场时候烧录的测试程序,说明板子是正常工做的)。测试
在查阅资料的时候,发现大大多数开发者用的操做系统要么是Windows要么就是Linux的,而笔者用的macOS,又一个大坑渐渐浮现,我直接填一下吧。
须要材料:ui
而后就能够愉快地玩耍了!
打开clion,新建一个项目,选嵌入式stm32的那个
建立项目后,会自动打开STM32CubeMX,或者手动打开项目中的ioc文件,在编辑区会有一个连接能打开STM32CubeMX。
它默认建立的是STM32f030f4px的芯片,在下面的操做中修改芯片
而后在project manager中修改
路径修改了一次就不能修改了哦!最后点击右上角的generate code。
返回clion后,就会同步文件,发现代码都生成了,点击编译,竟然绝不费力地成功了,甚是欢喜!
而后烧录,点击运行,clion竟然报错了
原来是编辑器板子的配置文件没有选定,须要再run/debug configuration中配置
这时,笔者找遍了整个列表都没找到stm32f103字样的项,因而去各类查阅,网上说并无stm32f1discovery的项,这个low-level的板子太杂了,须要用board/st_nucleo_f103rb.cfg才行。
而后再点击运行,嘿,竟然一堆红色的文子,看得头皮发麻
而后又是各类查阅,原来要修改board/st_nucleo_f103rb.cfg的配置google
再运行,嘿,蓝灯竟然不闪了,估计是烧录成功了,由于红色文子里没有什么错误信息了。
而后开始看项目结构,根据笔者的经验,用户逻辑的入口确定是相似src,main之类字样的文件中的,果真,在Src/main.c中找到了入口。
里面有不少注释,主要是用于STM32CubeMX生成代码所标记的,不要乱改这些注释,不然会对代码生成产生影响的,你须要修改的就USER CODE字样注释范围内。
果真找到了蓝灯不闪烁的缘由了,原来是main方法里的while里是空的,致使没有对蓝灯没有作任何处理,蓝灯默认是灭的。
因而开始查阅stm32有关GPIO的文档,可使用hal库来操做lua
while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12); HAL_Delay(100); }
HAL_GPIO_TogglePin方法是切换io口的状态,第一个参数是io口的集合,第二个参数是具体集合中那个口。那为何是GPIOB和GPIO_PIN_12呢?
STM32f103c8t6板载的蓝色LED确定是能修改的,或者是有其余用途的。经仔细查阅某宝的那个详情后,找到了它的电路图
在图中,找到了两个LED灯,一个是红色LED,是接地的,常亮状态,指示通电状态。蓝色LED则是接入到了PB12,意思就是能够经过PB12的口来控制这个蓝灯,因而,推断一下就是GPIOB和GPIO_PIN_12这两个参数了(实际上是经过屡次敲代码,在只能提示候选列表中找到的)。
HAL_Delay天然就是延时等待多少毫秒的做用了!
代码修改好了,再运行,吧唧,没反应,蓝灯没有闪也没有亮,咋回事?预期应该是狂闪的呀!
为何操做GPIO没有反应呢?依旧是查阅资料,网上说须要配置GPIO,否则用不了,而后给出了不少代码,粘贴进来后,都是语法错误,什么RCC没有找到之类的错误,应该是库没有引入进来致使的,想include rcc库,结果在项目中找不到rcc库,因而又是一番查阅。
笔者这个时候就在想,我用的hal库,会不会rcc也是相似hal的库呢,果真不是!hal中也有rcc的部分实现,因此只是用hal库应该没什么问题。
而后就搁置了一段时间!
我想一想看,能不能用调试功能,由于st-link仿真器是有调试功能,因而又开始捣腾!
奈何怎么调试没用,GDB调试器始终没法链接st-link:Error: init mode failed (unable to connect to the target)
。可是在HAL_Init()上的断点就能断到,每次都是HAL_Init()过不去,而后一步一步跟踪进去调试,发如今__HAL_AFIO_REMAP_SWJ_NOJTAG这个方法过不去了,再升入就不行了,因而按照__HAL_AFIO_REMAP_SWJ_NOJTAG关键词阅资料发现,stm的调试是须要在STM32CubeMX中配置的,配置点在:SYS>Debug中
默认是No Debug,选择Serial Wire后generate code一次再编译就能开启调试了!简直完美!
可是调试发现,代码很完美啊(其实内心也没有底,仍是查了其余文档,怀疑板载的蓝色LED并非PB12)。
偶然间想起来,在STM32CubeMX中配置调试的时候,好像在右侧的芯片引脚图看到了PB这个口子,果真,在芯片引脚图上找到了PB12,甚是欢喜啊!
而后把PB12的引脚设置成GPIO_OUTPUT,而后generate code,再运行,终于,蓝灯开始闪烁啦,舒服!
仔细查阅main.c,会发现,其实在配置引脚后,生成的代码的MX_GPIO_Init中多了一些代码,这些代码就是配置引脚用的!
至此,板载蓝色LED终于闪烁了,达成了目标!
其实,在整个填坑过程当中,不止上述的那些步骤,还有其余不少坑,好比:
写博怎么不写心得呢!
世上原本并无坑,只是完成教程太少,便有了坑!
其实在整个填坑过程当中,最多的是查阅资料和尝试,身边没有朋友学过或正在从事相关的工做。