【ARM 裸机】C 语言 led 驱动

本文详细介绍了在C语言环境下,如何为IMX6ULL处理器构建运行环境,设置SVC模式、SP指针,以及编写并验证LED驱动程序,包括配置时钟、初始化GPIO、延时函数和使用Makefile及链接脚本进行编译和烧写过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面刚学习了汇编 led 驱动的编写和验证,现在开始就要进入 C 语言 led 驱动编写与验证了 !

1、C 语言运行环境构建

1.1、设置处理器模式

使 6ULL 处于 SVC 模式下,之前已经提到了处理器的九种模式,参考:【ARM 裸机】汇编 led 驱动之基本语法,如何设置成 SVC 模式,需要用到 CPSR 寄存器,CPSR 寄存器一共是 32 位,关注它的第 0~4 位,也就是设置为 M[4:0] 为 10011 = 0x13;
在这里插入图片描述
在这里插入图片描述
读写状态寄存器需要用到 MRS 和 MSR 指令,不能使用 LDR 和 STR 指令来对状态寄存器读写了;
在这里插入图片描述

1.2、设置 sp 指针

sp 指针可以指向内部 RAM,也可以指向 DDR,这里设置成指向 DDR,sp 设置到哪里?以正点原子开发板为例,512 MB 的范围是 0x80000000~0x9FFFFFFF,假定设置的栈的大小是 2 MB(0x20000),A7 的栈增长方式为向下增长,所以要设置成 sp 指针指向 0x80200000;

1.3、汇编跳转到 C 语言

使用 b 指令跳转到 C 语言的函数,比如 main 函数;

2、驱动编写

在 /home/zsw/linux/IMX6ULL/board_drivers 目录下新建一个 2_ledc 的目录,打开 VScode,在 VScode 中打开文件夹 2_ledc,然后将工作区另存为 ledc,然后新建文件 start.s、main.c、main.h、Makefile 这四个文件;
在这里插入图片描述
start.s

.global _start

_start:
    // 设置处理器为 SVC 模式
    mrs r0, cpsr        // 读取 cpsr 到 r0
    bic r0, r0, #0x1f   // r0 & ~0x1f 清除 cpsr 的 bit4~0    bic  位清除指令
    orr r0, r0, #0x13   // r0 | 0x13 设置成 SVC 模式      orr 按位或
    msr cpsr, r0        // 把 r0 写入 cpsr

    // 设置 sp 指针
    ldr sp, =0x80200000

    // 跳转到 c 语言
    b main  

main.c

#include "main.h"

// 使能外设时钟
void clk_enable(void)
{
   
    CCM_CCGR0 = 0xffffffff;
    CCM_CCGR1 = 0xffffffff;
    CCM_CCGR2 = 0xffffffff;
    CCM_CCGR3 = 0xffffffff;
    CCM_CCGR4 = 0xffffffff;
    CCM_CCGR5 = 0xffffffff;
    CCM_CCGR6 = 0xffffffff;
}
// 初始化 led
void led_init(void)
{
   
    SW_MUX_GPIO1_IO03 = 0x5;   // 复用为 GPIO1_IO03
    SW_PAD_GPIO1_IO03 = 0x10b0;   // 配置电气属性

    // GPIO 初始化
    GPIO1_GDIR = 0x8;   // 设置为输出
    GPIO1_DR = 0x0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值