ARM嵌入式学习(九)--- C语言应用:点亮led

目录

一、代码部分:

注意:

二、makefile

注意:

三、SDK

1.led

2.beep

3.delay

4.main

5.makefile

6.整体框架

四.总结

1.包含头文件时要加路径

2.makefile文件的.o依赖的.c的路径要写出如:

3.这里用到的函数:


一、代码部分:

汇编(start.s):

复制代码
.global _start

_start:
    ldr pc, =_reset_handler
    ldr pc, =_software_handler
    ldr pc, =_undef_handler
    ldr pc, =_prefetch_abort_handler
    ldr pc, =_data_abort_handler
    nop
    ldr pc, =_irq_handler
    ldr pc, =_fiq_handler

_software_handler:
    b _software_handler

_undef_handler:
    b _undef_handler

_prefetch_abort_handler:
    b _prefetch_abort_handler

_data_abort_handler:
    b _data_abort_handler

_irq_handler:
    b _irq_handler

_fiq_handler:
    b _fiq_handler

_reset_handler:
    /*DDR    0x80000000 ~ 0xA0000000*/
    cpsid i             /*disable irq*/
    ldr sp, =0x81000000 /*init system mode  stack  16M   */
    cps #0x12           /*change to irq mode */
  
    ldr sp, =0x82000000 /*init irq mode stack  16M */

    cps #0x1f           /* change to system mode */
   

    ldr sp, =0x83000000 /*init irq mode stack  16M */
    cpsie i     /* enable  irq */
    bl main
 

code_end:
    b code_end

这里只写中断向量表部分,用C来写main函数实现我们的功能

main.c代码:

复制代码
#define IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 (*((volatile unsigned long *)0x20E0068U))
#define IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03 (*((volatile unsigned long *)0x20E02F4U))
#define GPIO1_DR (*((volatile unsigned long *)0x209C000U))
#define GPIO1_GDIR (*((volatile unsigned long *)0x209C004))


static void led_init(void)
{

  IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 &= ~(0x1f);
  IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 |= 0x05;

  IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03 |= 0x10b0;


  GPIO1_GDIR |= (1 << 3);
  GPIO1_DR |= (1 << 3);
}
static void led_on(void)
{
  GPIO1_DR &= ~(1 << 3);
}
static void led_off(void)
{
  GPIO1_DR |= (1 << 3);
}

static void led_delay(unsigned int num)
{
  while (num--)
  {
  }
}

int main(void)
{
  led_init();
  beep_init();
  while (1)
  {
    led_on();

    led_delay(0x80000);
    led_off();
    beep_off();
    led_delay(0x80000);
  }
  return 0;
}

注意:

汇编的代码中,切换工作模式后一定要初始化栈!!!

二、makefile

写个makefile链接一下即可:

复制代码
CC=arm-linux-gnueabihf-gcc
LD=arm-linux-gnueabihf-ld
OBJCOPY=arm-linux-gnueabihf-objcopy
OBJDUMP= arm-linux-gnueabihf-objdump
TARGET = start
OBJ = start.o main.o

$(TARGET).bin:$(OBJ)
	$(LD) -Ttext 0x87800000 $(OBJ) -o $(TARGET).elf
	$(OBJCOPY) -O binary -S -g $(TARGET).elf $@
	$(OBJDUMP) -D $(TARGET).elf > $(TARGET).dis


%.o:%.S
	$(CC) -c -g $^ -o $@

%.o:%.c
	$(CC) -c -g $^ -o $@

clean:
	rm $(TARGET).bin $(TARGET).elf $(TARGET).dis *.o

load:
	./imxdownload $(TARGET).bin /dev/sdb

注意:

1.Makefile的目标要用.o这一步(只编译不链接),用.c的话会重复很多编译过程

2.Makefile中的OBJ中,一定是start.o在前面,main.c在后面,因为程序运行时如果先链接的是main,会先执行main 的代码再执行start\

3.%.s中的%是通配符,是make自己的语法,*.o中的*是shell命令的通配符

三、SDK

用c语言实现LED后我们发现,还是像汇编一样要去找地址很麻烦,这里,我们使用别人写好的头文件,即SDK

SDK 是 Software Development Kit 的缩写,中文意思是 软件开发工具包。

一个典型的 SDK 通常包含以下内容:

  • 库文件:别人写好的、可以直接调用的功能代码(如"扫码功能"、"地图显示")。

  • 文档:教你怎么使用这些代码的说明书。

  • 代码示例:现成的演示程序。

  • 调试工具:用于排查问题的辅助工具。

这里我们再加一个beep的功能,看手册找到引脚然后直接调用SDK的库函数就行了

1.led

2.beep

3.delay

4.main

5.makefile

6.整体框架

四.总结

1.包含头文件时要加路径

2.makefile文件的.o依赖的.c的路径要写出如:

led.o:led/led.c

(CC) -c -g ^ -o $@

3.这里用到的函数:

IOMUXC_SetPinMux()是设置引脚功能的,最后一个参数是探针(手册上的SION位)

IOMUXC_SetPinConfig()是设置电气特性的,最后一个参数是设置电气属性

相关推荐
@小匠1 天前
Read Frog:一款开源的 AI 驱动浏览器语言学习扩展
人工智能·学习
.Ashy.1 天前
2026.4.11 蓝桥杯软件类C/C++ G组山东省赛 小记
c语言·c++·蓝桥杯
2401_892070981 天前
链栈(链式栈) 超详细实现(C 语言 + 逐行精讲)
c语言·数据结构·链栈
炽烈小老头1 天前
【 每天学习一点算法 2026/04/12】x 的平方根
学习·算法
阿杰学AI1 天前
AI核心知识115—大语言模型之 自监督学习(简洁且通俗易懂版)
人工智能·学习·ai·语言模型·aigc·监督学习·自监督学习
cmpxr_1 天前
【C】局部变量和全局变量及同名情况
c语言·开发语言
九英里路1 天前
OS学习之路——动静态库制作与原理
linux·学习·操作系统·unix·进程·编译·动静态库
red_redemption1 天前
自由学习记录(160)
学习
南無忘码至尊1 天前
Unity学习90天-第2天-认识Unity生命周期函数并用 Update 控制物体移动,FixedUpdate 控制物理
学习·unity·游戏引擎
报错小能手1 天前
ios开发方向——swift错误处理:do/try/catch、Result、throws
开发语言·学习·ios·swift