GPIO:通用I/O引脚
总引脚数176个
I/O引脚144个
144/16=9组
A组-I组
A组:A0-A15
---------------------------------------------------------------
保护二极管钳卫作用,防止电压过高
复位0,置位1
---------------------------------------------------------------
CMOS H高电平2.4V-3.3V L高电平0V-0.7V
施密特触发器快速改变电平(2.4V-3.3V)
VSS电源,VDD接地
---------------------------------------------------------------
MOS管电压型控制器件
输入:模拟输入;复用(GPIO->串口)
输出:推挽(加快高低电平切换);开漏(自身截止,不能输出高电平,外部上拉电阻提供高电平)
高阻态介于高低电平之间
内部上/下拉电阻改变高低电平
---------------------------------------------------------------
复位信号 0x00000000-0xFFFFFFFF(4G) 全0程序从头开始运行
PC程序寄存器 硬件交互数据(寄存器之间交互)
---------------------------------------------------------------
.c-.exe
1.预处理
{
将.h内所有内容复制到.c
宏展开
别名替换
枚举替换等
}
2.编译
.c-.s(汇编语言) 每一个.c文件对应生成.s文件
3.汇编
将.s文件生成.o文件(目标文件)变成机器语言
每一个.s生成一个.o
4.链接
多个.o文件生成.exe(windows).elf(linux).bin/.hex可执行文件(烧写flash)
只抽取使用的函数库函数对大小没有影响
---------------------------------------------------------------
可执行文件构成
.code代码段 判断,循环等转换成ARM指令
.data数据段 全局变量,地址,静态变量,常量
.bss可优化 没有被使用的数据
-O0-O3优化等级越来越高
---------------------------------------------------------------
可执行文件烧写到内部flash
两个储存器flash(1M),SRAM(256K)
0地址创建栈空间和堆空间
栈空间放局部变量,函数内申请空间
堆空间malloc申请空间
stack size栈大小
_initial sp 按复位键 栈指针
---------------------------------------------------------------
Enable使能
disable失能
SystemInit启动外部时钟源
__main微库
用寄存器方式实现硬件控制
程序编写流程:
1.硬件初始化
(a)时钟源打开
通过RCC打开GPIOH的时钟源
RCC首地址0x40023800
RCC_AHB1ENR----0x100080偏移0x30
(b)外设初始化
GPIOH首地址0x40021C00
PH10
输出GPIOH_MODER----0x100000 偏移0x00
推挽GPIOH_OTYPER----0x00000000推挽 偏移0x04
上拉GPIOH_PUPDR----0x100000 偏移0x0C
低速GPIOH_OSPEEDR----0x00000000 偏移0x08
2.硬件控制
高低电平输出
GPIOH_ODR----偏移0x14
H----0x400
L----0x00000000