1. 设计思想

1.1 设置处理器模式

设置sp啥的汇编要先进入SVC模式,超级管理员特权模式,这样就可以访问所有寄存器了,需要用到cpsr寄存器

0到4位要设置svc模式10011 = 0x13, 就不能用ldr和str了因为不能操作这两个寄存器

1.2 设置sp指针

进入C语言之前要设置出栈和入栈。sp可以指向内部ram,也可以指向ddr。在6u启动的时候上一章讲的,其实ddr已经被初始化了,sp设置到哪里呢?要设置堆栈大小,0x200000 = 2M(随便设置)。

处理器栈增长方式:

对于A7而言是向下增长的,就是从高地址向低地址增长,512M DDR的地址是0x80000000-0x9FFFFFFF, 如果设置成8000000了就相当于0了!那样的话sp就是0x80200000

1.3 跳转到C语言

用b来跳转main函数

2.代码

start.s


.global _start _start:
/* 操作cpsr寄存器使其进入到超级管理员模式 */
mrs r0, cpsr
bic r0, r0, #0x1f @位消除,将后面5位设置为0
orr r0, r0, #0x13 @按位或,上面5位设置位0之后就可以赋值进入svc啦
@ mov r0 #0x13 这种赋值语句,看起来还可以,但是前面27位都为0啦,我们只关心后面5位
msr cpsr, r0 /* 设置栈指针 */
ldr sp,=0x80200000 /* 跳转C */
b main

main.h

#ifndef __MAIN_C
#define __MAIN_C /*
* CCM 相关寄存器地址
*/
#define CCM_CCGR0 *((volatile unsigned int *)0X020C4068)
#define CCM_CCGR1 *((volatile unsigned int *)0X020C406C)
#define CCM_CCGR2 *((volatile unsigned int *)0X020C4070)
#define CCM_CCGR3 *((volatile unsigned int *)0X020C4074)
#define CCM_CCGR4 *((volatile unsigned int *)0X020C4078)
#define CCM_CCGR5 *((volatile unsigned int *)0X020C407C)
#define CCM_CCGR6 *((volatile unsigned int *)0X020C4080) /*
* IOMUX 相关寄存器地址
*/
#define SW_MUX_GPIO1_IO03 *((volatile unsigned int *)0X020E0068)
#define SW_PAD_GPIO1_IO03 *((volatile unsigned int *)0X020E02F4)
/*
* GPIO1 相关寄存器地址
*/
#define GPIO1_DR *((volatile unsigned int *)0X0209C000)
#define GPIO1_GDIR *((volatile unsigned int *)0X0209C004)
#define GPIO1_PSR *((volatile unsigned int *)0X0209C008)
#define GPIO1_ICR1 *((volatile unsigned int *)0X0209C00C)
#define GPIO1_ICR2 *((volatile unsigned int *)0X0209C010)
#define GPIO1_IMR *((volatile unsigned int *)0X0209C014)
#define GPIO1_ISR *((volatile unsigned int *)0X0209C018)
#define GPIO1_EDGE_SEL *((volatile unsigned int *)0X0209C01C) #endif // !__MAIN_C

main.c

#include "main.h"

void clock_enable()
{
CCM_CCGR0 = 0xFFFFFFFF;
CCM_CCGR1 = 0xFFFFFFFF;
CCM_CCGR2 = 0xFFFFFFFF;
CCM_CCGR3 = 0xFFFFFFFF;
CCM_CCGR4 = 0xFFFFFFFF;
CCM_CCGR5 = 0xFFFFFFFF;
CCM_CCGR6 = 0xFFFFFFFF;
} void led_init()
{
SW_MUX_GPIO1_IO03 = 0x5;
SW_PAD_GPIO1_IO03 = 0x10b0; GPIO1_GDIR = 0x8;
GPIO1_DR = 0xfffffff7;
} /*
* 将 GPIO1_DR 的 bit3 清零
*/
void led_on(void)
{
GPIO1_DR &= ~(1<<3);
} /*
* @description : 关闭 LED 灯
* @param : 无
* @return : 无
*/
void led_off(void)
{
/*
* 将 GPIO1_DR 的 bit3 置 1
*/
GPIO1_DR |= (1<<3);
} void delay_short(volatile unsigned int n)
{
while(n--);
} void delay(volatile unsigned int n)
{
while (n--)
{
/* code */
delay_short(0x7ff);
}
} void main()
{
clock_enable();
led_init();
while (1)
{
/* code */
led_on();
delay(500); led_off();
delay(500);
}
}

