1.cpu控制硬件原理
CPU不能直接控制硬件,硬件是由其对应的控制器(寄存器)来控制的
每个控制器(寄存器)都会映射到CPU寻址范围内的一段空间
CPU通过对控制器(寄存器)的读和写实现对硬件间接的控制
硬件板子介绍:
2.操作步骤
1.通过底板原理图,找到对应电路分析灯怎么亮。
2.通过核心板原理,找到对应引脚。
3.通过手册确定引脚功能--》GPIO,输出一个高电平灯亮
(1)通过底板原理图,找到对应电路分析灯怎么亮。首先发现LED的丝印是RGBLLED1,所以去底板原理图找,分析得知给一个高电平灯亮。
通过查找可知:有 RGB R RGB G RGB B,当然对应的也就是红绿蓝三种颜色,首先先介绍红色:板子对应的名称为 :MCU CAM1 PCLK然后咱们再去核心板原理图上找它所对应的引脚
在核心板原理图上咱们可以看到红色灯所对应的引脚名是U21,所以咱们去芯片手册上搜一下怎么操作U21即可。
由图可知U21对应的是GPIOA28,所以咱们需要配置GPIO的A类。
控制寄存器-->设置
1)选GPIOA28的功能 --》对应寄存器是GPIOAALTFN1 :控制引脚功能的选择
地址=基准地址+偏移地址,由图可知:
地址:0xC001A024 设置值为:0xC001A024
找到这个地址咱们就实现了通过cpu实现对硬件板子红灯的控制。
(2)找到了对应的硬件地址,那接下来就要考虑该引脚是输入还是输出。那就引入了:
GPIOxOUTENB:控制引脚的输入输出模式
GPIOAOUTENB ---> 0xC001A004
设置GPIOA28引脚为输出模式:
GPIOAOUTENB[28] <--写-- 1 // 因为咱们找的红灯丝印对应的芯片手册是GPIOA28,所以咱们就要控制它的第28位
这样就实现了配置红灯为输出模式了,那接下来就要给它一个高低电平来实现点亮熄灭
(3)GPIOxOUT:控制引脚输出高低电平
那么也就是说 地址:C001A000 代表的就是控制咱们红灯的高低电平,有上面分析得知给它一个高电平就会点亮红灯。所以下面是一个红灯的点亮完整代码:
3.绿灯、蓝灯的控制
除了红灯还有绿灯 蓝灯,操作步骤也都是和上边一样先找底板的名称再去核心板找引脚最后去芯片手册找对应的GPIO控制。
绿灯:
蓝灯:
详细步骤也都是和上边一样的解说,那接下来咱们实现一个红绿蓝延时1s循环点亮
//#include <s5p6818.h>
#define GPIOEALTFN0 ((unsigned int *)0xc001e020) //绿灯
#define GPIOEOUTENB ((unsigned int *)0xc001e004)
#define GPIOEOUT ((unsigned int *)0xc001e000)
#define GPIOAALTFN1 ((unsigned int *)0xc001a024)//红灯
#define GPIOAOUTENB ((unsigned int *)0xc001a004)
#define GPIOAOUT ((unsigned int *)0xc001a000)
#define GPIOBALTFN0 ((unsigned int *)0xc001b020)//蓝灯
#define GPIOBOUTENB ((unsigned int *)0xc001b004)
#define GPIOBOUT ((unsigned int *)0xc001b000)
void delay_ms(unsigned int ms) //延时函数
{
unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 1800; j++)
;
}
int main()
{
*GPIOEALTFN0 = *GPIOEALTFN0 & (~(0X3 << 26)); //配置绿灯的控制引脚
*GPIOEOUTENB = *GPIOEOUTENB | (1 << 13); //配置绿灯的输出模式
*GPIOAALTFN1 = *GPIOAALTFN1 & (~(0X3 << 24));
*GPIOAOUTENB = *GPIOAOUTENB | (1 << 28);
*GPIOBALTFN0 = *GPIOBALTFN0 | (1 << 25);
*GPIOBALTFN0 = *GPIOBALTFN0 & (~(1<< 24));
*GPIOBOUTENB = *GPIOBOUTENB | (1 << 12);
while (1)
{
*GPIOAOUT = *GPIOAOUT | (1 << 28); //给红灯一个高电平实现点亮
delay_ms(1000);
*GPIOAOUT = *GPIOAOUT & (~(1 << 28));
delay_ms(1000);
*GPIOEOUT = *GPIOEOUT | (1 << 13); //给绿灯一个高电平实现点亮
delay_ms(1000);
*GPIOEOUT = *GPIOEOUT & (~(1 << 13));
delay_ms(1000);
*GPIOBOUT =*GPIOBOUT |(1<<12); //给蓝灯一个高电平实现点亮
delay_ms(1000);
*GPIOBOUT=*GPIOBOUT & (~(1<<12));
}
return 0;
}
然后咱们通过终端来传送一下数据给开发板:
1》拷贝.bin文件到windows中
2》开发板和电脑进行硬件连接
串口线的USB端插到电脑的USB口
串口线的串口端插到开发板的UART0端口上
开发板插上电源
3》配置windows超级终端
如果串口线第一次使用需要安装串口驱动
串口驱动文件在资料中
配置超级终端:
可以查看配置超级终端的使用说明文档
资料中有
在设备管理器中,查看串口线使用的那个端口号
配置端口属性:
波特率:115200
数据位:8
停止位:1
校验位:无
流控:无
4》开发板上电,超级终端会有打印信息
在倒计时减到0之前按任意键,进入到FS6818#界面
执行命令 loadb 0x43c00000 --》下载二进制文件到内存的0x43c00000
传送--》发送文件--》选择要下载.bin文件,选择Kermit协议 --》 确定下载
执行命令:go 0x43c00000 --》到0x43c00000位置运行代码
至此为止,咱们就实现了红绿蓝循环点亮的操作。