LV.12 D13 C工程与寄存器封装 学习笔记

一、C语言工程简介

把模板在linux解压出来

代码写在interface.c就可以了。

map.lds是链接脚本文件(负责代码的排布)

include中是头文件,src中是写好的源代码 

start.s是启动代码,在interface.c之前运行,把cpu和栈做一个初始化

二、启动代码分析

.text
.global _start
_start:/** Vector table  * 异常向量表(占32个字节)*/ b resetb .b .b .b .b .b .b .reset:/** Set vector address in CP15 VBAR register*/ ldr	r0, =_start                @把异常向量表的值给r0mcr	p15, 0, r0, c12, c0, 0	   @Set VBAR (把r0寄存器的值放到p15协处理器中的c12寄存器)/** Set the cpu to SVC32 mode, Disable FIQ/IRQ* 把cpu模式改成SVC模式,改成ARM状态,关闭FIQ/IRQ中断*/  mrs r0, cpsrbic r0, r0, #0x1forr	r0, r0, #0xd3msr	cpsr ,r0/** Defines access permissions for each coprocessor*/  mov	r0, #0xfffffffmcr	p15, 0, r0, c1, c0, 2  	/** Invalidate L1 I/D                                                                                                                   */mov	r0, #0					@Set up for MCRmcr	p15, 0, r0, c8, c7, 0	@Invalidate TLBsmcr	p15, 0, r0, c7, c5, 0	@Invalidate icache/** Set the FPEXC EN bit to enable the FPU*/ mov r3, #0x40000000fmxr FPEXC, r3/** Disable MMU stuff and caches* MMU:负责物理地址和虚拟地址间的转换*/mrc	p15, 0, r0, c1, c0, 0bic	r0, r0, #0x00002000		@Clear bits 13 (--V-)bic	r0, r0, #0x00000007		@Clear bits 2:0 (-CAM)orr	r0, r0, #0x00001000		@Set bit 12 (---I) Icacheorr	r0, r0, #0x00000002		@Set bit 1 (--A-) Alignorr	r0, r0, #0x00000800		@Set bit 11 (Z---) BTBmcr	p15, 0, r0, c1, c0, 0/** Initialize stacks      * 初始化栈                                                                                                            */
init_stack:     /*svc mode stack*/msr cpsr, #0xd3            @把cpu的模式改为svc模式ldr sp, _stack_svc_end     @把svc模式下的栈的最高地址给了svc模式下的sp/*undef mode stack*/msr cpsr, #0xdb     ldr sp, _stack_und_end/*abort mode stack*/	msr cpsr,#0xd7ldr sp,_stack_abt_end/*irq mode stack*/	msr cpsr,#0xd2ldr sp, _stack_irq_end/*fiq mode stack*/msr cpsr,#0xd1ldr sp, _stack_fiq_end/*user mode stack, enable FIQ/IRQ*//*把cpu的模式改为user模式,并打开FIO/IRQ中断msr cpsr,#0x10ldr sp, _stack_usr_end/*Call main*/b main/** 把各个栈最高的地址算出来,作为起始地址*/
_stack_svc_end:      .word stack_svc + 512
_stack_und_end:      .word stack_und + 512
_stack_abt_end:      .word stack_abt + 512
_stack_irq_end:      .word stack_irq + 512
_stack_fiq_end:.word stack_fiq + 512
_stack_usr_end:      .word stack_usr + 512/** 给各个模式都申请了512个字节空间,作为栈*/
.data
stack_svc:      .space 512    
stack_und:.space 512
stack_abt:      .space 512
stack_irq:      .space 512
stack_fiq:      .space 512
stack_usr:      .space 512

三、C语言实现LED实验

