当前位置:   article > 正文

iTop4412裸机点灯_gpk1con为什么要用【7:4】位

gpk1con为什么要用【7:4】位

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
  • 1
  • 2
  • 3
  • 4
  • 5

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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();
		}	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94

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)
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

查看SD卡信息

在这里插入图片描述

执行make
在这里插入图片描述

执行makeflash
在这里插入图片描述

将SD卡插入卡槽
拨码设置为SD卡启动

在这里插入图片描述

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号