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()是设置电气特性的,最后一个参数是设置电气属性

相关推荐
GHL28427109019 小时前
unreferenced formal parameter 解决办法学习
学习
openKylin19 小时前
与全球技术演进同频,openKylin 3.0从C迈向Rust
c语言·开发语言·rust·开源·开放原子·openkylin
迷茫、Peanut20 小时前
C语言sizeof和strlen
c语言
fanchenxinok20 小时前
学习笔记:LabVIEW调用DLL解析S19文件教程
笔记·学习·labview·dll解析
芷栀夏21 小时前
Java教育平台实战复盘:课程、考试与学习行为分析系统设计
java·开发语言·学习
从零开始的代码生活_21 小时前
C++ 多态详解:虚函数、动态绑定、抽象类与虚表原理
开发语言·c++·后端·学习·算法
Dlrb12111 天前
ARM架构---Cortex系列寄存器,重要内部模块,工作模式,异常处理等
arm开发·arm·指令集·arm工作模式·soc片上系统·ram与rom
执笔论英雄1 天前
【大模型推理 】 vllm kvconnet 学习
学习·vllm
·醉挽清风·1 天前
学习笔记—算法—算法题
笔记·学习·算法
Bug退散师1 天前
多路IO复用[select版TCP服务器与poll版TCP服务器]与常用网络编程函数详解
linux·服务器·c语言·网络·驱动开发·tcp/ip