Makefile

objs := start.o main.o # 文件定义

# $^表示所有依赖文件的集合
# $@表示所有生成目标文件
ledc.bin : $(objs) arm-linux-gnueabihf-ld -Ttext 0x87800000 -o ledc.elf $^
arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@
arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis # $< 表示依赖文件的第一个目标,为啥不用$^?
# 因为比如是main.o main.c,usart.c,main对应的第一个文件没错
# $^是所有的该出错啦
%.o : %.c
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
%.o : %.S
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
%.o : %.s
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $< clean:
rm -rf *.o *.elf *.dis *.bin

链接脚本

SECTIONS
{
. = 0X87800000;
.text :
{
start.o
*(.text)
}
.rodata ALIGN(4) : {*(.rodata*)}
.data ALIGN(4) : { *(.data) }
__bss_start = .;
.bss ALIGN(4) : { *(.bss) *(COMMON) }
__bss_end = .;
}
  • 其中.是一个定位计时器,默认是0,如果赋值了,就说明程序在这地方定位了。所以是87800000
  • text段,调用C函数之前肯定要先汇编,所以先汇编,然后所有文件的text段都放在text段中
  • 同理rodata(只读)和data段都放在相应的段里,4字节对齐。但是假如我想把它们放在别的地方 ,需要再用 .= 指定一段内存
  • bss段,没有初始化的变量,初始化为0保存在bss段内,没有初始化的在COMMON
  • bss_start和end直接赋值为0,就是没有被初始化的,手动清0,直接把内存赋值为0

C语言下的Led灯的更多相关文章

  1. 让USB键盘的LED灯听你的!(不干扰使用)

    最近在研究一个课题,如何能利用键盘的led灯通道进行有效通信,那么首先要做的就是尝试能否在不影响键盘的情况下控制LED灯(num lock ,caps lock ,scroll lock)的使用. 首 ...

  2. C语言版——点亮LED灯,深入到栈

    在上一篇进行了汇编语言的编写之后,我们采用C语言来编写程序,毕竟C语言才是我们使用最多的语言. 仅仅是点亮LED灯显然太过于简单,我们需要分析最后的反汇编,了解函数调用栈,深入C语言骨髓去分析代码,并 ...

  3. Linux下实现流水灯等功能的LED驱动代码及测试实例

    驱动代码: #include <linux/errno.h> #include <linux/kernel.h> #include <linux/module.h> ...

  4. STM32 用c语言控制4个LED灯从左向右无限流动

    在用c语言写LED流水灯的前提条件是配置好其他环境,这里我就不说环境了, 想让LED灯无限循环时,首先要想到的是无限循环函数,我这里利用的是for函数 无限循环. #include "stm ...

  5. 嵌入式Linux学习入门:控制LED灯

    记录自己linux学习过程,让自己能够一直坚持下去 1.原理图分析: nLED_1, nLED_2, nLED_4, 给低电平则对应LED灯亮,高电平则对应LED灯灭, S3C2440芯片GPF4-G ...

  6. Beaglebone Black–GPIO 高低电平控制 LED 灯

    上一篇,运用 Linux 的 sysfs,控制本机上的 LED 灯,usr0 至 usr3,这次用 GPIO 控制外部的电路,点亮 LED 灯. 这次的全部材料: BBB 一台 购买 BBB 自带的 ...

  7. Tiny4412之蜂鸣器驱动与led灯驱动

    一:LED驱动编写 要编写LED驱动,首先的知道开发板的构造:开发板分为核心板与底板:编写驱动的第一步就是要看开发板,找到LED灯在开发板上的位置及所对应的名字:第一步就要查看核心板电路图,以及底板电 ...

  8. 51单片机学习笔记(郭天祥版)(1)——单片机基础和点亮LED灯

    关于单片机型号的介绍: STC89C52RC40C-PDIP 0721CV4336..... STC:STC公司 89:89系列 C:COMS 52(还有51,54,55,58,516,):2表示存储 ...

  9. 第7章 使用寄存器点亮LED灯

    第7章     使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...

