需要板子一起学习的可以这里购买(含资料):点击跳转
- 如何实现对硬件控制
分析硬件原理图(开发板的原理图)----> 分析硬件的控制方法 ---> 控制硬件时,所要用到的寄存器 ----> 了解控制硬件寄存器的流程 ----> 实现对硬件的控制和访问
- 分析原理图以及控制的方法
(本文以GPIO13为例来控制灯的亮灭)
- 控制硬件时,所对应的寄存器
要控制GPIO口所要用到的主要寄存器:X是一个未知数:A B C D E 比如:GPIOEOUT
1、GPIOXALTFN0和 GPIOXALTFN1 --- 配置引脚的功能
GPIOXALTFN0(32位) ---- 控制GPIO的0-15脚
GPIOXALTFN1(32位) ---- 控制GPIO的16-31脚
ALT FunctionX 具体意义
比如:GPIOE13 ---- > GPIO使用
GPIOEALTFN0_13 -----[27:26] ----> 00
2、GPIOXOUTENB ------>设置GPIO的模式:输入或者输出模式
3、GPIOXOUT---> 设置GPIO为值:低电平(0)或者高电平(1)
4、GPIOXPAD ---->读取寄存器上值
编写代码如下:
/*
裸机程序特点:
1)直接下载的内存,运行,不运行在操作系统上,不在使用标准库,无main
2)裸机入口函数:
void _start(void)
{
}
必须是源文件中的第一个函数,在该函数之前不能有其他函数的定义
*/
//以GPIOE13为例: GPIOEOUT,GPIOEOUTENB,GPIOEALTFN0
#define GPIOEOUT *((volatile unsigned int*)0xC001E000)
#define GPIOEOUTENB *((volatile unsigned int*)0xC001E004)
#define GPIOEALTFN0 *((volatile unsigned int*)0xC001E020)
void delay(int delay);
void _start(void)
{
//GPIOE13
//[1] 配置GPIO的功能----用来做GPIO使用 GPIOEALTFN0[27:26] ---> 00 --->清零
GPIOEALTFN0 &= (~(3<<26));
//[2] 配置GPIO的模式 ---- 输出模式 GPIOEOUTENB[13] ---->1 --->置"1"
GPIOEOUTENB |= (1<<13);
//[3] 给寄存器的某一位赋值为0或者1 ---GPIOEOUT
while(1)
{
//低电平 GPIOEOUT[13] --->0
GPIOEOUT &= (~(1<<13));
//睡眠1s
delay(0x4000000); //1s
//高电平 GPIOEOUT[13] --->1
GPIOEOUT |= (1<<13);
//睡眠1s
delay(0x4000000); //1s
}
}
void delay(int delay)
{
volatile int i = delay;
while(i--);
}
1、对于一个int变量a,将第20位清零,其他位保持不变:
a &= ~(1<<20);
2、对于一个int变量a,将第10位置1,其他位保持不变
a |= (1<<10);
3、对于一个int变量a,将第30位取反,其他位保持不变:
a ^= (1<<30);
4、对于一个int变量a,判断其第15位是否为1
if(a & (1<<15))
printf("a的第15位为1");
else
printf("a的第15位为0");
5、对于一个地址0xc0000000,如何读写该地址的内容
*((unsinged int*)0xc0000000) = 0x123456; ---->写内存
int i = *((unsinged int*)0xc0000000);----> 读内存
printf(“%d\n”,*((unsinged int*)0xc0000000) );
- 下载及调试程序并运行
1、配置网络环境
X6818# printenv
gatewayip=192.168.27.1
ipaddr=192.168.27.3
netmask=255.255.255.0
qtcrc=1446511370
serverip=192.168.27.2
修改开发板网络配置:
X6818# setenv gatewayip 192.168.13.1
X6818# setenv ipaddr 192.168.13.3
X6818# setenv serverip 192.168.13.2
X6818# save/saveenv
Saving Environment to MMC...
Writing to MMC(2)... done
开发板ping pc机
X6818# ping 192.168.13.2
dwmac.c0060000 Waiting for PHY auto negotiation to complete...... done
dwmac.c0060000: No link.
ping failed; host 192.168.13.2 is not alive
X6818# ping 192.168.13.2
Speed: 1000, full duplex
Using dwmac.c0060000 device
host 192.168.13.2 is alive -------> ok
2、下载程序
X6818# tftp 0x40000000 led.bin --->下载led.bin到内存上,0x40000000为内存的起始地址
Speed: 1000, full duplex
Using dwmac.c0060000 device
TFTP from server 192.168.13.2; our IP address is 192.168.13.3
Filename 'led.bin'.
Load address: 0x40000000
Loading: #
16.6 KiB/s
done
Bytes transferred = 156 (9c hex)
3、运行程序 --- go
X6818# go 0x40000000 ---> 跳到指定的内存地址上执行程序
## Starting application at 0x40000000 ...
注意:
- 在u-boot上运行裸机程序,用go
- 裸机程序一旦执行,不能通过ctrl+c来终止程序
- 由于执行程序是下载到内存上,所以,重启开发板,则程序丢失
觉得有帮助的话,打赏一下呗。。