/** 一、汇编语言访问存储器* 	1.读存储器* 		LDR R1, [R2]* 	2.写存储器* 		STR R1, [R2]** 二、C语言访问存储器* 	1.读存储器* 		data = *ADDR* 	2.写存储器* 		*ADDR = data* */void Delay(unsigned int Time)
{while(Time--);
}int main()
{/*通过设置GPX2CON寄存器来将GPX2_7引脚设置成输出功能*/*(unsigned int *)0x11000c40 = 0x10000000;while(1){/*点亮LED2*/*(unsigned int *)0x11000c44 = 0x00000080;/*延时*/Delay(1000000);/*熄灭LED2*/*(unsigned int *)0x11000c44 = 0x00000000;/*延时*/Delay(1000000);}return 0;
}

 

四、寄存器的封装方式

 1、把单个的寄存器封装成一个宏

#define GPX2CON (*(unsigned int *)0x11000c40)
#define GPX2DAT (*(unsigned int *)0x11000c44)int main()
{GPX2CON = 0x10000000;while(1){/*点亮LED2*/GPX2DAT = 0x00000080;/*延时*/Delay(1000000);/*熄灭LED2*/GPX2DAT = 0x00000000;/*延时*/Delay(1000000);}return 0;
}

2、把相关的几个寄存器封装成一个结构体,其地址空间必须是连续的

typedef struct
{unsigned int CON;unsigned int DAT;unsigned int PUD;unsigned int DRV;
}gpx2;#define GPX2 (*(gpx2 *)0x11000c40)int main()
{GPX2.CON = 0x10000000;while(1){/*点亮LED2*/GPX2.DAT = 0x00000080;/*延时*/Delay(1000000);/*熄灭LED2*/GPX2.DAT = 0x00000000;/*延时*/Delay(1000000);}return 0;
}

 

3、把整个芯片里的寄存器封装好,引用头文件

#include "exynos_4412.h"int main()
{GPX2.CON = 0x10000000;while(1){/*点亮LED2*/GPX2.DAT = 0x00000080;/*延时*/Delay(1000000);/*熄灭LED2*/GPX2.DAT = 0x00000000;/*延时*/Delay(1000000);}return 0;
}

五、寄存器操作的标准化

 只改寄存器的某几位,其他位保持不变

#include "exynos_4412.h"int main()
{GPX2.CON = GPX2.CON & (~(0xF << 28)) | (0x1 << 28);while(1){/*点亮LED2*/GPX2.DAT = GPX2.DAT | (1 << 7);/*延时*/Delay(1000000);/*熄灭LED2*/GPX2.DAT = GPX2.DAT & (~(1 << 7));/*延时*/Delay(1000000);}return 0;
}/** 1.unsigned int a; 将a的第3位置1,其他位保持不变* 	******** ******** ******** ********* 	******** ******** ******** ****1**** 	00000000 00000000 00000000 00001000** 	a = a | (1 << 3);** 2.unsigned int a; 将a的第3位置0,其他位保持不变* 	******** ******** ******** ********* 	******** ******** ******** ****0**** 	11111111 11111111 11111111 11110111** 	a = a & (~(1 << 3));** 	3.unsigned int a; 将a的第[7:4]位置为0101,其他位保持不变* 	******** ******** ******** ********* 	******** ******** ******** 0101****** 	1).先清零* 	11111111 11111111 11111111 00001111* 	00000000 00000000 00000000 11110000*  00000000 00000000 00000000 00001111** 	a = a & (~(0xF << 4));** 	2).再置位* 	00000000 00000000 00000000 01010000* 	00000000 00000000 00000000 00000101** 	a = a | (0x5 << 4);** 	=> a = a & (~(0xF << 4)) | (0x5 << 4);*/

我没并不只能控制LED,一切可以通过高低电频控制的东西,都可以通过GPIO来控制。

 

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

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

相关文章

mac vscode 使用 clangd

C 的智能提示 IntelliSense 非常不准&#xff0c;我们可以使用 clangd clangd 缺点就是配置繁琐&#xff0c;优点就是跳转和提示代码精准 开启 clangd 之后会提示你关闭 IntelliSense 1、安装插件 clangd 搜索第一个下载多的就是 2、配置 clangd 可执行程序路径 clangd 插…

【数据结构】面试OJ题——时间复杂度2

目录 一&#xff1a;移除元素 思路&#xff1a; 二&#xff1a;删除有序数组中的重复项 思路&#xff1a; 三&#xff1a;合并两个有序数组 思路1&#xff1a; 什么&#xff1f;你不知道qsort&#xff08;&#xff09; 思路2&#xff1a; 一&#xff1a;移除元素 27. 移…

L2-1 插松枝

L2-1 插松枝 分数 25 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上&#xff0c;做成大大小小的松枝。他们的工作流程&#xff08;并不&#xff09;是这样的&#xff1a; 每人手边有一只小盒子&#xff0c;初始…

IDEA 2023.2.2 使用 Scala 编译报错 No scalac found to compile scala sources

一、问题 scala: No scalac found to compile scala sources 官网 Bug 链接 二、临时解决方案 Incrementality Type 先变成 IDEA 类型 Please go to Settings > Build, Execution, Deployment > Compiler > Scala Compiler and change the Incrementality type to …

如何使用批量重命名的方法替换重复文件名内容

在文件管理过程中&#xff0c;我们有时会遇到文件名中包含相同部分内容的情况&#xff0c;这不仅会使文件显得混乱&#xff0c;而且还会给文件检索和使用带来不便。为了解决这个问题&#xff0c;我们可以使用云炫文件管理器批量重命名进行批量替换。下面是如何使用这种方法进行…

机器学习---使用 TensorFlow 构建神经网络模型预测波士顿房价和鸢尾花数据集分类

1. 预测波士顿房价 1.1 导包 from __future__ import absolute_import from __future__ import division from __future__ import print_functionimport itertoolsimport pandas as pd import tensorflow as tftf.logging.set_verbosity(tf.logging.INFO) 最后一行设置了Ten…

面试测试工程师一般问什么问题?

面试和项目一起&#xff0c;是自学路上的两大拦路虎。面试测试工程师一般会被问什么问题&#xff0c;总结下来一般是下面这4类&#xff1a; 1.做好自我介绍 2.项目相关问题 3.技术相关问题 4.人事相关问题 接下来&#xff0c;主要从以上四个方向分别展开介绍。为了让大家更有获…

[双指针](一) Leetcode 283.移动零和1089.复写零

[双指针] Leetcode 283.移动零和1089.复写零 移动零 283. 移动零 1.题意分析 (1) 给你一个数组&#xff0c;将数组中的所有0移动到数组的末尾 (2) 保证非0元素在数组中相对位置不变 (3) 在原数组中操作 2.解题思路 由于题目要求我们移动数组内容&#xff08;也就是交换两…

离线语音通断器开发-稳定之后顺应新需求

使用云知声的US516p6方案开发了一系列的离线语音通断器&#xff0c;目前已经取得了不小的收获&#xff0c;有1路的&#xff0c;3路的&#xff0c;4路的&#xff0c;唛头和扬声器包括唛头线材也在不断的更新打磨中找到了效果特别好的供应商。 离线语音通断器&#xff0c;家用控…

Beyond Compare比较规则设置 Beyond Compare怎么对比表格

在对文件进行比较时&#xff0c;文件夹内的文件可能存在不同类型、不同后缀名、不同内容等差异&#xff0c;这些差异会影响具体的比较结果&#xff0c;因此需要我们对软件的比较规则进行一些设置。接下来就让我们一起来学习一下Beyond Compare比较规则设置&#xff0c;Beyond C…

重构之美:Java Swing中 如何对指定行文本进行CSS样式渲染,三种实现思路分享

文章目录 需求分析Document 应用彩蛋 需求分析 在Swing中&#xff0c;如果期望实现对JTextArea 或者 TextPane等文本区域实现单行渲染改怎么做&#xff1f;如上图所示 总的来说有两种实现方案 文本行数可控&#xff0c;那么构造一组JLabel集合按表单顺序添加&#xff0c;这样可…

松下A6B伺服 马达不动问题解决

本人在用信捷XDH plc ethercat总线&#xff0c;连松下A6B伺服&#xff0c;轴配置完成轴调试时&#xff0c;出现能使能&#xff0c;但 马达不动的情况。 开始总怀疑时信捷PLC的原因&#xff0c;后面查明是输入口定义引起的。 用USB线连接伺服&#xff0c;打开PANAPARM软件,自…

在Mac上安装MongoDB 5.0

MongoDB 5.0安装 1、环境描述 操作系统&#xff1a;macOS 14.0 (23A344) 2、安装MongoDB 2.1、tar解压包安装 下载地址&#xff1a;Download MongoDB Community Server | MongoDB 创建一个目录&#xff0c;以便数据库将文件放入其中。&#xff08;默认情况下&#xff0c;数据…

linux--

一、crond 任务调度 1、原理示意图 2、crontab 进行定时任务的设置 2.1. 概述 任务调度&#xff0c;是指系统在某个时间执行的特定的命令或程序。任务调度分类&#xff1a; 系统工作: 有些重要的工作必须周而复始地执行。如病毒扫描等 个别用户工作:个别用户可能希望执行某些…

深度学习:张量 介绍

张量[1]是向量和矩阵到 n 维的推广。了解它们如何相互作用是机器学习的基础。 简介 虽然张量看起来是复杂的对象&#xff0c;但它们可以理解为向量和矩阵的集合。理解向量和矩阵对于理解张量至关重要。 向量是元素的一维列表&#xff1a; 矩阵是向量的二维列表&#xff1a; 下标…

Ajax学习笔记第三天

做决定之前仔细考虑&#xff0c;一旦作了决定就要勇往直前、坚持到底&#xff01; 【1 ikunGG邮箱注册】 整个流程展示&#xff1a; 1.文件目录 2.页面效果展示及代码 mysql数据库中的初始表 2.1 主页 09.html:里面代码部分解释 display: inline-block; 让块元素h1变成行内…

OpenCV C++ 图像处理实战 ——《缺陷检测》

OpenCV C++ 图像处理实战 ——《缺陷检测》 一、结果演示二、缺陷检测算法2.1、多元模板图像2.2、训练差异模型三、图像配准3.1 功能源码3.1 功能效果四、多元模板图像4.1 功能源码五、缺陷检测5.1 功能源码六、源码测试图像下载总结一、结果演示

pytorch笔记:TRIPLETMARGINLOSS

1 介绍 创建一个衡量三元组损失的标准&#xff0c;给定输入张量 x1​、x2​ 和 x3​ 以及一个大于0的间距值。这用于测量样本之间的相对相似性。一个三元组由a、p和n组成&#xff08;锚点、正例和负例&#xff09;。所有输入张量的形状都应为 (N,D) 2 基本使用方法 torch.nn.…

AD9371 官方例程HDL详解之JESD204B RX侧格式配置

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 采样率和各个时钟之间的关系 &#xff1a; AD9371 官方例程HDL详解之JESD204B TX侧时钟生成 &#xff08;三&#xff09; 参考资料&#xff1a; UltraScale Architecture G…

【AD9361 数字接口CMOS LVDSSPI】D 串行数据之SPI

【AD9361 数字接口CMOS &LVDS&SPI】D部分 接续 【AD9361 数字接口CMOS &LVDS&SPI】A 并行数据之CMOS 串行外设接口&#xff08;SPI&#xff09; SPI总线为AD9361的所有数字控制提供机制。每个SPI寄存器的宽度为8位&#xff0c;每个寄存器包含控制位、状态监视…