“じゃ、始めましょう。”
--最近在学外语,对于IT从业者来说,会是一项优势
资料来源:杨桃电子(老师很细心)
目录
一 、相关基础知识
1.ARM是什么?
2.STM32?
是cortex系列(ARM11之后的芯片)芯片生产厂家中最有发展前景的 ,推出M系列的公司有ST、英飞凌、飞思卡尔、德州仪器、新唐科技等等。
对于不同的产品类型,可以根据需要选择对应的封装,下载对应的数据手册 。
3.STM32的命名规范
ps:STM32F103C8T6的名称由来
ST-M-32-F-1-03-C-8-T-6-xxx
4.关于STM32F103C8T6的功能了解
单片机最小系统电路:内核+存储器+时钟+复位+电源管理,找到产品数据手册,了解芯片的通用结构
4.1 内核:
4.2 存储器:FLASH和SRAM的互补,一个掉电不丢失但是速度慢,一个掉电丢失但是速度快。
插图
4.3 时钟+复位+电源管理
关于晶体振荡器与RC振荡器
插图
关于晶体振荡器、RC、RTC、PLL(锁相环)等等
-----后期单开个专题吧,感觉有点难懂,硬件我不行-----
//以上这些功能加在一起,就能够让单片机正常工作,只不过还没有加外设,相当于一个还没有下载任何APP的新手机,能开机关机,但你想实现满足自己需求的功能,就得下载app,即增加外设。
二 、基本功能
1.低功耗
一般采用电池供电的设备时,为了节约电量,开启低功耗模式 (省电模式)
工作模式 | 关掉的功能 | 唤醒方式 |
睡眠模式 | 内核 | 所有内外部中断(按按鼠标键盘啥的) |
停机模式 | 内核 内部所有的功能 PLL分频器、HSE | 给外接引脚电信号唤醒 电源电压监控中断PVD(电压低于一定值) RTC闹钟定时 USB唤醒信号 |
待机模式 | 内核 内部所有的功能 PLL分频器、HSE SRAM内容消失(唤醒之后程序从头开始,即复位) | NRST上的外部复位信号、 IWDG复位、 WKUP引脚上的一个上升边 |
2.ADC
3. DMA和IO端口
普通IO口与GPIO口的区别?什么是推挽开漏、上拉下拉?什么是复用,如何实现?
4. 调式模式
省去了CH340芯片,为单片机的调试烧录提高效率
5.七个定时器
− 3个16位定时器,每个定时器有多达4个用于输入捕获/输出比较/PWM或脉冲计数的通道和增量编码器输入
通用定时器(TIMx)
STM32F103xx增强型产品中,内置了多达3个可同步运行的标准定时器(TIM2、TIM3和TIM4)。每个定时器都有一个16位的自动加载递加/递减计数器、一个16位的预分频器和4个独立的通道,每个通道都可用于输入捕获、输出比较、PWM和单脉冲模式输出,在最大的封装配置中可提供最多12个输入捕获、输出比较或PWM通道。
它们还能通过定时器链接功能与高级控制定时器共同工作,提供同步或事件链接功能。在调试模式
下,计数器可以被冻结。任一标准定时器都能用于产生PWM输出。每个定时器都有独立的DMA请求
机制。
这些定时器还能够处理增量编码器的信号,也能处理1至3个霍尔传感器的数字输出。
− 1个16位带死区控制和紧急刹车,用于电机控制的PWM高级控制定时器
高级控制定时器(TIM1)
高级控制定时器(TIM1)可以被看成是分配到6个通道的三相PWM发生器,它具有带死区插入的互补
PWM输出,还可以被当成完整的通用定时器。四个独立的通道可以用于:
● 输入捕获
● 输出比较
● 产生PWM(边缘或中心对齐模式)
● 单脉冲输出
配置为16位标准定时器时,它与TIMx定时器具有相同的功能。配置为16位PWM发生器时,它具有全
调制能力(0~100%)。
在调试模式下,计数器可以被冻结,同时PWM输出被禁止,从而切断由这些输出所控制的开关。
很多功能都与标准的TIM定时器相同,内部结构也相同,因此高级控制定时器可以通过定时器链接功
能与TIM定时器协同操作,提供同步或事件链接功能。
− 2个看门狗定时器(独立的和窗口型的)
独立看门狗
独立的看门狗是基于一个12位的递减计数器和一个8位的预分频器,它由一个内部独立的40kHz的RC
振荡器提供时钟;因为这个RC振荡器独立于主时钟,所以它可运行于停机和待机模式。它可以被当成看门狗用于在发生问题时复位整个系统,或作为一个自由定时器为应用程序提供超时管理。通过选项字节可以配置成是软件或硬件启动看门狗。在调试模式下,计数器可以被冻结。
窗口看门狗
窗口看门狗内有一个7位的递减计数器,并可以设置成自由运行。它可以被当成看门狗用于在发生问题时复位整个系统。它由主时钟驱动,具有早期预警中断功能;在调试模式下,计数器可以被冻结。
− 系统时间定时器:24位自减型计数器
系统时基定时器(滴答计时器)
这个定时器是专用于实时操作系统,也可当成一个标准的递减计数器。它具有下述特性:
● 24位的递减计数器
● 自动重加载功能
STM32F103x8, STM32F103xB数据手册
参照2009年4月 STM32F103x8B数据手册 英文第10版 (本译文仅供参考,如有翻译错误,请以英文原稿为准) 10/62
● 当计数器为0时能产生一个可屏蔽系统中断
● 可编程时钟源
6.通信接口(//需要与外界达成标准协议)
在此我们讨论一下I/O接口与通讯接口的区别
I/O接口:通过电平信号能够进行普通的数据输入输出,但是用户需要自行定义。//需要用户根据不同电子设备的通讯要求去定义接口,十分繁琐。
通讯接口:国际通用的标准通讯方案,能够通过在电路板上集成相关的接口,进行高效的通讯。//只需要搞懂相关协议,只要符合这种协议的产品,都可以使用该接口进行数据传输。
■ 多达9个通信接口
− 多达2个I2C接口(支持SMBus/PMBus)
− 多达3个USART接口(支持ISO7816接口,
LIN,IrDA接口和调制解调控制)
− 多达2个SPI接口(18M位/秒)
− CAN接口(2.0B 主动)
− USB 2.0全速接口
I2C总线
多达2个I2C总线接口,能够工作于多主模式或从模式,支持标准和快速模式。
I2C接口支持7位或10位寻址,7位从模式时支持双从地址寻址。内置了硬件CRC发生器/校验器。
它们可以使用DMA操作并支持SMBus总线2.0版/PMBus总线。
I2C(芯片间)总线接口连接微控制器和串行I2C总线。它提供多主机功能,控制所有I2C总线特定的时序、协议、仲裁和定时。支持标准和快速两种模式,同时与SMBus 2.0兼容。
I2C模块有多种用途,包括CRC码的生成和校验、SMBus(系统管理总线—System Management Bus)和PMBus(电源管理总线—Power Management Bus)。
根据特定设备的需要,可以使用DMA以减轻CPU的负担。
USART接口
对应项目例程:Usart项目举例-优快云博客
通用同步/异步收发器(USART)
USART1接口通信速率可达4.5兆位/秒,其他接口的通信速率可达2.25兆位/秒。USART接口具有硬件的CTS和RTS信号管理、支持IrDA SIR ENDEC传输编解码、兼容ISO7816的智能卡并提供LIN主/从功能。
所有USART接口都可以使用DMA操作。
SPI接口
串行外设接口(SPI)
多达2个SPI接口,在从或主模式下,全双工和半双工的通信速率可达18兆位/秒。3位的预分频器可产生8种主模式频率,可配置成每帧8位或16位。硬件的CRC产生/校验支持基本的SD卡和MMC模式。
所有的SPI接口都可以使用DMA操作。
在大容量产品和互联型产品上,SPI接口可以配置为支持SPI协议或者支持I2S音频协议。SPI接口默认工作在SPI方式,可以通过软件把功能从SPI模式切换到I2S模式。
在小容量和中容量产品上,不支持I2S音频协议。
串行外设接口(SPI)允许芯片与外部设备以半/全双工、同步、串行方式通信。此接口可以被配置成主模式,并为外部从设备提供通信时钟(SCK)。接口还能以多主配置方式工作。
它可用于多种用途,包括使用一条双向数据线的双线单工同步传输,还可使用CRC校验的可靠通信。
I2S也是一种3引脚的同步串行接口通讯协议。它支持四种音频标准,包括飞利浦I2S标准,MSB和LSB对齐标准,以及PCM标准。它在半双工通讯中,可以工作在主和从2种模式下。当它作为主设备时,通过接口向外部的从设备提供时钟信号。
警告: 由于SPI3/I2S3的部分引脚与JTAG引脚共享(SPI3_NSS/I2S3_WS与JTDI,SPI3_SCK/I2S3_CK与JTDO),因此这些引脚不受IO控制器控制,他们(在每次复位后)被默认保留为JTAG用途。如果用户想把引脚配置给SPI3/I2S3,必须(在调试时)关闭JTAG并切换至SWD接口,或者(在标准应用时)同时关闭JTAG和SWD接口。详见第8.3.5 457/754节:JTAG/SWD复用功能重映射。
CAN接口
控制器区域网络(CAN)
CAN接口兼容规范2.0A和2.0B(主动),位速率高达1兆位/秒。它可以接收和发送11位标识符的标准帧,也可以接收和发送29位标识符的扩展帧。具有3个发送邮箱和2个接收FIFO,3级14个可调的滤波器。
bxCAN是基本扩展CAN(Basic Extended CAN)的缩写,它支持CAN协议2.0A和2.0B。它的设计目标是,以最小的CPU负荷来高效处理大量收到的报文。它也支持报文发送的优先级要求(优先级特性可软件配置)。
对于安全紧要的应用,bxCAN提供所有支持时间触发通信模式所需的硬件功能。
USB接口
USB外设实现了USB2.0全速总线和APB1总线间的接口。
USB外设支持USB挂起/恢复操作,可以停止设备时钟实现低功耗。
STM32F103xx增强型系列产品,内嵌一个兼容全速USB的设备控制器,遵循全速USB设备(12兆位/
秒)标准,端点可由软件配置,具有待机/唤醒功能。USB专用的48MHz时钟由内部主PLL直接产生(时
钟源必须是一个HSE晶体振荡器)。
7.附加功能 : CRC校验和芯片ID
CRC(循环冗余校验)计算单元
CRC(循环冗余校验)计算单元使用一个固定的多项式发生器,从一个32位的数据字产生一个CRC码。
在众多的应用中,基于CRC的技术被用于验证数据传输或存储的一致性。在EN/IEC 60335-1标准的范围内,它提供了一种检测闪存存储器错误的手段,CRC计算单元可以用于实时地计算软件的签名,并与在链接和生成该软件时产生的签名对比。
8.还有NVIC、EXTI等等(在内核篇讲吧)
记得把以下框图看懂哦,要知道每一个部分的基本功能
----
以上每个小结单独开一篇
开发板
这里插一句,讲一讲单片机的基本结构
上图!!!
MCU通过引脚接口与核心板连接 ,MCU根据封装不同对应的引脚数量也不同,而核心板则对应引脚来引出其基本功能并通过排针来接上开发板,以方便其扩展外设。有的开发板是做成一体的,就是核心板和开发底板是焊死在一起的。
三、时钟、复位和电源管理
RTC
作用:内部的RC震荡器随着温度的升高飘逸 ,计时精度不够高。所以外置石英晶体晶振,核心板还继承了一个RTC备用电池,为了在是主电源断开时给RTC时钟供电,和备用寄存器共同作用保存备用存储器(SRAM)数据,和定时时间,不会被复位。故而外部晶振和备用电池主要用于实时时间精准走时。
如果RTC作为唤醒计时器,则不需要外部晶振和电池,内部的40kRC振荡器就可以了。
作为日历:从1970-1-1 00:00:00
原理:
驱动程序:
继电器
小功率带动大功率。一些大电压的开关在开合时释放的电压巨大,我们通过一个小功率的触点去带动它闭合。
ULN2003 芯片
三 、软件安装与相关库
我们是如何对单片机进行编程的呢?首先就要谈到市面上最流行的软件KEIL了
KEIL 4
KEIL是一款能把用户的C语言、汇编语言等等转换为HEX、BIN文件的软件开发平台,它集合了程序编辑、编译、调试仿真等等功能,构成集成开发环境(IDE),其中针对于STM32的arm内核的编译器为Keil MDK。
如何在Keil上写程序并生成可以在单片机上面跑起来的程序?
通过哪些接口?要使用哪些引脚和硬件支持呢?
ISP程序下载器(FlyMCU)
将keil生成的.hex文件加载入FLYMCU,USB对应的PC上面的串口会将数据传输至单片机。
如果使用RamISP的话,烧录程序的速度更快哦!
那么问题来了——单片机是怎么知道什么时候下载程序,什么时候运行程序?
这就要说到启动程序了,单片机有两个引脚,BOOT0和BOOT1,通过对这两个引脚置位可以切换不同的启动模式
单片机上电后,先检测BOOT0和BOOT1的值:
当BOOT1=0/1,BOOT0=0时 ,单片机直接运行存储在flash中的程序。
当BOOT1=0,BOOT0=1时 ,进入BootLoader程序中进行ISP下载,将.hex文件通过ISP的软件写入单片机。在程序下载完后,切入正常的单片机运行模式,即Flash ISP模式。
当BOOT1=1,BOOT0=1时 ,该模式主要用于调试阶段,将程序下载进入SRAM中,此时下载速度很快,但是如果单片机突然断电,程序会丢失。 通常应用于已经烧录过的程序进行修改和调试时。
ASP功能则是可以进行自行设置BOOT0和BOOT1的状态并自动下载,以及个各模式的切换。
以上是指用户程序已经上传至单片机之后的工作原理,那么用户程序是怎么跑到单片机上面的呢?
说到这里,就不得不提驱动芯片了
CH340驱动芯片
作用:高性能低成本的USB转串口芯片,也就是说,你用一根USB线连接电脑与单片机(传感器),来把你写的程序下载进去,但是单片机怎么接收你用keil写的C语言程序呢?
答案就是使用一个驱动芯片,它可以将数据转换为TTL、RS232、RS485等等格式。即将数据转换成单片机接口能接受到的数据格式,比如单片机上的SPI、USB、串口、I2C等等接口。
库
啥是库?库从哪里找?库是怎么产生的?
标准固函数库
寄存器
HAL
硬件->功能配置寄存器->底层驱动程序->用户程序
用户程序与寄存器的交流就是凭借的底层驱动程序,即固件库。究竟啥是固件库?
固件库是由st公司制作的标准函数库,为了省去开发者还要自行书写驱动程序来控制寄存器,干脆由芯片公司自己出一套可以驱动芯片的模板化程序,为开发者提高效率。(有了函数库咱们只需要改改参数,写写main函数就行了。)
固件库的文件
一般可以划分为几种,自己新建工程时,应该在对应的文件夹里面建立以下文件,并给每个文件添加对应的内容,这些内容有的是已经搭建好的库,有的则需要你自己写。
1.CMSIS
核心驱动文件,用于驱动开发板基本功能。不用管
2.LIB
内部功能相关的驱动文件,根据开发所需要用到的功能进行选择,用不到的可以不用载入。不用管
3.Startup
启动文件,用于单片机的启动。不用管
4.user
用户编写的main函数,以及程序发生错误时的文件(后面这个不用管)
5.basic
一些单片机底层最基础的、最小系统相关的程序。如delay.c,sys.c。
6.hardware
用户在外围电路添加的外设硬件的驱动程序。
以上各个工程文件加在一起构成一个project。
而以上的文件夹中的工程文件,都源自于stm32的官网获得
工程文件的添加
1.新建文件夹
2.选择开发板类型
这个时候会出现一个问题,如果我们没有在这里找到对应的库,那么咋办?
当然就是去stm官网或者正点原子之类的地方下载。
双击打开
重启软件并重复以上操作,你就会得到
选好之后点击OK会弹出一个PACK的弹框,直接关闭就好了。然后变成
接下来就是把我们的工程文件导入进当前工程了,在新建工程的文件下,以标准库为例,新建以下文件夹。
1.CORE
Libraries->CMSIS
2.LIB
3.OBJ
4.SYSTEM
5.USER
以上各个工程文件加在一起构成一个project。
那么,这些文件里面应该放些啥呢?
四、工程源代码
开始点灯仪式啦!!!
通常来说,当我们能够在网上找到相关例程时,是没有必要非要自己去手搓一个程序出来的,但是作为初学阶段,由下而上的学习才能加深对单片机的了解,毕竟要是自己写的不对,再去复制粘贴也不打紧。
作为一个项目,拿到手我们应该想想,要实现他,需要哪些开启单片机的哪些功能?需要什么硬件参与?
点亮一个灯需要:
1.一个灯。
一个什么类型的灯,需要多大的电流?常用的LED发光原理是什么?
2.电
电肯定是从我们的单片机引脚引出来的,那么电是么时候给?谁控制给?给多大?
STM32外设资源使用步骤
1.添加外设对应时钟源。
2.配置硬件模式。
3.使能硬件工作。