ARM裸机
文章平均质量分 81
啊
只是为了记笔记
只是为了记笔记
展开
-
第二十课(2)使用GPIO实现SPI协议操作OLED
1、代码结构我们现在想要操作OLED,通过三条线(SCK、DO、CS)与OLED相连,这里没有DI是因为2440只会向OLED传数据而不用接收数据。oled.c 发送数据gpio_spi.c 实现spi引脚的初始化2、gpio_spi.c的SPI_GPIO_InitGPF1作为OLED片选引脚,设置为输出;GPG2作为FLASH片选引脚,设置为输出;GPG4作为OLED的数据(Data)/命令(Command)选择引脚,设置为输出;GPG5作为SPI的MISO,设置为输入;GPG6作为原创 2020-05-24 12:02:11 · 830 阅读 · 0 评论 -
第二十课(1)SPI协议介绍
一、SPI结构图SCK:提供时钟DO:作为数据输出DI:作为数据输入CS0/CS1:作为片选二、SPI模式1、时序图查看S3C2440芯片手册,P501,传输格式,下面讲解下图片怎么看:CPOL = 0, CPHA = 0 (Format A)CPOL = 0表示初始是低电平,如图下图画红线:CPHA = 0表示在第一个时钟沿采样数据。如图画红线所示,在上升沿采样数据:...原创 2020-05-01 14:17:04 · 1104 阅读 · 0 评论 -
第十九课(1)IIC协议
一、I2C在硬件上的接法I2C在硬件上的接法如下图所示,主控芯片引出两条线SCL(serial clock),SDA(erail data)线,在一条I2C总线上可以接很多I2C设备,我们还会放一个上拉电阻(放一个上拉电阻的原因以后我们再说)。主从结构–> 一主多从二、s信号 p信号 ACK信号是怎么表示的?随便打开一个有IIC的芯片(1)开始信号(S):SCL为高电平时,S...转载 2020-04-30 17:27:34 · 671 阅读 · 0 评论 -
第十八课(2)触摸屏原理与接口
一、触摸屏原理从欧姆定律间接得到x坐标:触摸屏是由两层膜组成的。当点击触摸屏,两张膜就粘在一起,怎么得到触点的x坐标和y坐标呢?X坐标:Xp接3.3V ,Xm接地;Yp,Ym不接电源。这时,Yp就像探针一样,得出电压值,越靠近Xm则电压越小,然后根据欧姆定律得出X坐标。Y坐标:Yp接3.3V ,Ym接地;Xp,Xm不接电源。这时,Xp就像探针一样,得出电压值,越靠近Ym则电压...原创 2020-04-29 21:41:51 · 4276 阅读 · 0 评论 -
第十八课(1)ADC原理及编程
一、ADC原理模数转换器即A/D转换器,或简称ADC,通常是指一个将模拟信号转变为数字信号的电子元件。对于数字信号我们需要得到它的几个属性:用多少位来存储这个数据(假设10bit)。最大值0b111111111模拟信号输入的最大值是多少=>它对应的电压是多少伏我们就可以根据模拟信号(电压)的最大值,来计算出对应的数值。比如0b111111111为3.3v 那么0b11111...原创 2020-04-29 20:59:08 · 3903 阅读 · 0 评论 -
第十七课(6)LCD编程——实现除法/调色板
我们的逻辑还没有实现除法算法,因此先写一个确定值。//int clkval = (double)HCLK/plcdparams->time_seq.vclk/2-1+0.5;int clkval = 5;这节就完成除法的实现一、实现除法韦老师的错误:因为我的lib1funcs.S和老师不一样:lcd/s3c2440_lcd_controller.o: In function ...原创 2020-04-29 17:05:11 · 281 阅读 · 0 评论 -
第十七课(5)LCD编程——测试
uboot是裸板集大成者,所以我们去uboot上勋章strcmp函数的实现:/** * strcmp - Compare two strings * @cs: One string * @ct: Another string */int strcmp(const char * cs,const char * ct){ register signed char __res; wh...原创 2020-04-29 11:50:52 · 247 阅读 · 0 评论 -
第十七课(4)LCD编程
先完成:【lcd_controller.c】:向上接收不同LCD的参数,向下使用这些参数设置对应的LCD控制器【s3c244_lcd_controller.c】所以我们需要把LCD的参数写成一个结构体:lcd.h:#ifndef _LCD_H#define _LCD_Henum { NORMAL = 0, INVERT = 1,};/* NORMAL : 正常极性 *...原创 2020-04-26 16:13:32 · 1289 阅读 · 0 评论 -
第十七课(3)LCD编程——框架与准备
一、框架【lcd_test.c】 提供菜单来选择画圆写字等/ ********************************************************** /软件操作:画线、画圆、写字 【frambuffer.c用来画点】【geometry.c 画线画圆】【font.c写字】/ ********************************************...原创 2020-04-21 16:07:23 · 300 阅读 · 0 评论 -
第十七课(2)LCD控制器介绍
LCD控制器主要功能和需要的设置:取:从内存(FrameBuffer)取出某个像素的数据;之后需要把FrameBuffer地址、BPP、分辨率告诉LCD控制器;发:配合其它信号把FrameBuffer数据发给LCD;需要设置LCD控制器时序、设置引脚极性;先看下S3C2440芯片手册上的LCD控制器框图:通过设置REGBANK(寄存器组),LCDCDMA会自动(无需CPU参与,DMA...转载 2020-04-21 14:31:50 · 1498 阅读 · 0 评论 -
第十七课(1)LCD硬件原理
LCD上每一个点是一个像素。电子枪一边移动,一边发出颜色。电子枪如何移动?clk时钟线与LCD相连,每来1个clk,移动1个像素如何发出颜色?R、G、B三组信号线连接LCD确定颜色电子枪移动一行后,怎么知道要换行了?LCD接有HSYNC (水平同步信号 ),当接收到HSYN脉冲就跳行。电子枪移动到最后一行的最后一个点后,怎么知道要移动到原点?LCD接有VSYNC(垂直同步信号 )...转载 2020-04-21 12:04:18 · 806 阅读 · 0 评论 -
第十六课(2)Nand FLash编程_识别
NAND FLASH存储芯片编程需要的操作:存储芯片的编程NAND FLASH存储芯片编程初始化主控芯片的NAND FLASH控制器的初始化识别读取ID读操作一次读一个页(page)写操作一次写一个页(page)擦除一次擦除一个块(block)一般,一个块(block)=64个页(page)一、设置Nand Flash时序——初始化N...原创 2020-04-20 16:37:41 · 446 阅读 · 0 评论 -
十六课(1)Nand Flash的操作原理
1、从Nand原理图上分析从原理图上看,Nand Flash只有数据线,那么是怎么传输地址的?DATA0~DATA7既传输数据又传输地址。当ALE为高电平时传输的是地址;当ALE为低电平传输的是数据。从Nand Flash芯片手册可知,要操作Nand Flash需要先发出命令。那么说明数据线也传输命令,那么怎么分辨是命令呢?当CLE为高电平时传输的是命令;当CLE和ALE为低电平时传...原创 2020-04-20 14:46:16 · 754 阅读 · 0 评论 -
第十五课(3)Nor FLash编程_擦和写
1、读Nor Flash知识点:ascii可视字符和不可视字符可视字符打印出来,不可是字符打印“.”。我们先只打印64字节。#include "my_printf.h"#include "string_utils.h"void do_read_nor_flash(void){ unsigned int addr; volatile unsigned char *p; int i...原创 2020-04-20 10:58:08 · 450 阅读 · 0 评论 -
第十五课(2)Nor FLash编程_识别
1、 进入CFI模式#include "my_printf.h"#include "string_utils.h"#define NOR_FLASH_BASE 0 /* jz2440, nor-->cs0, base addr = 0 *//* 比如: 55H 98 * 本意是: 往(0 + (0x55)<<1)写入0x98 */void nor_wr...原创 2020-04-19 11:02:17 · 758 阅读 · 0 评论 -
第十五课(1)Nor FLash原理及硬件介绍
一、Flash介绍-NorNANDXIP(excute in place代码可以直接运行)Yesno性能(擦除)非常慢(5s)快(3ms)性能(写)慢快性能(读)快快可靠性较高,位反转的比例小于NAND Flash的10%比较低,位反转比较常见,必须有校验措施,比如TNR必须有坏块管理措施可擦除次数10000 ~ 1000...原创 2020-04-17 19:30:03 · 6256 阅读 · 0 评论 -
第十四课(7)定时器中断程序示例
一、引入定时器的概念定时器内部控制逻辑:①每来一个时钟 TCNTn 减1②当TCNTn == TCMPn,可以产生中断,也可以使对应的PWM引脚翻转(比如原来是高电平,现在是低电平)③TCNTn继续减1当TCNTn == 0时,可以产生中断,PWM引脚再次翻转④TCNTn == 0时,可自动加载初值CNTn 、TCMPn的值来自 TCMPBn TCNTBn怎么使用定时器?①设置...原创 2020-04-17 12:34:56 · 4382 阅读 · 0 评论 -
第十四课(6)按键中断程序示例
1、初始化中断控制器2、初始化按键,设置为中断源3、CPU中断使能cpsr的 I (字母) 位 为 0main循环打印字符串按下按键,产生中断,执行中断处理函数——点灯/灭灯处理完后 返回main继续打印原理图上按键接的中断源引脚:芯片手册外部中断源引脚:设置中断触发方式为双边沿触发:过滤 去掉某些文波外部中断屏蔽寄存器某一位设置为1后就禁止向中断控制器发送信号E...原创 2020-04-16 17:59:02 · 3226 阅读 · 0 评论 -
第十四课(5)swi(software interrupt)异常程序示例
特权模式可以修改cpsr寄存器进入六种特权模式,但是用户模式是不能修改的;而我们的软件是运行在用户模式下的。当我们的app想访问硬件的时候,必须切换模式。那么怎么切换?发生异常==>中断、und但是中断和und是可遇不可求的,所以发生swi 软中断。bic ==> bit clear软件中断会进入管理模式reset不是4字节对齐的指令.align 4...原创 2020-04-14 16:30:52 · 695 阅读 · 0 评论 -
第十四课(4)und(未定义)异常程序示例
目标:写一个程序故意让其发生未定义异常,然后处理这个异常1、异常向量表——地址查看uboot中源码uboot\u-boot-1.1.6\cpu\arm920t打开start.S,可以看到异常向量表: /*code: 28 -- 72*/ #include <config.h> #include <version.h> /* ...原创 2020-04-13 17:56:21 · 1345 阅读 · 0 评论 -
第十四课(3)Thumb指令集程序示例
1、修改原先的代码原Makefile文件:all: arm-linux-gcc -c -o led.o led.c arm-linux-gcc -c -o uart.o uart.c arm-linux-gcc -c -o init.o init.c arm-linux-gcc -c -o main.o main.c arm-linux-gcc -c -...转载 2020-04-13 12:07:56 · 883 阅读 · 0 评论 -
第十四课(2)CPU的工作模式 / 状态 / 工作模式下的寄存器
参考书:英文:arm architecture reference manual arm920t中文:杜春雷 《arm体系结构与编程》1、CPU的工作模式(Mode):usr 用户模式sys 系统模式异常模式 5种:undefined(und) 未定义模式Supervisor(svc) 管理模式Abort(abt) 中止模式IRQ(irq) 中断模式FIQ(fiq) 快中断...原创 2020-04-11 19:03:20 · 910 阅读 · 0 评论 -
第十四课(1)中断概念的引入 / 中断的处理流程介绍
1、中断概念的引入假设有个大房间里面有小房间,婴儿正在睡觉,他的妈妈在外面看书。问:这个母亲怎么才能知道这个小孩醒?过一会打开一次房门,看婴儿是否睡醒,让后接着看书一直等到婴儿发出声音以后再过去查看,期间都在读书第一种方法 叫做查询方式程序简单,但是累程序的模型:while(1){ 1 read book(读书) 2 open door(开门) if(...原创 2020-04-11 14:38:02 · 550 阅读 · 0 评论 -
第十三课(5)用C函数实现拷贝和bss段清除(不用汇编指令写了)
在前面,我们使用汇编程序来实现了重定位和清bss段,本节我们将使用C语言,实现重定位和清除bss段。1、使用C函数实现拷贝和bss段清除——汇编寄存器传入参数打开start.S把原来的汇编代码删除改为调用C函数 /* 重定位text, rodata, data段整个程序 */ mov r1, #0 ldr r2, =_start /* 第1条指令运行...原创 2020-04-10 19:10:25 · 466 阅读 · 0 评论 -
第十三课(4)实现一体式代码重定位与位置无关码
1、实现一体式代码重定位先梳理下把整个程序复制到SDRAM需要哪些技术细节:把程序从Flash复制到运行地址,链接脚本中就要指定运行地址为SDRAM地址;编译链接生成的bin文件,需要在SDRAM地址上运行,但上电后却必须先在0地址运行,这就要求重定位之前的代码与位置无关(是位置无关码);参考Uboot修改链接脚本:SECTIONS { . = 0x30000000; . =...原创 2020-04-10 18:05:19 · 321 阅读 · 0 评论 -
第十三课(3)汇编文件里的拷贝代码和链接脚本的改进
1、改进拷贝代码cpy: strb r4, [r1] ldrb r4, [r2] add r1, r1, #1 add r2, r2, #1 cmp r2, r3 bne cpy /* 清除bss段 */ mov r0, #0 ldr r1, =bss_start ldr r2, =bss_end clean: strb r0, [r1] add r1, r1, ...原创 2020-04-09 23:21:38 · 340 阅读 · 0 评论 -
.第十三课(1)重定位的引入
Nand启动中的代码重定位CPU可以直接访问SRAM、SDRAM、NorFlash ,不能直接访问 Nand但是我们依然可以设置为Nand启动,为什么呢?2440内部硬件可以把Nand前4K代码复制到SRAM上,CPU从0运行。(这里的0地址是SRAM的基地址)但是如果程序大于4K时,怎么办?把全部程序读出来,放到SDRMA上。(这就是代码重定位,重新确定代码运行的地址)Nand启动中...原创 2020-04-06 18:56:48 · 206 阅读 · 0 评论 -
第十二课 (2)时序图分析\SDRAM的设置
https://blog.csdn.net/thisway_diy/article/details/79389530参数是根据外接芯片的性能决定的,有些外接的芯片性能好,一发送读信号就能准备好数据,那么我发送的读信号就可以设置短一些1.位宽和等待控制寄存器BWSCON(BUSWIDTH&WAITCONTROLREGISTER)WS6[26] = 0nWait信号是 内存芯片向内...原创 2020-04-06 17:42:59 · 274 阅读 · 0 评论 -
第十二课 (1)内存接口概念、不同位宽设备的连接
https://blog.csdn.net/thisway_diy/article/details/793895301、三类接口三类接口:GPIO/门电路接口协议类接口:UART(串口) IIC IIS内存类接口:Nor、网卡、SDRAM (注意:没有Nand)2、内存控制器门电路接口和协议类接口CPU通过地址选择不同的寄存器内存控制器的作用:CPU把地址给内存控制器,内存控...原创 2020-04-06 13:38:10 · 925 阅读 · 0 评论 -
第十一课(4)从零实现用于裸机调试的printf函数——自动确定可变参数(宏函数)
1、宏函数:/* * push_test.c V1.0 * Copyright (c) 2017 Shenzhen 100ask Technology Co.Ltd.All rights reserved. * http://www.100ask.org * 100ask.taobao.com * * 测试平台: ubuntu16.04(64位机器) gcc -...原创 2020-04-02 21:17:56 · 169 阅读 · 0 评论 -
第十一课 (3)从零实现用于裸机调试的printf函数——手动确定可变参数(通过移动指针,然后取值)
man 3 printf/* * push_test.c V1.0 * Copyright (c) 2017 Shenzhen 100ask Technology Co.Ltd.All rights reserved. * http://www.100ask.org * 100ask.taobao.com * * 测试平台: ubuntu16.04(64位机器) ...原创 2020-04-02 20:51:08 · 219 阅读 · 0 评论 -
第十一课 (2)用UART实现自定义putchar、getchar、puts函数
一、需要配置的寄存器1、 设置引脚用于串口可以作为一般的引脚输入输出,也可以作为串口引脚,所以我们需要设置引脚作为串口功能别忘了还需要把上拉电阻使能上拉2、设置波特率P338UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1UART clock 从哪来?设置UCON0寄存器的Clock Selection [11:10] =...原创 2020-04-02 15:42:51 · 3040 阅读 · 0 评论 -
第十一课 (1)UART的硬件介绍
1、UART主要用途:打印调试信息;外接各种模块:GPS、蓝牙;通过三根线进行数据传输: 发送、接收、地线:2、数据格式:开始位数据位停止位校验位( 以前的数据没那么稳定,所以有校验位):奇校验偶校验怎么规定奇偶校验位的?数据位+校验位 中 为 1 的个数是奇数个/偶数个3、以ARM发送数据"A"给PC的逻辑电平为例:① 双方约定波特率:每一bit占据的时间A ...原创 2020-04-01 21:22:50 · 954 阅读 · 0 评论 -
第十课 掌握Jz2440_ARM芯片时钟体系
芯片结构查看芯片上册第一章找到上图,把上图分成三部分:上部分是与CPU密切相关,工作于FCLOCK中部分是AHB总线(H是high的意思,高速总线),工作于HCLOCK下部分是APB总线(P是perpheral,外设总线),工作与PCLOCK根据手册P34可知:Operating Frequency• Fclk Up to 400MHz• Hclk Up to 136MHz• ...原创 2020-04-01 00:08:33 · 466 阅读 · 0 评论 -
第八课 (3)常用ARM汇编指令
①LDR (load register):读寄存器举例:LDR R0,[R1]假设R1的值是x,读取地址x上的数据(4字节),保存到R0中;②STR (store register):写寄存器举例:STR R0,[R1]假设R1的值是x,把R0的值写到地址x(4字节);③B 跳转举例:死循环halt:B hal④MOV (move)移动,赋值举例1:MOV R0,R1把R...原创 2020-03-30 19:24:48 · 425 阅读 · 0 评论 -
第八课 (2)S3C2440启动流程——Nor启动和Nand启动
S3C2440框架:S3C2440启动流程:https://blog.csdn.net/don_chiang709/article/details/89220088S3C2440的启动时读取的第一条指令是在内存0x00地址处(注意:对于S3C2440芯片设计为0x0,其他芯片不一定)。上电后内存中没有数据,那么0x00地址处的指令如何放进去?Nand启动Nand基地址为0,片内...原创 2020-03-30 17:16:26 · 371 阅读 · 0 评论 -
第八课 (4)第一个裸机程序——点亮LED(通过反汇编文件解析内部机制)
第002节辅线1硬件知识_S3C2440启动流程与GPIO操作S3C2440框架:S3C2440启动流程:https://blog.csdn.net/don_chiang709/article/details/89220088S3C2440的启动时读取的第一条指令是在内存0x00地址处(注意:对于S3C2440芯片设计为0x0,其他芯片不一定)。上电后内存中没有数据,那么0x00地址处...原创 2020-03-30 22:49:28 · 725 阅读 · 0 评论 -
第八课 (5)编写按键控制LED程序——关闭看门狗,判断Nor启动/Nand启动
按键原理:查看按键原理图:平时拉高状态,输入1:按键按下后,输入0:原创 2019-09-23 10:50:59 · 466 阅读 · 0 评论