点击上方“大鱼机器人”,选择“置顶/星标公众号”
福利干货,第一时间送达!
之前有写过一篇比赛经验帖:从0开始,三个月,获全国一等奖
这次应龙哥要求,给大家写一份STM32入门的文章。因为我是搞软件的,这里就只给大家介绍STM32的编程学习的一些思路,帮助大家尽快入门。
我打算是分两篇写,一个基础篇,一个提升篇。
这一篇为大家讲一下STM32入门学习的一些基础。
在之前的文章也跟大家提到过,基础真的非常非常重要。
如果基础打牢了,电赛拿个省奖应该是没有大问题的,不过拿国奖的话还需要一定量的强化练习,关于强化的部分后面再写一篇给大家介绍。
在内容讲解之前,先讲一下学习方法。其实不只是学习单片机,不管是学什么自学能力都非常重要。
当初我刚开始学的时候,去找龙哥,原本我是希望龙哥能教会我,然而龙哥就是给我丢了一套原子的视频,只给我讲了一下基本要学的东西和学习思路,很多东西我都是自己学,看不懂的地方先去百度搜,如果还是不懂才去问龙哥。
因为一般我去问龙哥,龙哥每次都会给我几句话:自己百度去,这个都不懂,给你两巴掌。下次我问你还不会,我打死你。
我们平时去问老师也是一样,老师只给你提供思路,实际的操作还是要靠自己。但是我真的很感谢老师和龙哥,因为只有自己搞懂才是真懂,自己自学学到的知识记忆会特别深刻。
这里就以STM32f103为例,网上有很多相关的学习的视频,正点原子的和野火的讲的都不错。
我是看正点原子的视频入门的,所以我的思路跟正点原子的很类似,我这里的介绍不会太详细,只是给大家提供一些学习的思路。
各位小伙伴如果有问题可以去群里讨论或者去看一下正点原子学习视频,希望下面的内容对大家能有帮助。
我把单片机的基础内容为以下四个部分,下面我单个讲解。
1
点灯和按键一般来说,学单片机都是从点灯开始的。我当时学点灯和按键学了一个星期,纯小白入门的话,学起来肯定会有一些困难。
我当时是从51转32的,跟着视频边看边写,当时我就很喜欢钻牛角尖,51点灯定义一个引脚就一行,但是32比51麻烦太多,从新建工程添加文件,定义引脚,当时就觉得各种乱七八糟的东西,很懵逼。
这里给大家提几个小建议,刚开始学的时候,不要说要把每一行每一句搞清楚,把关键的语句搞清楚就可以了,等你学到了后面再往前看的时候,会有一种突然间恍然大悟的感觉,因为每用到引脚就要进行引脚配置,配置多了,学的东西多了自然而然就懂了。
然后刚开始新建工程尽量不要使用模板,每一次新建工程都自己添加文件,搞懂整个工程的框架,学到后面可以自己总结一套适合自己的模板。
点灯其实就是配置引脚输出高电平和低电平来控制外部LED灯的亮灭,配置语句非常简单,首先使能引脚时钟,然后配置引脚输出模式即可。按键的话也类似,只不过按键是配置输入模式。按键的硬件图如下所示:
以KEY_UP为例,左端是VCC,右边接的是单片机的引脚,不按时中间断开,当按键按下,中间连通,此时单片机会检测到有高电平输入。按键还有一个消抖程序,是为了保证稳定,避免二次检测,除此之外,按键有支持连按和禁止连按两种模式,这里请读者自行去了解。
点灯和按键在平时做项目的时候用处也是很大的,每次我新建工程第一个程序永远都是点灯,因为复杂一点的程序一般都会涉及中断,每次我都是把点灯放在中断里面,根据灯的亮灭变化来判断你的中断配置是否成功或者判断中断实现的功能是否正常运行,除此之外也可以用灯来检查工程里其他的逻辑语句,因为开发平台只能检查程序的语法错误,逻辑错误只能自己去检查。
2
串口与外部中断串口的功能基本上就是实现数据的传输,通过杜邦线连接两块单片机,数据可以从一块单片机发送到另一块单片机。像现在网上的一些模块比如温湿度检测模块,就是通过串口把检测到的温湿度的值发送到单片机。
也可利用串口实现单片机与电脑的数据交互,此时需用到串口调试工具。串口功能的配置也比较简单,配置好时钟后,设置好输入或输出模式,然后设置波特率,数据位长度,奇偶校检位等即可使用,这些在原子的视频中都有详细的讲解。
原子给的例程是在主函数的死循环里面不停接收或发送。我并不支持这种操作,我在做毕业设计的时候,因为程序比较多,刚开始我也是在死循环里面接收数据,随着程序越来越大,更新数据的时间变得越来越慢。
串口通信还涉及到一个串口中断,用串口中断来接收数据的话,可以大大优化程序的运行速度。
外部中断原理跟按键很类似,也是通过检测外部信号来实现相应的功能。外部中断是单片机实时地处理外部事件的一种内部机制。
当某种外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理;中断处理完毕后.又返回被中断的程序处,继续执行下去。
这里要提醒一下,中断执行的语句也需要尽量简化,因为一般的单片机都是单线程的,无法同时运行中断里面的功能和系统功能,进入中断后其他的功能都会短暂停止工作,只运行中断里面的功能。如果中断里面功能语句过多可能会影响整个系统的运行。
3
定时器我个人觉得定时器是单片机的核心,用途非常广。
定时器有最主要的三个功能:定时器中断,输出PWM,输入捕获。
详细配置这里不讲了,下面分别讲解三大功能。
定时器中断是根据自己配置定时器的时间来进入中断,就拿两轮平衡小车为例,配置定时器每50ms进入一次中断,接收陀螺仪检测的小车倾角信息,平衡小车是通过不停的检测小车的平衡状态以此来控制电机向前或向后运动保证小车平衡。
输出PWM功能主要是输出一段可以控制占空比的方波信号。比如点灯,可以改变输出PWM占空比的大小来控制灯的亮度。
我电赛搞的是控制,用的最多的是用来控制电机或者舵机。
以电机为例,一般单片机会连接一个电机驱动,电机驱动会根据单片机发送PWM的占空比来控制电机的转速和方向。
比如5V8000转速的电机连接最大输出5V的驱动,单片机如果发送给驱动的PWM占空比为100%,驱动满伏输出,电机也会满转速运转,一分钟转8000转;
如果给的PWM占空比为50%,驱动输出的实际电压变为2.5V,电机速度会变为4000转每分钟。
输入捕获功能可用于测量一段未知信号的频率,周期和占空比等等。比如输入一段方波,检测到上升沿的时候定时器开始计数,检测到下降沿后把计数时间设为t1,检测到第二个上升沿后总计数时间设为t2,占空比则为t1/t2,频率为1/t2,周期为t2。
4
ADC全称为Analog-to-Digital Converter,将连续变量的模拟信号转换为离散数字信号。ADC功能主要用于检测电压值,
拿平衡小车来说,需要用ADC检测平衡小车的电量来提醒用户是否需要充电。
又比如光敏模块,其实就是利用ADC测量光敏模块内部光敏电阻的电压值,温度模块则是用ADC测量内部热敏电阻的电压值。
但是要注意,单片机上的ADC引脚检测的最高电压不得大于3.3V,太大了会烧坏单片机,一般的电压都需用先通过一个确定倍数的放小电路后再进行测量。
下图就是我在16年省赛准备期间做的一个微型的示波器:
16年省赛是我第一次接触STM32,当时因为水平不够校内筛选的时候就被刷了。上图有测出来的电压值,电流值,功率,周期,峰峰值,也有当时还没测出来的占空比等等一些数据,还有一些是调试过程中用来检验的一些数据。
5
结束语除了上面讲到的东西,还要跟大家提一下现在两种主流的配置引脚的方式,库函数和操作寄存器。
我自己先学的是库函数,后面自己也学了寄存器操作的方法。其实两种方法的原理是一样的,库函数其实就是把寄存器给包装起来了,实际上都是对寄存器的操作。
这里给大家一个建议,如果是想在单片机这条路上走远一些的,寄存器一定要搞懂。
像我有的同学在公司实习的时候,公司就只给了他一个寄存器操作手册,因为很多产品内部的部件都是定制的,网上没有程序参考,只能自己配置,如果看不懂寄存器根本无法下手。
这篇文章有很多东西都没有写,像重映射等等一些功能其实也很重要,单片机的原理图大家也一定要看懂,我这里只是给大家一个思路,详细的学习资料还是要参照正点原子的,原子开发板的资料中有一些文档像STM32开发指南和STM32中文参考手册需要多看看,请大家多多注意。
最后再提醒一下大家,写程序是很看动手能力的,一定一定要多动手,不要只复制粘贴。自己平时也可以去网上找找题目做,就比如学会点灯后,自己用杜邦线多接几个LED灯,写程序实现各种花式点灯;
学会按键后,可以自己改程序实现连按功能;学会后面的定时器,ADC和LCD后,可以自己做一个小型示波器。大家入门后也可以多去看看算法相关的一些书籍,程序语法花写时间总能搞懂,但是算法才是核心。
因为我是一个典型的工科男,文笔很差,里面废话很多,讲的一些东西也不知道大家能不能看懂。
希望文章对初学者能有所帮助,中间有遗漏或者讲错的地方欢迎指正。
●博士论文抄袭,看头发辨真假
●三十岁一事无成,一个失败工程师的自白
还没有进群的小伙伴可以添加小编微信~
备注:进群,拉你进微信交流群~