板子型号:友善之臂Smart4418
板子原理图:Smart-1608
S5P4418芯片手册:Pi2_SOC_DS_0.1.pdf
查看原理图:
PDF中搜LED;
以LED1为例,连接引脚是W24(GPIOB12),低电平点亮;
芯片手册
第15.3.2节,对引脚输出模式的描述;
大致意思是
- 配置
GPIOx. Alternate Function Select register(GPIOxALTFN0 or GPIOxALTFN1)
寄存器来选择引脚的功能; GPIOx Output Enable register(GPIOxOUTENB)
寄存器使能输出;GPIOx Output Register (GPIOxOUT)
寄存器控制引脚输出高低电平;- 第三段还不太懂,开漏输出模式的几个引脚只有在GPIOxOUT设置为0时才起作用,即使GPIOxOUTENB使能为输入;
第2.3节,I/O功能描述
选择Alternate Function 2(交错函数2?)才当做普通io口GPIOB12使用,参考32里面的复用功能;
第15.4.1.8节,寄存器GPIOxALTFN0的说明:
寄存器地址描述的有点小模糊;比如GPIOxALTFN0,按手册的说法应该是0xC001B000 + 0xB020 = 0xC0026020,但正确的应该是0xC001B020(0xC0010000 + 0xB020);
GPIOxALTFN0[25:24] 配置为10;
GPIOxOUTENB寄存器说明:
GPIOxOUT寄存器说明:
敲代码
三个文件;
//main.c 主程序
#define uint unsigned int
#define GPIOBAddr 0xC0010000
#define GPIOBALTFN0 (*(volatile uint *)(GPIOBAddr + 0xB020))
#define GPIOBALTFN1 (*(volatile uint *)(GPIOBAddr + 0xB024))
#define GPIOBOUTENB (*(volatile uint *)(GPIOBAddr + 0xB004))
#define GPIOBOUT (*(volatile uint *)(GPIOBAddr + 0xB000))
void init(){
GPIOBALTFN0 |= (2 << 24);
GPIOBOUTENB |= (1 << 12);
GPIOBOUT |= (1 << 12);
}
void led_on(){
GPIOBOUT &= ~(1 << 12);
}
void led_off(){
GPIOBOUT |= (1 << 12);
}
void delay(uint t){
while(t--);
}
int main(){
init();
while(1){
led_on();
delay(2000000);
led_off();
delay(2000000);
}
return 0;
}
//start.s 启动文件
.text
.global _start
_start:
b start
start:
b main
//Makefile
default:
arm-linux-gcc -c start.s -o start.o
arm-linux-gcc -c main.c -o main.o
arm-linux-ld -Ttext=0x42C00000 start.o main.o -o main.elf
arm-linux-objcopy -I elf32-littlearm -Obinary main.elf main.bin
clean:
rm *.bin *.o *.elf
ld 链接地址为0x42C00000;这个地址有点小讲究;
make后生成的main.bin文件就是我们要的裸机程序;