随机推荐

  1. 洛谷3783 SDOI2017 天才黑客(最短路+虚树+边转点+线段树优化建图)

    成功又一次自闭了 怕不是猪国杀之后最自闭的一次 一看到最短路径. 我们就能推测这应该是个最短路题 现在考虑怎么建图 根据题目的意思,我们可以发现,在本题中,边与边之间存在一些转换关系,但是点与点之间并 ...

  2. 洛谷3233 HNOI2014(虚树+dp)

    膜拜一发\(mts\_246,forever\_shi\) 这两位爷是真的无敌! 首先来看这个题,一看题目的数据范围和"关键点"字眼,我们就能得知这是一道虚树题 那就先一如既往的建 ...

  3. python中的 * 和 ** 作用含义

    python中的 * 和 ** ,能够让函数支持任意数量的参数,它们在函数定义和调用中,有着不同的目的 一. 打包参数 * 的作用:在函数定义中,收集所有位置参数到一个新的元组,并将整个元组赋值给变量 ...

  4. Kubernetes List-Watch 机制原理与实现 - chunked

    概述http chunkedwatch api 概述 Kubernetes 中主要通过 List-Watch 机制实现组件间的异步消息通信,List-Watch 机制的实现原理值得深入分析下 . 在 ...

  5. Python 做简单的登录系统

    案例 之 登录系统原创作品1 该随笔 仅插入部分代码:全部py文件源代码请从百度网盘自行下载! 链接:https://pan.baidu.com/s/1_sTcDvs5XEGDcnpoQEIrMg 提 ...

  6. 【数据结构与算法Python版学习笔记】图——基本概念及相关术语

    概念 图Graph是比树更为一般的结构, 也是由节点和边构成 实际上树是一种具有特殊性质的图 图可以用来表示现实世界中很多有意思的事物,包括道路系统.城市之间的航班.互联网的连接,甚至是计算机专业的一 ...

  7. Coursera Deep Learning笔记 卷积神经网络基础

    参考1 参考2 1. 计算机视觉 使用传统神经网络处理机器视觉的一个主要问题是输入层维度很大.例如一张64x64x3的图片,神经网络输入层的维度为12288. 如果图片尺寸较大,例如一张1000x10 ...

  8. 【二食堂】Beta - Scrum Meeting 11

    Scrum Meeting 11 例会时间:5.26 18:30~18:50 进度情况 组员 当前进度 今日任务 李健 1. 文本导入.保存部分的工作比想象中的难,还需要一些时间完成issue 1. ...

  9. [暴力题解&&考试反思] 双十一欢乐赛(联赛膜你测试32)

    前言: 今天考试很迷糊.从7点考到11点半,我大概从7点睡到9点.隐隐约约看到旁边的狗哥敲了好几个题,我才开始写代码.然后因为还是很困,而且T1迷迷糊糊调了好长时间,T3T4的暴力就懒的写了... 估 ...

  10. 零基础学习STM32之入门学习路线

    可以说就目前的市场需求来看,stm32在单片机领域已经拥有了绝对的地位,51什么的已经过时了也只能拿来打基础了,最后依然会转到stm32来,也正是因为这样stm32的学习者越来越多,其中不难发现绝大部 ...