ARM开发(四)新手小白如何阅读芯片手册,裸机驱动开发步骤以及纯汇编实现点灯,汇编结合c点灯,c实现点灯
一.如何阅读芯片手册(datasheet)
作为嵌入式学习者,如何去阅读芯片手册是重中之重。不管是什么芯片手册,在写的怎么天花乱坠,它的本质也就是使用说明书。
可是问题来了,它Y的是本英语的说明书,但是英语不好的友友们不要过于焦虑,我们现在有了很好的翻译软件,而且只要我们多读多看,在未来的一个时间点厚积薄发,阅读芯片手册对你来说再也不是问题。
下面我将以生动形象用一个三星的芯片手册结合如何进行简单驱动开发去带领大家一起读芯片手册,了解到它的功能强大之处。
二.裸机驱动开发步骤
1.当我们拿到一块板子,如果想要实现具体的功能,首先我们要想到的肯定是明白自己想要实现一个什么样的功能。(这里我就拿各位学生看到都烦的点灯来举例)
2.既然明白了我们的目标是点灯,那么我们接下来要做的就是找到板子上的小灯泡(发光二极管)
如图:
然后我们看到了led【2-5】一共四个小灯泡
找到小灯泡以及名字后也就正式开启了我们的点灯之路。
裸机驱动开发
(1)看电路图
--1.找到我要控制的设备(这里就拿小灯泡led2来举例)
打开我们的外设硬件说明书在搜索栏搜索led2
如图
从这张图我们了解到,这是一个npn三极管,基极连接着cpu的侧控制管脚CHG_COK,由cpu来进行模数转换控制高低电位,决定三极管的导通以及关断。这里我们忽略已经标好的GPX2_7。
(2)看芯片手册
搜索,电路图里对应的控制模块,然后如果有coreboard的话去那里找到对应的GPX2-7。
看模块的overview了解该模块的大概功能。
(3)看控制寄存器
如果寄存器比较多我们该怎么办?
看技术支持提供的例子程序,找到需要修改的寄存器(常常都只有几个)。
部分厂商会提供配置软件,通过界面去配置功能,我们只需要使用配置好的寄存器的值就可以了。
来到芯片手册,如图所示:
(4)编程
1.定义要控制的寄存器的宏(与手册里的寄存器地址对应起来)
2.设备初始化(如设置GPIO的输出状态) tips:GPIO就是与cpu相连的引脚
3.把功能分成最基本的小块,逐个实现,如:点亮灯——灭灯——加延时——闪烁——跑马灯
以下代码是在这个cpu以及开发板上实现的:
cpu:samsung Exynos
开发板: FS4412
三.纯汇编实现点灯
@ GPX2CON 寄存器地址: 0x11000000 + 0x0c40.textldr r0, =0x11000c40 @ 将GPX2CON寄存器地址搬移到 r0,那么r0 就代表 GPX2CONldr r1, [r0]bic r1, #0xf0000000 @ 将 28~31号比特位清零orr r1, #0x10000000 @ 28号比特位置位1,其他比特位不动,设置GPX2_7输出功能str r1, [r0]ldr r0, =0x114001e0 @ 将GPF3CON寄存器地址搬移到 r0 GPF3_4ldr r1, [r0] @ 将地址上的内容取 4字节,相当于取出GPF3CON寄存器的内容bic r1, #0xf0000orr r1, #0x10000str r1, [r0]while:ldr r2, =0x11000c44 @ 将GPX2DAT寄存器的地址搬移到 r2ldr r3, [r2]orr r3, #0x80 @ 将GPX2DAT的7号位置 1,亮灯str r3, [r2]ldr r2, =0x114001e4 @ 将GPF3DATldr r3, [r2]orr r3, #0x10 @ 将GPF3DAT的4号位置 1,亮灯str r3, [r2]bl delay_1sldr r2, =0x11000c44 @ 将GPX2DAT寄存器的地址搬移到 r2ldr r3, [r2]bic r3, #0x80str r3, [r2]ldr r2, =0x114001e4 @ 将GPF3DATldr r3, [r2]bic r3, #0x10 @ 将GPF3DAT的4号位置 0,灭灯str r3, [r2]bl delay_1sb while delay_1s:ldr r10, =0x4ffffff loop:cmp r10, #0subgt r10, #1bgt loopmov pc, lr.end
makefile
CROSS=arm-linux- CC=gcc LD=ld OC=objcopyall: $(CROSS)$(CC) -c start.s$(CROSS)$(LD) start.o -Ttext 40008000 -o start.elf$(CROSS)$(OC) -O binary -S start.elf start.binclean:rm *.o *.elf *.bin
四. 汇编结合c点灯
mian.c 实现延时
> Created Time: 2022年08月10日 星期三 15时43分06秒***********************************************************************/void delay() {int i, j;for(i = 0; i < 10000; i++)for(j = 0; j < 256; j++); }/*******************************end of file*****************************/
@ GPX2CON 寄存器地址: 0x11000000 + 0x0c40.textldr r0, =0x11000c40 @ 将GPX2CON寄存器地址搬移到 r0,那么r0 就代表 GPX2CONldr r1, [r0]bic r1, #0xf0000000 @ 将 28~31号比特位清零orr r1, #0x10000000 @ 28号比特位置位1,其他比特位不动,设置GPX2_7输出功能str r1, [r0]ldr r0, =0x114001e0 @ 将GPF3CON寄存器地址搬移到 r0 GPF3_4ldr r1, [r0] @ 将地址上的内容取 4字节,相当于取出GPF3CON寄存器的内容bic r1, #0xf0000orr r1, #0x10000str r1, [r0]while:ldr r2, =0x11000c44 @ 将GPX2DAT寄存器的地址搬移到 r2ldr r3, [r2]orr r3, #0x80 @ 将GPX2DAT的7号位置 1,亮灯str r3, [r2]ldr r2, =0x114001e4 @ 将GPF3DATldr r3, [r2]orr r3, #0x10 @ 将GPF3DAT的4号位置 1,亮灯str r3, [r2]bl delay @ 调用main.c中的delay函数,进行延时ldr r2, =0x11000c44 @ 将GPX2DAT寄存器的地址搬移到 r2ldr r3, [r2]bic r3, #0x80str r3, [r2]ldr r2, =0x114001e4 @ 将GPF3DATldr r3, [r2]bic r3, #0x10 @ 将GPF3DAT的4号位置 0,灭灯str r3, [r2]bl delay @ 调用main.c中的delay函数,进行延时b while.end
makefile
CROSS=arm-linux- CC=gcc LD=ld OC=objcopyall: $(CROSS)$(CC) -c start.s$(CROSS)$(CC) -c main.c$(CROSS)$(LD) start.o main.o -Ttext 40008000 -o start.elf$(CROSS)$(OC) -O binary -S start.elf start.binclean:rm *.o *.elf *.bin
五.c实现点灯,这种方法是我们用的最多的,也是最简便的
main.c
***********************************************************************/ void delay() {int i, j;for(i = 0; i < 10000; i++)for(j = 0; j < 256; j++); }#define GPX2CON *(volatile unsigned int *)0x11000c40 #define GPX2DAT *(volatile unsigned int *)0x11000c44void led2_init() {// GPX2CON = GPX2CON & 0x0fffffff | (1 << 28)GPX2CON = GPX2CON & (~(0xf << 28)) | ( 0x1 << 28 ); } void led2_on() {GPX2DAT = GPX2DAT | (1 << 7); } void led2_off() {GPX2DAT = GPX2DAT & (~(1 << 7)); } int main() {led2_init();while(1){led2_on();delay();led2_off();delay();} }/*******************************end of file*****************************/
.textb main.end
makefile
CROSS=arm-linux- CC=gcc LD=ld OC=objcopyall: $(CROSS)$(CC) -c start.s$(CROSS)$(CC) -c main.c$(CROSS)$(LD) start.o main.o -Ttext 40008000 -o start.elf$(CROSS)$(OC) -O binary -S start.elf start.binclean:rm *.o *.elf *.bin
六.纯汇编实现跑马灯
@ GPX2CON 寄存器地址: 0x11000000 + 0x0c40.textldr r0, =0x11000c40 @ 将GPX2CON寄存器地址搬移到 r0,那么r0 就代表 GPX2CONldr r1, [r0]bic r1, #0xf0000000 @ 将 28~31号比特位清零orr r1, #0x10000000 @ 28号比特位置位1,其他比特位不动,设置GPX2_7输出功能str r1, [r0]ldr r0,=0x11000c20ldr r1,[r0]bic r1,#0xforr r1,#0x1str r1,[r0]ldr r0, =0x114001e0 @ 将GPF3CON寄存器地址搬移到 r0 GPF3_4ldr r1, [r0] @ 将地址上的内容取 4字节,相当于取出GPF3CON寄存器的内容bic r1, #0xf0000orr r1, #0x10000str r1, [r0]ldr r0,=0x114001E0ldr r1,[r0]bic r1,#0xf00000orr r1,#0x100000str r1,[r0]while: @开灯led2ldr r2, =0x11000c44 @ 将GPX2DAT寄存器的地址搬移到 r2ldr r3, [r2]orr r3, #0x80 @ 将GPX2DAT的7号位置 1,亮灯str r3, [r2]bl delay_1s @开灯led3ldr r2,=0x11000c24ldr r3,[r2]orr r3,#0x1str r3,[r2]bl delay_1s@开灯led4ldr r2, =0x114001e4 @ 将GPF3DATldr r3, [r2]orr r3, #0x10 @ 将GPF3DAT的4号位置 1,亮灯str r3, [r2]bl delay_1s @开灯led5ldr r2,=0x114001E4ldr r3,[r2]orr r3,#0x20str r3,[r2]bl delay_1s @关灯led2ldr r2, =0x11000c44 @ 将GPX2DAT寄存器的地址搬移到 r2ldr r3, [r2]bic r3, #0x80str r3, [r2]bl delay_1s @关灯led3ldr r2,=0x11000c24ldr r3,[r2]bic r3,#0x1str r3,[r2]bl delay_1s @关灯led4ldr r2, =0x114001e4 @ 将GPF3DATldr r3, [r2]bic r3, #0x10 @ 将GPF3DAT的4号位置 0,灭灯str r3, [r2]bl delay_1s @关灯led5ldr r2,=0x114001E4ldr r3,[r2]bic r3,#0x20str r3,[r2]bl delay_1sb while delay_1s:ldr r10, =0x4ffffff loop:cmp r10, #0subgt r10, #1bgt loopmov pc, lr.end
makefile
CROSS=arm-linux- CC=gcc LD=ld OC=objcopyall: $(CROSS)$(CC) -c start.s$(CROSS)$(LD) start.o -Ttext 40008000 -o start.elf$(CROSS)$(OC) -O binary -S start.elf start.binclean:rm *.o *.elf *.bin
ARM开发(四)新手小白如何阅读芯片手册,裸机驱动开发步骤以及纯汇编实现点灯,汇编结合c点灯,c实现点灯相关推荐
- I.MX6ULL裸机驱动开发四种方式总结
学习裸机驱动开发也有一阵子,终于是把几种裸机驱动方法学完了,总体来说难度并不大.因为毕竟有基础在,能大概看懂数据手册和知道如何是控制寄存器. 驱动方法目前所学共有四种: 1.纯汇编驱动 2.汇编驱动头 ...
- 阅读芯片手册及硬件原理图的方法
阅读原理图的方法 以CPU为中心向存储和外设辐射 看片选.中断和外设控制器 看引脚的符号+连线网络+注释框 阅读芯片手册的方法 看产品综述(overview),有芯片结构图和主要模块简述 看Memor ...
- 实战开发:新手小白如何用C++制作经典网游DNF
十年前,那时候的网吧还不叫网咖,那时候没有王者荣耀也没有英雄联盟,那时候梦幻西游刚推出珍宝阁系统,那时候巫妖王的灵魂还封闭在冰封王座. 寻仙.穿越火线.征途.天龙八部--同时在线人数超百万的游戏纷纷涌 ...
- NXP LS1046A及飞腾新四核 FT2004 PCIE EP端LINUX设备驱动开发
文章目录 前言 一.PCIE 硬件简介 二.PCIE EP地址映射原理介绍 1. PCI总线的各种域(存储器域.PCI总线域) 2. 开发EP设备驱动要做的事 三.NXP LS1046A PCIE E ...
- 芯片行业BSP驱动开发1年总结
背景:细分领域的半导体龙头企业,BSP驱动开发. 目的:1.总结开发经验,构建我的嵌入式体系架构.2.总结工程项目经验,探讨清楚工作的本质. 序:我在公司的工作分为两个部分:BSP驱动开发和对接客户的 ...
- 树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”
首先我们要知道,驱动的两大利器:电路图(通过电路图去寻找寄存器)和芯片手册 一.寄存器的介绍 芯片手册第六章的89页,GPIO有41个寄存器,所有访问都是32位的.Description是寄存器的功能 ...
- ADI最新基带处理芯片 ADRV9026 FPGA 驱动开发及调试记录分享
最近要驱动ADRV9026,ADRV9026为9009下一代,支持4收4发,但是高速JESD接口还是4X,同时支持JESD204B及204C协议,相对之前的9009官方会提供一个相对完整的工程,ADR ...
- 【正点原子MP157连载】第二十章 字符设备驱动开发-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...
- linux设备驱动开发详解 第三版,《Linux设备驱动开发详解(第3版)》进展同步更新...
2014.8.25 目前初步完成2-11章以及第22章 <Linux设备驱动的调试>,相对于第2版,这几章主要的变更. 本博实时更新<Linux设备驱动开发详解(第3版)>的最 ...
- 【海思篇】【Hi3516DV300】十八、TSENSOR 芯片温度检测驱动 开发
文章目录 一 芯片操作步骤 二 驱动层实现 三 应用层实现 四 测试 一 芯片操作步骤 参考<<Hi3516DV300专业型Smart IP Camera SoC用户指南.pdf>& ...
最新文章
- ubuntu安装redis的方法以及PHP安装redis扩展、CI框架sess使用redis的方法
- 【Nvivo教程】使用Nvivo构建计算的本体
- codeforces 401D. Roman and Numbers 数位dp
- NOIP2018复赛 游记
- 很多工程师问ESP32彩屏能不能在arduino上面来玩,这个是没有问题的
- python不定长参数详解
- mobile.php discuz,电脑访问discuz手机版【触屏版跳转标准版的修改方法】
- 13结构型模式之桥接模式
- 5-5图层的链接-新版本不常用
- windows下数据库mysql8.0安装
- sublime前端开发常用插件
- 微信公共账号学习笔记 _ 感想 爪机码字
- 【LeetCode】【字符串】题号:*58. 最后一个单词的长度
- 利用计算机进行频数分布表制作,实验三 利用Excel软件作频数分布表和统计图表...
- CWM模式(卡刷)教程
- 如何转换图片格式?建议收藏这两个方法
- 《Labeled Data Generation with Inexact Supervision》 KDD-2021 论文阅读
- 7-11 公约数与公倍数 (10 分)
- 虚拟服务器443端口开启,服务器开启443端口
- 打开Word提示向程序发送命令时出现问题怎么办?
热门文章
- 格雷希尔Gripseal燃油管快速接头如何做密封性测试
- linux软连接与环境变量
- 基于JDK1.8的JVM 内存结构【JVM篇三】
- Captin for mac(大小写切换悬浮窗提示)
- 关于Eclipse安装ArchStudio 5插件出现An error occurred while collecting items to be installed......的解决方法
- 学习笔记:微波遥感反演土壤水分——理论模型和经验模型(1)
- 3Dmax建模教程详细步骤3D建模速成入门到高级教程 小白必看
- 华硕飞行堡垒Fx50j4200H 4600HD 黑苹果High Sierra10.13.6心得
- 电路串联和并联图解_如何识别串联电路和并联电路
- 萤石云视频PC客户端v2.6.14.0官方最新版