嵌入式软硬件协作简单例子分析

来源:互联网 发布:网络推广专员薪资制度 编辑:程序博客网 时间:2024/06/03 20:12

一个典型的SOC架构有CPU、总线、存储器、外设。CPU负责指令的取指、译码、执行;总线给每个CPU外围设备指定一些地址,包括存储器和一些其他设备。CPU通过这些地址开始的一些寄存器来控制这些硬件。

以S3C2440为例,从0x0000_0000-0x4000_000对应存储器空间,它被分成8个bank,每个bank对应一类存储器或者和存储器接口类似的器件。0x4800_0000-0x4800_0030为存储器控制器地址空间。0x5600_0000-0x5600_00B0位I/O端口.....这些都可以从芯片手册上查到。如:0x5600_0050对应端口F的控制寄存器GPFCON,0x5000_0054对应端口F的数据寄存器。

#define GPFCON(*(volatile unsigned int *)0x56000050)
#define GPFDAT(*(volatile unsigned int *)0x56000054)

int main()
{

unsigned int read_gpfdata;
GPFCON = 0x0000_0010;
GPFDAT  = 0x0000_0004; 

GPFCON = 0x0000_0000;

read_gpfdata = GPFDAT;

return 0;
}

前两行宏定义是C语言指针的典型应用,它把0x56000050这个地址的内容和标号GPFCON对应起来。注意:这里的GPFCON只是一个名称而已,开发者可以随意命名,但是,变量的命名应该与功能相对应。根据芯片手册,0x56000050地址对应的寄存器实现F端口控制功能。GPFCON = 0x00001500表示向0x56000050地址寄存器写入0x00001500。代码存在存储器中,所以实际硬件的执行过程为:CPU通过总线从存储器中取出指令和数据,然后通过总线把0x00001500写入0x56000050地址对应的寄存器。GPFCON每2bit控制F端口一个引脚的功能,0b00:输入;0b01:输出;0b10:特殊复用功能;0b11:保留。可见这里把F端口引脚2配置为输出功能。0x56000054地址对应F端口数据寄存器,若引脚功能为输出,则每一bit的1、0对应引脚输出高、低电平。若为输入,则引脚的电平会映射到GPFDAT上,读GPFDAT即读F引脚对应的电平。所以上述代码分为两部分,一部分为F端口引脚2输出;一部分为读取F端口引脚电平状态。

原创粉丝点击