ARM裸机开发:C语言点亮LED

发布时间:2024-09-02  

一、硬件平台:

正点原子I.MX6U阿尔法开发板

_533488159_IMG_20210803_235508_1628006109000_xg_0

汇编驱动LED实验,我们将用到的寄存器进行封装,用宏定义替换,此处我直接使用正点原子的宏定义头文件:

20211027224418

先看一下开发板上LED的接口,GPIO1的3脚

20211028112915

然后我们编写 main.c 文件代码


先编写时钟使能代码


void CLK_ENA()


{


CCM_CCGR0 = 0xffffffff;


CCM_CCGR1 = 0xffffffff;


CCM_CCGR2 = 0xffffffff;


CCM_CCGR3 = 0xffffffff;


CCM_CCGR4 = 0xffffffff;


CCM_CCGR5 = 0xffffffff;


CCM_CCGR6 = 0xffffffff;


}

再编写 LED IO 口初始化代码


void led_init()

{

//设置寄存器 SW_MUX_GPIO1_IO03_BASE 的 MODE 为5

SW_MUX_GPIO1_IO03 = 0x5;

    //模式配置

    //bit 16:0 HYS关闭

    //bit [15:14]: 00 默认下拉

    //bit [13]: 0 kepper功能

    //bit [12]: 1 pull/keeper使能

    //bit [11]: 0 关闭开路输出

    //bit [7:6]: 10 速度100Mhz

    //bit [5:3]: 110 R0/6驱动能力

    //bit [0]: 0 低转换率

SW_PAD_GPIO1_IO03 = 0x10b0;

//设置GPIO为输出

GPIO1_GDIR = 0X0000008;

    //初始化输出为0

GPIO1_DR = 0x0;

}

在开头添加一个宏定义用于控制 GPIO1的3脚电平,设置电平使用: 或置位,与清零


#define LED_ON() (GPIO1_DR &= ~(1<<3))

#define LED_OFF() (GPIO1_DR |= (1<<3))

编写延时函数


void delay(volatile unsigned int n)

{

while(n--)

{

volatile unsigned int i = 0x7ff;

while(i--);

}

}

编写主函数,初始化外设后,延时点亮LED灯


int main(void)


{

CLK_ENA();

led_init();


while(1)


{

LED_OFF();

delay(1000);

LED_ON();

delay(1000);

}

return 0;

}

代码编写完成,需要编写编译链接 Makefile 脚本


# 定义目标变量

objs := start.o main.o

# 生成bin文件

ledc.bin: $(objs)

# 依次读取第一个依赖文件进行链接

arm-linux-gnueabihf-ld -Timx6ul.lds -o ledc.elf $^

# 链接文件转二进制

arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@

# 链接文件生成反汇编文件

arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis

#生成编译文件

%.o:%.s

arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<

%.o:%.S

arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<

%.o:%.c

arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<、

#清除编译文件

clean:

rm -rf *.o ledc.bin ledc.elf ledc.dis

$ 表示执行一个 Makefile 函数, $@ 依次取出目标文件用于执行,$< 依次取出依赖文件用于执行


% 表示变量成员通配符


在上面代码进行链接的时候,使用到了imux6ul.lds 链接文件,使链接器按照其规则进行链接,我们一般编译出来的代码 都包含在 text、data、bss 和 rodata 这四个段内,链接规则就是定义如何链接代码具体的位置


链接规则如下


# 关键字

SECTIONS{

# “.”在链接脚本里面叫做定位计数器,默认的定位计数器为 0,此处我们定义起始地址为 0X87800000

. = 0X87800000;

    # “.text”是代码段名,后面的冒号是语法要求

.text :

{

start.o 

main.o 

*(.text)

        # “*(.text)”中的“*”是通配符,表示所有输入文件的.text段都放到“.text”

}

# 只读数据段 (4字节对齐)

.rodata ALIGN(4) : {*(.rodata*)}     

# 数据段 (4字节对齐)

.data ALIGN(4)   : { *(.data) }   

    

    # .bss 段是定义了但是没有被初始化的变量,我们需要手动

    # 对.bss 段的变量清零的,因此我们需要知道 .bss 段的    

    # 起始和结束地址

__bss_start = .;    

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    以灌电流的方式接了一只LED,当按键按下时LED灯点亮,没按键时LED熄灭。 4中断的软件实现 单片机中断函数的写法比较固定,51单片机中断函数的写法如下: void Initd() interrupt......
    脚来单独控制每盏LED点亮与熄灭。另一方面,也对操作串行接口器件提供了很大的方便(典型如74HC165,CD4094)。位带操作使代码更简洁,这只是位带操作优越性的初等体现,位带......
    :   //缺省值,关闭所有LED P0=0xff; } } 分析:继续考查C语言 //实例19:用for语句控制蜂鸣器鸣笛次数 #include   //包含单片机寄存器的头文件 sbit......
    基于51单片机的红外检测光照检测智能台灯仿真设计;仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言C语言 设计编号:S0050 1.主要功能: 基于51单片机......
    脚来单独控制每盏LED点亮与熄灭。另一方面,也对操作串行接口器件提供了很大的方便(典型如74HC165,CD4094)。位带操作使代码更简洁,这只是位带操作优越性的初等体现,位带操作还有一个重要的好处是在务中,用于......
    将提供示例代码和文档的资料分享。 Part 1 点灯的思路讲解 本文中的点灯,是指用STM32单片机点亮与之连接的LED的操作。首先我们先了解一下LED这种器件。 LED的本质是一种发光二极管,所以......
    51单片机(入门保姆级教程)——LED闪烁及流水灯;一、LED基本原理和知识 图1 LED共阳极原理图 1.1 LED共阴极和共阳极的含义 LED的最小单元是发光二极管。发光......
    闪烁{if(k1 == 0){L1 = 0; //低电平有效,输入0led灯点亮}else{L1 = 1; //否则熄灭}}}如上就是我们的第一个任务,要用单片机点亮一只发光二极管LED,这个LED必须要和单片机......
    置位,主灯点亮,同时将PWR 和TXEN 置位,使得PTR 处于发送状态并给相邻灯发送信号,相邻灯接收到信号后主灯点亮,保证了行人通过此段路的照明,延时30 秒后主灯自动熄灭,达到......
    Keil软件中运行编译生成hex文件后,烧录到51单片机中,就能看到led点亮的现象。 对于初学者而言,在编写这个程序之前。首先我们得了解 led 的运行机制,现在市场中常出现的led灯为发光二级管,具有......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>