目录
一、嵌入式介绍
1.嵌入式系统:
以应用为中心,以现代计算机技术为基础,能够根据用户需求(功能、可靠性、成本、体积、功耗、环境等)灵活裁剪软硬件模块的专用计算机系统。
2.嵌入式操作系统
嵌入式操作系统(Embedded Operating System,简称:EOS)是指用于嵌入式系统的操作系统。嵌入式操作系统是一种用途广泛的系统软件,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等。嵌入式操作系统负责嵌入式系统的全部软、硬件资源的分配、任务调度,控制、协调并发活动。它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能。在嵌入式领域广泛使用的操作系统有:嵌入式实时操作系统µC/OS-II、嵌入式Linux、Windows Embedded、VxWorks、Intewell操作系统 等,以及应用在智能手机和平板电脑的Android、iOS、华为鸿蒙等。
3.单片机:
单片机(Single-Chip Microcomputer)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。
单片机又称单片微控制器(MCU),它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。
单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。
mcu cpu gpu......
二、STM32F103ZET6简介
1.单片机的组成:
CPU--Cortex_M3(内核)
调试系统--下载 debug调试
内部总线--用于连接内核和外部设备
外设--串口 AD转换 定时器。。。。。
存储器--flash(闪存) ram 。。。。。
时钟和复位--提供工作频率,上电复位
IO--输入输出
2.单片机外观:
四周裸漏的金属状的引脚就是IO口
3.ARM公司
ARM公司是一个芯片公司
ARM处理器是英国Acorn有限公司设计的低功耗成本的第一款RISC微处理器。全称为Advanced RISC Machine。ARM处理器本身是32位设计,但也配备16位指令集,一般来讲比等价32位代码节省达35%,却能保留32位系统的所有优势。
4.ST公司--意法半导体
https://www.st.com/content/st_com/zh/search.html#q=STM32-t=products-page=NaN
ST公司获得ARM公司的授权(钱),就可以使用ARM公司的不同架构下的处理器,拿过来之后,通过芯片制造厂商进行生产,最终得到了我们现在使用的芯片。
台积电 三星 联发科...... 制造芯片 4nm
三、资料部分
1.安装工具:
1.安装包直接双击安装即可(安装路径不要有中文)
中间会出现安装驱动,点击安装即可
安装完毕之后不要打开keil,如果打开了就直接×掉:
直接关闭即可。
安装完毕之后,如下所示:
2.破解软件:
以管理员权限打开KEIL5工具
点击注册管理选项:
打开注册机生成注册码:
温馨提示:打开注册机之前,把电脑声音关小点,这个软件自带音乐有点大
注册码:9WSKC-7V6GL-Z94G9-4JNYT-95MII-G6T57
将注册码复制到keil工具指定位置:
3.安装PACK包:
四、如何编写简单的驱动
1.查看原理图
LED_PB5--网络标号,在原理图中都是一一对应的
由原理图可得,
PB5输出高电平---LED灭
PB5输出低电平---LED亮
2.IO口的命名方式:
PB5---B端口中的第五个管脚
端口:是为了方便管理IO口,引入的一个概念,使用英文字母表示A B C D.......
每一个端口中有16个管脚,比如B端口,PB0--PB15
3.单片机资源概述:
单片机中总共的引脚是144个
但是可以让工程师编程使用的只有112个--成为IO口(既可以输入也可以输出)
供电--3.3V(单片机5V供电也没问题)
当前使用的是3.3V供电,编程中使用的都是二进制(计算机),两者如何对应????
单片机内部,使用的模数转换,将模拟信号转换为数字信号
高电平--(2.4--3.6V) 数字量--数字1
低电平--(0--1.4V) 数字量--数字0
4.寄存器
寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。 [1]
按照功能的不同,可将寄存器分为基本寄存器和移位寄存器两大类。基本寄存器只能并行送入数据,也只能并行输出。移位寄存器中的数据可以在移位脉冲作用下依次逐位右移或左移,数据既可以并行输入、并行输出,也可以串行输入、串行输出,还可以并行输入、串行输出,或串行输入、并行输出,十分灵活,用途也很广。
寄存器就是用来保存数据(二进制数据)
基本寄存器--用于配置或者控制
移位寄存器--负责数据的位移
我们需要使用到的寄存器:
5.配置寄存器(CRL和CRH寄存器):
6.输出寄存器:
7.IO口输入输出模式
输入输出方式总共是8种,我们需要根据不同的应用场景和外部设备合理的选择输入输出方式:
比如:LED灯--PB5
PB5配置为输出模式,但是应该选择哪一种???
输出模式:
通用推挽输出:在我们的单片机输出模式下,IO口既可以输出高电平也可以输出低电平
通用开漏输出:在我们的单片机输出模式下,IO口只可以输出低电平,无法输出高电平,需要外界上拉电阻才可以输出高电平
复用推挽输出:在我们的单片机输出模式下,除了简单的输出高低电平之外的功能(片上外设部分)
复用开漏输出:在我们的单片机输出模式下,除了简单的输出低电平之外的功能(片上外设部分)
片上外设:指的就是我们单片机芯片中自带的功能(除了简单的按位输出高低电平)
串口(USART) 定时器 SPI IIC......属于片上外设
片上外设查看以下手册:中文手册的20页
输入模式:
模拟输入:主要就是用于AD转换,将模拟量转数字量
浮空输入:在输入模式中,IO口既不连接上拉也不连接下拉,电平状态是不确定的
上拉输入:在输入模式中,IO口连接上拉,将电平拉高
下拉输入:在输入模式中,IO口连接下拉,将电平拉低
五、代码的编写
LED灯---PB5管脚
本质上配置PB5--如何配置?
根据以上原理图可得,PB5--输出模式,输出模式中有4种配置,到底用哪一种???
通用推挽输出(输出的是开关量,0或者1单个Bit)
PB5--通用推挽输出
1.时钟的概念
当前使用的单片机时钟最大:72MHZ,这也是我们当前使用的时钟频率
时钟的大小决定了,我们处理器运算速度的快慢
STM32单片机中,每一个外设或者端口都有自己独立的时钟源开启控制位
2.配置PB5(寄存器)
寄存器操作中的原则,只改变你需要操作的位,不能改变其他位。
1).打开B端口的时钟
B端口的使用来源是APB2总线
RCC-APB2ENR |=0X01<<3;
0x01<<3 ------->1000
RCC-APB2ENR | 1000 ----->1写入了第三位,而且没有改变其他位数据。
2).配置PB5--通用推挽输出
GPIOB_CRL寄存器
GPIOB_CRL |=0x01<<20
0000 0000 0001 0000 0000 0000 0000 0000 (0x01<<20)
0100 0100 0100 0100 0100 0100 0100 0100 原始值
0100 0100 0101 0100 0100 0100 0100 0100 结果(错误)
0100 0100 0001 0100 0100 0100 0100 0100 结果(正确)
清零操作:GPIOB_CRL &=~(0x0F<<20) //因为CRL寄存器初始值不为0
0000 0000 1111 0000 0000 0000 0000 0000 0x0F<<20
1111 1111 0000 1111 1111 1111 1111 1111 ~(0X0F<<20)
0100 0100 0100 0100 0100 0100 0100 0100 原始值与 ~(0X0F<<20)
0100 0100 0000 0100 0100 0100 0100 0100 结果(清零之后的结果)
再次运行 GPIOB_CRL |=0x01<<20
GPIOB_CRL初始值: 0100 0100 0000 0100 0100 0100 0100 0100
GPIOB_CRL | (0x01<<20) 0000 0000 0001 0000 0000 0000 0000 0000
结果: 0100 0100 0001 0100 0100 0100 0100 0100
3).输出高电平或者低电平
GPIOB_ODR寄存器
拉高:GPIOB_ODR |=0x01<<5
拉低:GPIOB_ODR &=~(0x01<<5)
六、驱动安装:
KEIL的相关配置修改:
#include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h>
void Led_Config(void);
void delay_tim(u32 tim);
int main(void)
{
// 来到这里的时候,系统的时钟已经被配置成72M。
Led_Config();
while(1)
{
GPIOB->ODR &=~(0X01<<5);
delay_tim(1000000);
GPIOB->ODR |=(0X01<<5);
delay_tim(1000000);
}
}
void Led_Config(void)
{
//时钟
RCC->APB2ENR |=0X01<<3;
//配置通用推挽输出
GPIOB->CRL &=~(0X0F<<20);//清零
GPIOB->CRL |=0x01<<20;//通用推挽输出--10MHZ
}
void delay_tim(u32 tim)
{
while(tim--);
}
七、寄存器操作的补充
GPIOB->CRL &=~(0X0F<<20);
GPIOB--代表什么意思? 地址
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define PERIPH_BASE ((uint32_t)0x40000000)
GPIOB端口基地址:0x40010c00
GPIO_TypeDef内容:
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDe