【ARM 裸机】C 语言 led 驱动

前面刚学习了汇编 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 到 r0bic 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_IO03SW_PAD_GPIO1_IO03 = 0x10b0;   // 配置电气属性// GPIO 初始化GPIO1_GDIR = 0x8;   // 设置为输出GPIO1_DR = 0x0;   // 打开 led
}
// 短延时
void delay_short(volatile unsigned int n)
{while(n--){}
}
// 长延时,在 396MHz 下一次循环大概 1 ms
void delay_ms(volatile unsigned int n)
{while(n--){delay_short(0x7ff);}
}   
// 打开 led
void led_on(void)
{GPIO1_DR &= ~(1<<3);   // bit3 清零
}
// 关闭 led
void led_off(void)
{GPIO1_DR |= (1<<3);   // bit3 置1
}
int main(void)
{clk_enable();led_init();// led 闪烁while (1){led_on();delay_ms(500);led_off();delay_ms(500);}return 0; 
}

main.h

#ifndef __MAIN_H
#define __MAIN_H// 定义要使用的寄存器// 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)#endif

Makefile

objs = main.o start.oledc.bin: $(objs)arm-linux-gnueabihf-ld -Ttext 0x87800000 start.o main.o -o ledc.elfarm-linux-gnueabihf-objcopy -O binary -S ledc.elf ledc.binarm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis%.o: %.carm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<%.o: %.sarm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<clean:rm -rf *.o ledc.bin ledc.elf ledc.dis

3、烧写验证

在这里插入图片描述

I.MX6ULL_MINI_ledc


演示视频中 led 每隔 500 ms 闪烁;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/1991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中String为什么不可变,这样有什么好处

简介 在Java中&#xff0c;字符串&#xff08;String&#xff09;是不可变的&#xff0c;这意味着一旦创建了一个字符串对象&#xff0c;它的内容就不能再被修改。这个设计决策是由Java的创始人詹姆斯高斯林&#xff08;James Gosling&#xff09;做出的&#xff0c;主要是出于…

Docker 的基本管理

一. 云的相关知识 1. 关于云 云端服务器都有哪些提供商&#xff1a; 国内&#xff1a; 阿里云&#xff08;Alibaba Cloud&#xff09;&#xff1a; 提供ECS&#xff08;Elastic Compute Service&#xff09;弹性计算服务&#xff0c;包括通用型、计算型、内存型等多种实例…

模拟电子技术实验(九)

单选题 1. 设计性实验完整准确的定义是什么&#xff1f; A. 设计性实验是根据电路结构和元件参数测试验证系统参数。 B. 设计性实验是根据系统参数确定电路结构和元件参数。 C. 设计性实验是根据系统参数 、电路原理和验证积累确定符合系统参数的 电路结构和元件参数。 D. …

根据图片模板动态生成图片(Java)

根据图片模板生成图片 背景流程简介代码实现 背景 根据提供的证书模板生成对应证书&#xff0c;证书内容有&#xff0c;姓名&#xff0c;身份证号&#xff0c;证书名称&#xff0c;证书编号&#xff0c;发证日期 根据用户达成的条件自动生成证书图片。 证书模板如下&#xff…

【51单片机项目】基于51单片机自制多功能小键盘/模拟USB键盘【附源码】(STC89C52RC+CH9328)

目录 一、效果展示 二、创作灵感 三、硬件电路 注意事项 工作原理 四、源码 main.c 五、附录 CH9328工作原理 CH9328的模式选择 ​编辑 全键盘键码值表 参考链接 一、效果展示 该小键盘具有三种功能&#xff1a; 1、自动输入开机密码 2、每隔一段时间自动按下ct…

Docker容器使用

文章目录 Docker 客户端容器相关命令获取镜像启动容器启动已停止运行的容器后台运行停止一个容器进入容器attach 命令exec 命令 导出和导入容器导出容器导入容器快照 删除容器web应用例子运行一个 web 应用查看 WEB 应用容器查看 WEB 应用程序日志查看WEB应用程序容器的进程检查…

MongoDB 与MySQL的区别?优势?

MongoDB 与 MySQL 是两种不同类型的数据库管理系统&#xff0c;它们各自有独特的数据模型、查询语言、扩展方式以及适用场景。以下是它们的主要区别与各自的优势&#xff1a; 区别&#xff1a; 数据模型&#xff1a; MySQL&#xff1a;基于关系模型&#xff0c;使用表格&#…

多模态大模型训练数据量以及训练方式

多模态大模型系列&#xff1a;LLaVALLaVA1.5/1.6LLaVA-Med - 知乎就在前两天LLaVA 1.6发布了&#xff0c;带来了更大的分辨率&#xff0c;更强的LLM&#xff0c;在最后补充了这一部分的介绍。 LLaVA repo&#xff1a;https://github.com/haotian-liu/LLaVA/ LLaVA 1.0&#xff…

《C语言深度解剖》(9):深度剖析数据在内存中的存储

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多数据结构与算法点击专栏链接查看&am…

操作系统安全:Windows与Linux的安全标识符,身份鉴别和访问控制

「作者简介」&#xff1a;2022年北京冬奥会中国代表队&#xff0c;CSDN Top100&#xff0c;学习更多干货&#xff0c;请关注专栏《网络安全自学教程》 操作系统有4个安全目标&#xff0c;也就是说想要保证操作系统的安全&#xff0c;就必须实现这4个需求&#xff1a; 标识系统…

【Redis(9)】Spring Boot整合Redis,实现分布式锁,保证分布式系统中节点操作一致性

在上一篇系列文章中&#xff0c;咱们利用Redis解决了缓存穿透、缓存击穿、缓存雪崩等缓存问题&#xff0c;Redis除了解决缓存问题&#xff0c;还能干什么呢&#xff1f;这是今天咱们要接着探讨的问题。 在分布式系统中&#xff0c;为了保证在多个节点间操作的一致性&#xff0…

系统安全与应用(1)

目录 1、账号安全管理 &#xff08;1&#xff09;禁止程序用户登录 &#xff08;2&#xff09;锁定禁用长期不使用的用户 &#xff08;3&#xff09;删除无用的账号 &#xff08;4&#xff09;禁止账号和密码的修改 2、密码安全管理 设置密码有效期 1&#xff09;针对已…

Centos7 tcpdump -w 时遇到 Permission denied

一、问题 使用tcpdump抓包并写入文件时出现 Permission denied&#xff0c;权限不足。 [rootstorm03 tcpdumpTest]# tcpdump -i em4 udp and host 225.1.2.5 and port 10111 -G 60 -w %Y_%m%d_%H%M_%S.pcap tcpdump: listening on em4, link-type EN10MB (Ethernet), capture…

oracle之--动态sql(execute immediate ‘ ‘)

动态sql--execute immediate 原因&#xff1a;ddl语句&#xff0c;truncate语句 不能直接使用&#xff0c;需要封装起来 --动态sql--execute immediate 因为ddl&#xff0c;truncate 不能直接使用&#xff0c;需要封装起来 --1.TRUNCATE table declare BEGIN --truncate…

熵权法处理TIFF图像

一、熵权法 又称熵值法&#xff0c;是一种客观赋权法&#xff0c;根据各项指标观测值所提供的信息大小来确定指标权重&#xff0c;具体细节可以参阅Stata-熵值法&#xff08;熵权法&#xff09;计算实现。 二、原理 根据指标特性&#xff0c;可以用熵值判断某个指标的离散程…

40、排列数字

排列数字 题目描述 给定一个整数n&#xff0c;将数字1~n排成一排&#xff0c;将会有很多种排列方法。 现在&#xff0c;请你按照字典序将所有的排列方法输出。 输入格式 共一行&#xff0c;包含一个整数n。 输出格式 按字典序输出所有排列方案&#xff0c;每个方案占一行…

一句话或一张图讲清楚系列之——ISERDESE2的原理

主要参考&#xff1a; https://blog.csdn.net/weixin_50810761/article/details/137383681 xilinx原语详解及仿真——ISERDESE2 作者&#xff1a;电路_fpga https://blog.csdn.net/weixin_45372778/article/details/122036112 Xilinx ISERDESE2应用笔记及仿真实操 作者&#x…

K8S Prometheus Springboot Actuator ServiceMonitor配置

用于展示Springboot Actuator监控内容 引入Springboot相关的监控配置包 Springboot pom配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><depende…

前端CSS基础7(背景相关属性,鼠标相关属性)

前端CSS基础7&#xff08;元素的背景相关属性&#xff0c;鼠标相关属性&#xff09; CSS背景相关属性CSS鼠标相关属性 CSS背景相关属性 在 CSS 中&#xff0c;可以使用多种属性来设置元素的背景样式。以下是一些常用的 CSS 背景相关属性&#xff1a; background-color&#x…

K8s: Ingress对象, 创建Ingress控制器, 创建Ingress资源并暴露服务

Ingress对象 1 &#xff09;概述 Ingress 是对集群中服务的外部访问进行管理的 API 对象&#xff0c;典型的访问方式是 HTTPIngress-nginx 本质是网关&#xff0c;当你请求 abc.com/service/a, Ingress 就把对应的地址转发给你&#xff0c;底层运行了一个 nginx但 K8s 为什么不…