c语言程序如何控制硬件?

C语言程序控制硬件可以分为以下几个步骤:

1.c语言程序变成可执行文件

    首先C语言程序烧录被编译器编译以后,先进行预处理展开宏定义、去掉注释等生成.i文件,接下来这个i文件会被编译器转换为汇编代码生成S文件,然后把汇编代码转换成目标文件也就是o文件,最后是链接,也就是将多个o文件和库文件链接起来,形成一个可执行文件,也即是最终转换为二进制机器码(.bin\.hex)

2.烧录程序以及启动运行

     接下来就是将这个hex文件或者是bin文件(一般生成的是hex文件)烧录进单片机,此时这个程序会根据启动方式的不同储存在不同位置(有三种启动方式:flash、系统存储器、内置SRAM)。

     如果是系统存储器启动那么此时用户程序会被储存在系统存储器中。此时当单片机上电或者复位以后,此时会触发bootloader程序的复位中断,在中断函数里边开始运行bootloader。此时中断函数里边会调用bootloader程序的main函数,此时程序到此处继续运行。在该main函数中,会将用户代码拷贝到flash中,然后接下来跳转到该用户程序的入口地址,其中,需要注意的是,这个用户程序的入口地址实际上是复位异常的入口地址。接下来会进入到用户程序的复位中断函数里边执行程序,然后开始执行这个复位中断程序,在这个中断程序里边会调用用户程序的main函数

    如果是flash启动模式,此时是不需要bootloader参与的(除非是需要进行固件更新时,会由用户开发的bootloader烧录进flash中,再由bootloader来加载APP程序),此时是正常的启动流程,即当单片机复位以后执行复位中断程序,调用main函数到main函数入口处开始执行;

    如果是SRAM模式下,是否有bootloader取决于应用,此处不做细致了解。

    最后将main函数的入口地址存入PC寄存器,此时程序就可以按照顺序往下执行了。bootloader流程如下图所示:

3.执行程序

     接下来CPU开始按照PC计数器上的地址顺序读取flash上的机器码指令,这个过程叫做取指,这在CM3上是通过Icode总线去读取的。然后通过内存地址寄存器去读取PC计数器上的所存储的地址,并将地址里边所存取的数据读取出来,发送到指令寄存器中。接下来在控制单元中解释这些机器码指令(注意这里的控制单元实际上就是CU解码单元,本质上是一个译码器),最后在进入ALU计算单元中进行运算,最后将得到的结果输出。流程图如下所示:

4.控制硬件

     比如说这些指令是控制led灯亮灭的,我们知道控制led亮灭需要对相应的引脚控制寄存器写入0或者1,那么我们在软件代码中写入的数字0或者1怎么传输到寄存器上呢?首先将这些二进制码在CPU内部通过解码器电路转换成了真实的物理电平解码器:将数字二进制代码转换成真实的高低电平信号),然后再通过系统总线传输这些真实电压信号到外设寄存器GPIO,流程如下图所示。此处解释一下什么是寄存器以及存储器,寄存器是储存1组二进制数据,而储存多组二进制数据的叫做存储器,如RAM,ROM等。n位寄存器由n个触发器构成,触发器是一种存储器件,具有置0或置1功能,它由门电路组成,门电路是一种硬件电路(由多个mos,三极管构成,需要真实电压让其开启或者截至)。其中,触发器有两种触发方式(电平触发或者边沿触发,在寄存器中,我们不关心触发方式。而锁存器是不触发)。因此,实际上寄存器输出的信号是实际的物理电平

     接下来说一下存储器按照存储方式分为两类:静态储存单元(由门电路组成,包含各种锁存器和触发器,只要不断地不丢失数据)和动态储存单元(利用电容存储效应来存储数据,速度较慢,需要刷新)。

         话说回来,当将电压信号通过总线传输到gpio寄存器以后,即是写入寄存器以后,此时寄存器输出对应信号去开启CMOS驱动电路,使其输出对应的驱动高电平或者低电平,驱动小灯亮灭,如下图所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值