回顾:
开发板烧写实验
cpu: SEC_S5P6818X_Users_Manual_preliminary_Ver_0.00.pdf
LED驱动程序开发
1、电路原理图
底板:x6818bv2.pdf
结论,如果让LED1亮或者灭
其实就是让导线GPIOC12出现低电平或者高电平
核心板:x4418cv3_release20150713.pdf
搜索 “GPIOC12”
导线"GPIOC12"连接到了CPU W15管脚上了
结论,其实控制LED1的亮灭
实则就是控制cpu上的W15管脚出现低/高电平
问题:如何编程控制W15管脚上出现高电平或者低电平?
答案应该去cpu datasheet中找
2、cpu datasheet
P68:
w15管脚的可选功能1
该cpu上有160个GPIO管脚
GPIOCALTFN0 : 0xc001c020
[25:24], 01 配置为可选功能1(输入输出功能)
GPIOCOUTENB: 0xc001c004
[12] 1, 选择输出功能
GPIOCOUT: 0xc001c000
[12] 1/0 输出高/低电平
3、C语言回顾
3.1 指针
常数:0xc001c020
地址:(unsigned int *)0xc001c020
读其中内容 :*((unsigned int *)0xc001c020)
写入内容: *((unsigned int *)0xc001c020) =100
访问特殊功能寄存器的标准写法
*((volatile unsigned int *)0xc001c020)
volatile的作用?使用场合?
防止编译器的过度优化
3.2位操作
//错误的
*((volatile unsigned int *)0xc001c020)= 0x01000000
//有BUG 假如该寄存器原来bit25=1
*((volatile unsigned int *)0xc001c020)|= 0x01000000
//将24 25bit清0
*((volatile unsigned int *)0xc001c020)&= 0xfcffffff
//将24bit置1
*((volatile unsigned int *)0xc001c020)|= 0x01000000
//标准写法
*((volatile unsigned int *)0xc001c020)&= ~(3<<24);
*((volatile unsigned int *)0xc001c020)|= (1<<24);
4、编辑程序
5、编译程序
5.1 安装交叉编译工具
sudo chmod 777 /opt/ -R
cp /home/tarena/workdir/arm-linux-gcc/arm-cortex_a9-eabi-4.7-eglibc-2.18.tar.gz /opt/
cd /opt
tar xf arm-cortex_a9-eabi-4.7-eglibc-2.18.tar.gz
vi ~/.bashrc
export PATH=$PATH:/opt/arm-cortex_a9-eabi-4.7-eglibc-2.18/bin/
source /home/tarena/.bashrc
arm-cortex_a9-linux-gnueabi-gcc -v
5.2 编译led.c
1)arm-cortex_a9-linux-gnueabi-gcc -c led.c -o led.o -nostdlib
2)arm-cortex_a9-linux-gnueabi-ld -nostdlib -nostartfiles -Ttext=0x48000000 -eled_test led.o -o led.elf
3)arm-cortex_a9-linux-gnueabi-objcopy -O binary led.elf led.bin
6、运行程序
cp led.bin /tftpboot/
在开发板上执行:
tftp 0x48000000 led.bin
go 0x48000000