计算机在工作过程中,所谓的硬件沟通,即是寄存器和寄存器在交换数据,每一个硬件都有自己的寄存器,
在程序启动时,硬件收到复位信号,寄存器中形成0x00000000即32位皆清0,
C程序的编译过程:
预处理:将所有.h文件复制到.c中、宏展开、别名替换、枚举替换;
编译:把每一个.c文件转换成一个.s文件即汇编语言文件;
汇编:将每一个.s文件生成一个.o文件即目标文件;
链接:将多个.o文件生成一个.exe(windows).ell(linux).bin/.hem(当前环境)文件,即可执行文件,链接也是一个抽取的过程,只抽取使用的函数内容,其他的库函数、头文件等不会影响程序。
交叉编译:在当前环境给其他平台使用的软件进行编译。
可执行文件的构成:
.code(代码段):指令
.data(数据段):全局变量、地址、常量、静态变量
.bss(可优化段):没有被使用的数据
程序烧写之后,系统要在存储空间给程序申请一个栈空间、一个堆空间用于运行。堆在底部申请,栈在顶部申请,中间的内存空间称为堆栈增长区。
pc指针随晶振会自增。
管脚控制程序编写:
[if !supportLists]1. [endif]硬件初始化:
[if !supportLists]a) [endif]时钟源打开:通过RCC打开GPIOH的时钟源
RCC首地址:0x40023800
找到
GPIOH首地址:0x40021C00
[if !supportLists]b) [endif]外设初始化:PH10——输出,推挽,低速,上拉(高电平熄灭,所以开始时应当高电平)
[if !supportLists]2. [endif]硬件控制:高低电平输出
[if !supportLists]3. [endif]
如何点亮一个led?只要有一个正向导通的电压,即可点亮,一般硅光二极管使用0.7V正向电压即可。
如何控制一个led?一般可以介入一个开关,但在现在,我们可以尝试利用信息手段进行控制,实现远程控制或者自动控制,那么,要想实现这样的无线通信,首先应当拥有无限通讯模块,即4G或者wifi,进行信号传输,然后将信号转换成控制量,然后控制硬件。
那么现在我们所使用的,即是GPIO即通用I/O引脚,今天所学习的就是使用这些引脚。
目前使用的芯片除最小系统所使用的管脚外,剩余144个管脚皆为GPIO管脚,分为9组,命名从A0~A15到I0~I15,每一组对应一个GPIO控制器。
GPIO接口的基本特性:双向性,既可以输入又可以输出,所以应当站在芯片的角度去设计程序。
输出:
保护二极管起钳卫作用,防止进入芯片的电压过高或者过低;
复位:0
置位:1
一般使用置位复位寄存器产生0和1再进行输出,否则电平上下拉动的速度可能跟不上。
输出分为推挽输出和开漏输出:
推挽:在实现01控制过程中,其中的高低电平映射中,可以由两个硬件同时作用推高或者拉低电压,便于加速改变电压状态,高速切换;
开漏:如果想通过管脚直接驱动感性用电器,则需要使用开漏型输出模式,所以开漏输出模式是无法输出高电平的,这时候要在外部加一个上拉电阻,以给外设供电,驱动感性器件。
即:当需要输出高低电平,则应当使用推挽模式输出,当需要驱动外部器件,则应当使用开漏模式输出。
MOS管:电压型控制器件;三极管:电流型控制器件,核内电流比较小,所以一般采用电压控制方式。
管脚在输出过程中,我们希望要么处于高电平,要么出于低电平,而不是出于不高不低的高阻态。所以使用一个内部的上拉电阻和下拉电阻调整,进行上拉、下拉或者浮空。
输入:
施密特触发器:加速电压跳变,并将电压不足的信号拉高到高电平。
复用功能在后续会重新解释;
总结:IO接口的八个功能: