赞
踩
iTop4412 SCP 1G 有两个我们可以操作的LED 分别为 LED2、LED3
根据两个引脚信息 在核心板原理图上找到相应的GPIO寄存器
LED2 对应的为 GPL2_0
LED3 对应的为 GPK1_1
在Datasheet中查看 GPL2 与 GPK1的相关信息
首先找到GPK1CON和 GPK1DAT的基地址以及偏移地址
GPK1_1的配置信息
GPK1_1代表使用的为 GPK1CON中的第[7:4]Bit 也就是 GPK1CON[1]
所以 CPK1CON = 0x00000010 即可设置为输出模式
GPL2CON和GPL2DAT的基地址与偏移地址
由于我使用的是GPL2_0 使用的是GPL2CON中的[3:0]Bit
所以 GPL2CON = 0x00000001即可表示为输出模式
程序实现
Start.S
.global _start
.global main
_start:
bl main
.end
Led.h
/*************************************************************************
> File Name: led.h
> 作者:YJK
> Mail: 745506980@qq.com
> Created Time: 2020年09月19日 星期六 18时22分50秒
************************************************************************/
#ifndef __LED_H
#define __LED_H
#define GPL2CON (*(volatile unsigned int *) 0x11000100)
#define GPL2DAT (*(volatile unsigned int *) 0x11000104)
#define GPK1CON (*(volatile unsigned int *) 0x11000060)
#define GPK1DAT (*(volatile unsigned int *) 0x11000064)
void led(void);
#endif
Led.c
/************************************************************************* > File Name: led.c > 作者:YJK > Mail: 745506980@qq.com > Created Time: 2020年09月19日 星期六 18时28分16秒 ************************************************************************/ #include"led.h" void desplay(void) { volatile int x = 0xFFFF; while (x--); } void led(void) { GPL2CON = 0x00000001; GPK1CON = 0x00000010; /*设置为输出模式*/ while(1) { GPL2DAT = 0x1; GPK1DAT = 0x2; desplay(); GPL2DAT = 0; GPK1DAT = 0; desplay(); } }
Main.c
/*************************************************************************
> File Name: main.c
> 作者:YJK
> Mail: 745506980@qq.com
> Created Time: 2020年09月21日 星期一 16时44分15秒
************************************************************************/
#include"led.h"
int main(int argc,char *argv[])
{
led();
return 0;
}
Makefile
###################################################################### # File Name: Makefile # 作者:YJK # mail: 745506980@qq.comc # Created Time: 2020年09月17日 星期四 14时23分10秒 ######################################################################### #define var 定义变量 #.c ---- .o ------ build(elf文件)------build.bin TARGET := led.bin BUILD := led ENV_ ?= SD#?=如果不指定 则按默认方式 COBJS += main.o#+= 累加 COBJS += led.o COBJS += start.o CROSS_COMPILE := arm-none-linux-gnueabi- #工具集 CC := $(CROSS_COMPILE)gcc LD := $(CROSS_COMPILE)ld#链接器 OBJCOPY := $(CROSS_COMPILE)objcopy#文件格式的转换工具 SDTOOLS := ./mk4412 #编译选项 CFLAGS += -Wall #编译时的选项 #CFLAGS += -I/usr/local/arm/opt/FriendlyARM/toolschain/4.4.3/include/ #查看启动方式 LDFLAGS += -Tmap.lds #LDFLAGS += $(call lmZ-option, --no-dynamic-linker) ifeq ($(ENV_),SD) LDFLAGS += -Ttext=0x0 else LDFLAGS += -Ttext=0x20000000 endif #Way 方法 all:$(TARGET) ifeq ($(ENV_), RAM) $(TARGET):$(BUILD) $(OBJCOPY) -O binary $^ $@ else $(TARGET):$(BUILD) $(OBJCOPY) -O binary $^ $@ $(SDTOOLS) $@ endif $(BUILD):$(COBJS) $(LD) $(LDFLAGS) $^ -o $@ ifeq ($(ENV_), RAM) %.o:%.c $(CC) -c $< -o $@ $(CFLAGS) %.o:%.S $(CC) -c $< -o $@ $(CFLAGS) else %.o:%.c $(CC) -c $< -o $@ $(CFLAGS) %.o:%.S $(CC) -c $< -o $@ $(CFLAGS) endif clean: rm $(BUILD) $(COBJS) $(TARGET) flash: dd if=/dev/zero of=/dev/sdb bs=512 seek=1 iflag=dsync oflag=dsync count=2048 dd if=./led.bin of=/dev/sdb bs=512 seek=1 iflag=dsync oflag=dsync install:
Mk4412.c 添加4K的检测位
/************************************************************************* > File Name: mk4412.c > 作者:YJK > Mail: 745506980@qq.com > Created Time: 2020年09月21日 星期一 09时24分15秒 ************************************************************************/ #include <stdio.h> #include <string.h> #include <stdlib.h> #define BUFFER_SIZE (8 * 1024) #define HEADER_SIZE (16) int main(int argc, char *argv[]) { FILE *fp; unsigned char buffer[BUFFER_SIZE]; unsigned char header[HEADER_SIZE]; unsigned int checksum, count; int i, len; if (argc != 2) { printf("Usage: mk4412 <file>\n"); return -1; } fp = fopen(argv[1], "r+b"); if (fp == NULL) { printf("Can not open file '%s'\n", argv[1]); return -1; } fseek(fp, 0L, SEEK_END); len = ftell(fp); count = (len < BUFFER_SIZE) ? len : BUFFER_SIZE; fseek(fp, 0L, SEEK_SET); memset(buffer, 0, sizeof(buffer)); if (fread(buffer, 1, count, fp) != count) { printf("Can't read %s\n", argv[1]); fclose(fp); return -1; } for (i = 16, checksum = 0; i < count; i++) { checksum += buffer[i] & 0xff; } memset(header, 0, sizeof(header)); header[3] = (0x1f >> 24) & 0xff; header[2] = (0x1f >> 16) & 0xff; header[1] = (0x1f >> 8) & 0xff; header[0] = (0x1f >> 0) & 0xff; header[7] = (checksum >> 24) & 0xff; header[6] = (checksum >> 16) & 0xff; header[5] = (checksum >> 8) & 0xff; header[4] = (checksum >> 0) & 0xff; header[0] ^= 0xbc; header[1] ^= 0xca; header[2] ^= 0xba; header[3] ^= 0xcb; header[4] ^= 0xcb; header[5] ^= 0xce; header[6] ^= 0xcd; header[7] ^= 0xdf; header[8] ^= 0xb7; header[9] ^= 0xba; header[10] ^= 0xbe; header[11] ^= 0xbb; header[12] ^= 0xba; header[13] ^= 0xad; header[14] ^= 0xdf; header[15] ^= 0xdf; for (i = 1; i < HEADER_SIZE; i++) { header[i] ^= header[i - 1]; } fseek(fp, 0L, SEEK_SET); if (fwrite(header, 1, sizeof(header), fp) != sizeof(header)) { printf("Write header error %s\n", argv[1]); fclose(fp); return -1; } fclose(fp); printf("The checksum is 0x%08x for %ld bytes [0x%lx ~ 0x%x]\n", checksum, (count - sizeof(header)), sizeof(header), (count - 1)); return 0; }
Map.lds 链接文件
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS { . = 0x0; . = ALIGN(4); .text : { start.o *(.text) } . = ALIGN(4); .rodata : { *(.rodata) } . = ALIGN(4); .data : { *(.data) } . = ALIGN(4); .bss : { *(.bss) } }
查看SD卡信息
执行make
执行makeflash
将SD卡插入卡槽
拨码设置为SD卡启动
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。