文件目录:
一:基础知识和理论
1.ARM简介
2.STM32简介
3.STM32命名规范
4.STM32内部功能*
5.STM32接口定义
二:开发环境建立
1.开发板简介
2.ISP程序下载
3.最小系统电路
4.KEIL的安装
5.工程简介与调试流程
6.固件库的安装
7.编程语言介绍
8.固件库的使用
9.添加工程文件
三:其他
1.变量定义
2.ASCLL码与进制对应表
3.printf中符号的作用
4.常用的转义字符
5.如何输出彩色字符
1.什么是ARM ARM是英国Acorn有限公司设计的低功耗成本的第一款“RISC微处理器” ARM处理器本身是32位设计,但也配备16位指令集,一般来讲比等价32位代码节省达35%,却能保留32位系统的所有优势 2.ARM公司介绍 ARM公司是一家英国半导体设计公司,成立于1990年,总部位于剑桥 ARM公司的全称是Advanced RISC Machines Ltd,中文翻译为安谋公司 ARM公司的主要业务是设计和授权处理器核心IP(Intellectual Property,知识产权) 3.ARM内核发展历史如下: ARMv0:基本版本,包含ARM程序和Thumb程序 ARMv1:支持16位指令和32位指令 ARMv2:支持Thumb指令。 ARMv3:包含ARMv3-T和ARMv3-R,是最早的32位处理器 ARMv4:包含ARMv4T和ARMv4,增加了Java指令 ARMv5:包含ARMv5T和ARMv5,增加了媒体指令 ARMv6:增加了安全指令和本地中断向量 ARMv7:分为ARMv7-A、ARMv7-R和ARMv7-M,增加了向量化指令 ARMv8:引入64位指令集 ARMv9:预计将引入矢量扩展指令 Cortex:是ARM公司开发的最新一代处理器 包括Cortex-A、Cortex-R和Cortex-M等系列,具有更高的性能、更低的功耗和更多的功能
1.什么是STM32 STM32是意法半导体(ST)公司基于ARM公司的Cortex-M3内核生产的32位单片机。市场上常见的ARM芯片有: STM32系列 M系列:如M0、M3、M4等 A系列:如A5、A7等 R系列:如R5、R7等 ARM Cortex-A:如Cortex-A53、Cortex-A72等 2.Cortex内核系列说明 Cortex内核系列是ARM公司开发的最新一代处理器 包括Cortex-A、Cortex-R和Cortex-M等系列,具有更高的性能、更低的功耗和更多的功能 Cortex-A系列:是针对高级应用领域的处理器,具有更高的性能和功能 Cortex-R系列:是针对实时应用领域的处理器,具有快速响应和实时性 Cortex-M系列:是针对微控制器和低成本应用领域的处理器,具有低功耗、小尺寸和简单编程等特点 在Cortex内核系列中,不同的处理器系列所采用的技术和功能也不相同,可以根据不同的应用领域和需求选择合适的处理器系列 3.市场上常见的ARM芯片 M系列:M0、M3、M4等 此外,还有ARM7TDMI、StrongARM ARM720T、ARM9TDMI、ARM922T、ARM940T、RM946T、ARM966T、ARM10TDM1等 4.了解ST公司 ST公司全称意法半导体集团,是全球最大的半导体公司之一, 于1987年由意大利的SGS微电子公司和法国Thomson半导体公司合并而成,1998年5月公司名称改为意法半导体有限公司 意法半导体是世界第一大专用模拟芯片和电源转换芯片制造商,世界第一大工业半导体和机顶盒芯片供应商, 在分立器件、手机相机模块和车用集成电路领域居世界前列 5.STM32系列之间的关系 STM32系列是基于ARM Cortex-M内核的32位微控制器 系列:STM32F1、STM32F4、STM32L1等 内核:M0、M3、M4等 每个内核又分为主流、高性能和低功耗等不同类型 STM32F1系列属于Cortex-M3内核,采用ARMv7-M架构 STM32F4系列属于Cortex-M4内核,采用ARMv7-ME架构 STM32L系列属于Cortex-M0+内核
以STM32F103C8T6芯片为例,分析名称各字段的含义STM32F103C8T6芯片的名称各字段含义如下: ST:芯片制造商名称,表示该芯片由意法半导体公司生产 STM32:芯片系列名称,表示该芯片属于STM32系列 F:芯片子系列名称,表示该芯片属于STM32F系列 103:芯片型号,表示该芯片是STM32F103系列的一种具体型号 C:芯片封装类型,表示该芯片采用COB-44封装 8:芯片引脚数量,表示该芯片有8个引脚 T:芯片温度范围,表示该芯片的工作温度范围为-40℃到85℃ 6:芯片的批次号,表示该芯片是第六批生产的产品 通过分析芯片的名称字段了解芯片:制造商、系列、子系列、型号、封装类型、引脚数量、工作温度范围、批次号等信息
以下是STM32内部功能的基础知识介绍:
1.ARM核心:STM32采用Cortex-M内核,属于32位处理器,具有高性能和低功耗的特点 2.内存:STM32内部包含FLASH和SRAM FLASH:用于存储程序和数据(保存下载的用户程序、保存运行当中的临时数据) SRAM :用于临时存储数据 3.存储器:存储程序和数据、存储芯片参数 RAM:Random Access Memory,随机存储器,分为静态RAM(SRAM)和动态RAM(DRAM)两种 SRAM常被用作CPU的一级缓存和二级缓存,价格昂贵 DRAM保留数据时间很短,速度比SRAM慢,但是要比ROM快 ROM:Read Only Memory,只读存储器,掉电不丢失数据。STM32的ROM大小根据型号不同而有所差异 FLASH ROM:Flash Read Only Memory,闪存只读存储器,有主存储块和信息块组成 FLASH主存储区从0x0800 0000地址开始,不同系列器件有不同大小,这里存放为用户烧入的代码、常量和已经初始化的全局变量的值 EEPROM:Electrically Erasable Programmable Read Only Memory,带电可擦可编程只读存储器,可以通过电子擦除,但是写入时间很慢 4.时钟:STM32内部包含时钟源,可以为系统提供准确的计时基准时钟信号 实时时钟(RTC):是STM32内部的一个功能,用于提供实时时间信息 通常使用精度较高的晶体振荡器作为时钟源,为系统提供精确的时间基准 高速外部时钟(HSE):由外接高频晶振产生,一般采用8MHz的晶振;为STM32的CPU和其他内部外设提供时钟信号,是系统时钟的基础 HSE的精度较高,可以保证系统的实时性和稳定性 低速内部时钟(LSE):由内部低频RC电路产生的,通常使用32.768KHz的频率;用于驱动实时时钟提供时钟信号 精度更高,因为它使用内部RC电路产生时钟信号,而HSE的精度可能会受到外部环境的影响 5.复位和电源:STM32具有上电复位和掉电复位功能,是由芯片内部的VDD和VSS引脚完成的 同时内部集成电源管理单元,可对电源进行控制和管理 上电复位:当VDD引脚检测到电压上升到1.8V时,芯片会从待机状态恢复到正常工作状态的过程 掉电复位:当VDD引脚检测到电压下降到1.8V时,芯片会从正常工作状态进入待机状态的过程 掉电复位后,需要重新对芯片进行初始化才能重新开始工作 6.电压监控:STM32具有电压监控功能,可对系统电压进行监测和保护,确保系统稳定运行 7.低功耗:STM32具有多种低功耗模式,如睡眠、停止和待机模式,可大大降低系统功耗 睡眠模式:Cortex-M3内核停止工作,但是CPU供电1.8V不持续,而是进入低功耗模式,此时只有RTC和其他低功耗外设保持供电 停止模式:全部时钟都停止,CPU电源1.8V没断。唤醒后从原来位置运行 待机模式:时钟全断,CPU电源1.8V也断,唤醒后程序又一次运行 8.ADC:STM32内部集成多达16个通道的12位ADC,可用于模拟信号的采集和转换 9.DMA:一种高效的数据传输方式,通过DMA控制器将需要传输的数据从内存直接传输到设备或从设备传输到内存,而不需要经过中央处理单元(CPU)的干预 可以大大提高数据传输的效率,特别适用于需要大量数据传输的场景,如磁盘驱动器、网络接口卡等 单通道DMA:只有一个DMA控制器,只能进行单方向的数据传输 多通道DMA:则有多个DMA控制器,可以同时进行多个方向的数据传输 10.IO端口:是计算机系统中的一种硬件资源,用于连接外部设备和主机之间的数据传输 IO端口通常是一组特定的地址的寄存器,可以被CPU直接访问和操作 每个IO端口都有唯一的地址,通过地址可以访问对应的寄存器进行数据读写操作 统一编址:是将IO端口当做存储器的单元进行地址分配,用统一的访存指令就可以访问IO端口,又称存储器映射方式 独立编址:是IO端口有自己独立的地址空间,需要使用专门的IO指令进行访问 11.IO接口:STM32具有多种IO接口,如GPIO、SPI、USART等,可连接各种外设进行数据通信 GPIO接口(General Purpose Input/Output)是一种通用输入/输出接口 可以用于连接外部设备和芯片之间的数据传输 GPIO接口通常由一组引脚组成,每个引脚都可以被配置为输入或输出模式,用于传输数字信号 SPI接口(Serial PeripheralInterface)是一种同步串行通信接口 常用于连接微控制器和外部设备之间的通信 SPI接口有主从模式,主模式和从模式设备分别负责数据传输的起始和结束 USART接口(UniversalAsynchronousReceiverTransmitter)是一种串行通信接口,常用于微控制器和其他设备之间的通信 USART:通用同步/异步收发器(带同步时钟线) UART : 通用异步收发器(没有同步时钟线) IO口选择工作方式种类: GPIO_Mode_AIN 模拟输入:该模式就是可以直接把需要采取的模拟量直接接入STM32的IO口,内置了ADC转换器 GPIO_Mode_IN_FLOATING 浮空输入:用处就是提高输入速度,但是需要用“线与”现象来正确的使用该工作方式 在此不解释“线与”,可以百度,或Google一下,自行解决 GPIO_Mode_IPD 下拉输入:可以直接接按钮的一端,按钮另一端需要外接一个电源,此时需要考虑该IO口的耐压值 有些IO口并不能承受5v的电压,STM32默认为3.3V电压 GPIO_Mode_IPU 上拉输入:可以直接接按钮的一端,按钮另一端直接接地即可 12.中断:STM32支持多种中断模式,包括外部中断、定时器中断、ADC中断等,可实现快速响应和处理 外部中断:是指由外部设备或外部信号触发的中断 当外部设备或信号触发中断时,系统会暂停当前任务的执行,并跳转到中断处理程序中处理中断事件 例如按键、传感器等 定时器中断:是指由定时器产生的中断 定时器是一种计数器,可以根据设定的时间间隔或者到达的计数值产生中断 定时器中断通常用于实现系统的定时功能,例如定时采样、定时唤醒等 ADC中断:是指由模数转换器(ADC)触发的事件 ADC可以将模拟信号转换为数字信号,当ADC完成一次转换后,可以产生一个中断信号, 通知系统来读取转换结果。ADC中断通常用于实现模拟信号的采样和数字信号的处理 13.调试模式:STM32支持多种调试模式,如JTAG、SWD等,可方便地进行调试和开发 JTAG调试模式:是一种基于边界扫描的调试模式,主要用于芯片内部测试 它通过连接芯片的JTAG引脚,实现芯片的在线编程和调试 JTAG调试模式需要硬件支持,比如边界扫描芯片和JTAG接口 SWD调试模式:是一种串行调试模式,用于访问ARM芯片的调试接口 它通过连接芯片的SWD引脚,实现芯片的在线编程和调试 SWD调试模式比JTAG调试模式更加灵活,可以在有限的的空间内实现更高效的调试 SWD调试模式需要硬件支持,比如主从调试器和SWD接口 14.定时器看门狗:STM32内部集成多个定时器和看门狗,可实现定时任务和系统复位 滴答定时器:常用于延时或实时系统的心跳时钟 它通常是一个24位的倒计数定时器,从预装载值到0,计数器的值会自动装载到重装载寄存器中 只要不将其使能位清除,它就会永远不停,即使在芯片在睡眠模式下也能工作 15.通信接口:STM32具有多种通信接口,如UART、SPI、I2C、USB、CNA等,可实现与其他外设或主机的通信 UART通信接口:是一种异步通信接口,通常用于在不同的设备之间进行串行通信 SPI通信接口:是一种同步通信接口,通常用于与外部传感器、存储器等设备进行高速数据传输 I2C通信接口:是一种同步串行通信接口,通常用于与外部传感器、存储器等设备进行数据传输 USB通信接口:是一种通用串行总线接口,通常用于与计算机或其他设备进行高速数据传输 CAN通信接口:通信接口是一种串行通信协议,常用于嵌入式系统中的实时通信 16.CRC校验:循环冗余校验码 根据固定的生成多项式计算出任32位全字的CRC计算结果,用于核实数据传输或数据存储的正确性和完整性 17.芯片ID:内部拥有一个独一无二的,这个ID号可以提供给开发者很多优越的功能 把ID做为用户最终产品的序列号 需要保证安全性的功能代码运行前,通过校验此ID,保证最终产品某些功能的安全性 用ID配合加解密算法,对芯片内部的代码进行加加密,以保证用户产品的安全性和不可复制性 18.GPIO:输入输出接口 GPIO 分组:PA0-15 、PB0-15 、PC0-15 、PD0-15 、PE0-15 GPIO_Mode_AIN模拟输入 GPIO_Mode_IN_FLOATING浮空输入 GPIO_Mode_IPD下拉输入 GPIOMode_IPu上拉输入 GPIO_Mode _out_PP推挽输出 GPIO_Mode_out_oD开漏输出 GPIO_Mode_AF_PP复用推挽输出 GPIO_Mode_AF_oD复用开漏输出
介绍STM32F103C8T6芯片的接口定义,各功能对应在接口上的关系:GPIO接口:STM32F103C8T6芯片具有多达8个的GPIO接口,可控制数字信号的 DAC接口:STM32F103C8T6芯片具有1个12位DAC接口,可用于输出模拟信号 I2C接口:STM32F103C8T6芯片具有多达2个I2C接口,可与外部设备进行串行数据通信 TIM接口:STM32F103C8T6芯片具有多达4个TIM接口,可用于定时器、计数器和PWM等应用 DCMI接口:STM32F103C8T6芯片具有DCMI接口,可用于图像数据的采集和编码
1.结构: 中央处理器(CPU):开发板的核心部件,负责指令执行和计算 存储器:包括内存(RAM)和存储器(ROM),用于存储程序和数据 输入输出接口:用于连接外部设备和开发板进行数据通信 电源模块:用于提供开发板所需的电源 特殊功能接口:如JTAG接口、串口等,用于调试和开发 2.功能: 开发板与外部设备的通信:通过输入输出接口与外部设备进行数据通信 程序下载与调试:通过特殊功能接口将程序下载到开发板中进行调试和开发 电源管理:开发板可以管理电源,为不同设备提供适当的电源 嵌入式系统开发:开发板可以作为嵌入式系统的开发平台,进行系统开发和应用程序开发 3.给开发板上电基本使用如下: a 连接开发板与电源适配器,确保正负极正确 b 连接开发板与显示器、键盘、鼠标等外部设备 c 打开电源开关,开发板启动 d 根据需要进入开发环境,如Linux或Android等操作系统 e 进行开发或使用,如编写代码、编译、下载程序、运行应用程序等
写好的程序,通过串口从电脑端写入到单片机当中的过程1.插入udb接口 2.安装usb驱动程序: 电脑——>设置——>设备——>设备管理器——>端口——>usb serial port 没有就需要手动安装(右键——>更新——>添加)或者(对应驱动——>右键——>管理运行安装)或(驱动精灵安装) 3.ISP下载器(FlyMCU) 4.开始使用 4.1 FlyMCU中点击——>搜索串口——>搜索到点击确定 4.2 联机下载时的程序文件——>选择写.hex文件——>勾选编程前重装文件 4.2 STMISP——>勾选 校验 编程后执行 选项字节区——>打勾 设定选项字节等——>STM32F1选项设置——>设置FF阻止读出——>采用这个设置 4.3 点击开始编程 如果下载慢 电脑——>设置——>设备——>设备管理器——>端口——>usb serial port——>右键——>属性 Port Settings——>Advanced——>BM Options——>Latency TImer——>设置成1——>OK
软件下载安装
工程结构 CMSIS——内核驱动程序: 包含c⽂件,ST公司官⽅提供的,对arm内核和mcu系统的基础⽂件,【⼀般不做修改】 LIB——内部功能的基本函数库: 包含c⽂件,st公司提供,需要根据⽤户的【需求对其进⾏增减】 STARTUP——单⽚机启动程序: 包含asm⽂件,st公司提供,负责启动,【⼀般不做修改】 USER——⽤户程序(包括主函数): 包括main.c⽂件和stm32f10x_it.c⽂件。前者为⽤户程序,【需要⽤户进⾏修改】;后者【不要修改】 BASIC——内部功能的驱动函数: 包括dealy.c和sys.c。前者为【⽤户编写的延时程序】;后者为st公司提供,【不作修改】 HARDWARE——外部硬件的驱动程序: 包括led.c和key.c两个⽂件,驱动如led,oled、继电器、微动开关之类。【均为⽤户⾃⼰编写】,需根据需求修改
工程简介:STM32工程包括多个模块,包括CMSIS、Lib、Startup、User等模块 CMSIS模块:提供内核驱动程序 Lib模块:提供内部功能的基本函数库 Startup模块:提供单片机启动程序 User模块:提供用户程序(包括主函数) Basic模块:内部功能的驱动程序 Hardware模块:外部硬件的驱动程序 调试流程: 首先进行程序编译,输出hex文件,然后使用调试工具(如FlyMcu)选中hex文件进行编译,并设置核心板为FLASH ISP模式 接下来,可以使用build命令编译修改后的程序,rebuild命令重新编译程序
keil固件库的安装 库函数的配置
C语言和汇编语言都是人类易学易懂的语言 通过编译器(keil这样的软件)将代码转换为HEX或Bin文件,即单片机认识的语言,可直接在FLASH里读取运行的机械语言
参考固件库用户手册
包括程序的编写、编译、调试和下载等,一般来说,使用固件库进行开发的过程如下: 1.选取合适的固件库,并下载安装 2.在开发环境中添加固件库的头文件和库文件路径 3.在程序中引入所需的头文件 4.使用固件库提供的函数来实现所需功能 5.进行编译、调试和下载等操作,确保程序能够正常运行 6.在编写程序时,要按照固件库的要求进行参数传递和数据类型定义 7.在程序中应该进行错误处理,避免出现异常情况 8.在使用固件库时,要注意其性能和资源占用情况,避免出现资源冲突或性能问题
第一步:文件夹下面新建 第二步:品字型图标,Groups下新建添加 第三步:魔法棒下面lnclude Paths,新建添加路径 第四步:宏定义 在"xxxx.c"文件里面添加(#include "xxxx.h") 作用是关联两个文件 第五步:点击rebuild开始编译
u32 a; //定义32位无符号变量a u16 a; //定义16位无符号变量a u8 a; //定义8位无符号变量a vu32 a; //定义易变的32位无符号变量a vu16 a; //定义易变的16位无符号变量a vu8 a; //定义易变的8位无符号变量a uc32 a; //定义只读的32位无符号变量a uc16 a; //定义只读的16位无符号变量a uc8 a; //定义只读的8位无符号变量a
%d 十进制有符号整数 %u 十进制无符号整数号 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x,%X 无符号以十六进制表示的整数 %o 无符号以八进制表示的整数 %g 自动选择合适的表示法 %p 输出地址符
printf("\O33[1;40;32m good!!! \033[Om Hello,NSFocus \n"); \033 :转义序列的开始 [ :开始定义颜色 1 :定义了高亮显示字符 40 :背景颜色,表示黑色背景 32 :前景颜色,表示绿色 \o33[0m :关闭转义序列,是终端默认颜色 m : 表示结束 前景 背景 颜色 30 40 黑色 31 41 红色 32 42 绿色 33 43 黄色 34 44 蓝色 35 45 紫红色 36 46 青蓝色 37 47 白色 代码 意义 0 终端默认设置(黑底白字) 1 高亮显示 4 使用下划线 5 闪烁 7 反白显示 8 不可见