首页 > 代码库 > ARM逻辑驱动学习笔记
ARM逻辑驱动学习笔记
arm程序:
RO:只读段(代码段+只读数据段.text .rodata)
RW:可读可写段(数据段.data)
ZI:未初始化全局变量(.bss)
模板代码分析:
头文件
1.2440addr.h : s3c2440寄存器变量和地址
2.mmu.h,2440slib.h: MMU函数
3.2440lib.h: 常用函数
代码:
1.init.s 初始化程序
2.mmu.c ,2440slib.s MMU函数
3.2440lib.c 常用函数
4.Main.c 主函数
下载时:
1.supervivi命令中:
【d】只下载到内存并执行,先运行Supervivi初始化CPU,RAM等,将代码下载到内存,跳到0x30000000d的init.o中运行,重新初始化中断,CPU,RAM,然后从init.o再跳到主函数运行
【a】将文件下载到nandFlash中
2.两根线:
USB下载线将文件下载到内存或flash用USB,需要安装USB驱动
串口线来传输命令,与用户进行交互,以用来控制,需要安装串口驱动
S3C2440包括8个端口供130个外部输入输出引脚
端口配置寄存器(GPACON 至GPJCON)
端口数据寄存器(GPADAT 至GPJDAT)
端口上拉寄存器(GPBUP 至GPJUP)
led
连接:
LED1--nLED_1--S3C2440nXBACK/GPB5
LED2--nLED_2--S3C2440nXBREQ/GPB6
LED3--nLED_3--S3C2440nXDACK1/GPB7
LED4--nLED_4--S3C2440nXDREQ1/GPB8
端口B 寄存器(GPBCON,GPBDAT,GPBUP)
LED配置:rGPBCON ->0x56000010
00=输入 01=输出 10=nXDREQ1 11=**
0000 0000 0000 0001 0101 0100 0000 0000
rGPBCON=0x15400;
或者:rGPBCON |= (0x55 << 10);
led数据::rGPBDAT ->0x56000014
GPB[10:0],1灭,0亮。
0000,0000,0000,0000,0000,0001,1110,0000
//led1
rGPBDAT |= (0xf << 5);//四个灯全灭
rGPBDAT &= ~(0x1 << 5);//第N个灯亮,就将0001左移N位取反。
led上拉电阻:rGPBUP ->0x56000018
置1用或1, |=(1<<n) 0000100000
置0用与0, &=~(1<<n) 1111011111=~0000100000
按键:
连接:
k1 -- EINT8 -- EINT8/GPG0
K2 -- EINT11-- nSS1/EINT11/GPG3
K3 -- EINT13-- SPIMISO1/EINT13/GPG5
K4 -- EINT14-- SPIMOSI1/EINT14/GPG6
k5 -- EINT15-- SPICLK1/EINT15/GPG7
K6 -- EINT19-- TCLK1/EINT19/GPG11
按键配置:GPGCON->0x56000060
00=输入 01=输出 10=EINT【*】 11=**
0000 0000 0000 0000 0000 0000 0000 0000
按键数据:GPGDAT ->0x56000064
0000 0000 0000 0000 0000 0000 0000 0000
按键上拉电阻:GPGUP ->0x56000068
蜂鸣器:
GPB0
中断
1.外部中断源
外部中断控制寄存器:
EXTINT0
EINT0-7,[30:0] 000为低电平,001高电平,01*下降沿触发,10*上升沿,11*双边沿触发
0000 0000 0000 0000 0000 0000 0000 0000
EXTINT1
EINT8-15
0000 0000 0000 0000 0000 0000 0000 0000
EXTINT2
EINT16-23
0000 0000 0000 0000 0000 0000 0000 0000
EINTPEND:外部中断挂起寄存器
EINT[23:4] ,1为发生中断
0000 0000 0000 0000 0000 0000 0000 0000
EINTMASK:外部中断屏蔽寄存器
EINT[23:4] ,1为禁止中断,初始值为0x000FFFFF
0000 0000 1111 0111 0001 0110 1111 0000
2.内部中断源
SUBSRCPND:子源挂起寄存器
INTSUBMSK:
↓
SRCPND:源挂起寄存器
INTMOD: 终端模式寄存器 --> FIQ
INTMSK:中断屏蔽寄存器
↓
*PRIORITY:优先级寄存器
↓
INTPND:中断挂起寄存器 INTOFFSET:中断偏移寄存器
↓
IRQ
中断控制程序的实现步骤:
主程序:
//1、清中断挂起。(SRCPND,INTPND,/SUBSRCPND)
2、端口初始化,定义外部端口为中断模式
3、设置中断入口函数指针
4、设置中断触发方式
5、开中断
中断处理函数:
1、关中断
2、处理
3、清中断挂起。(SRCPND,INTPND,/SUBSRCPND)
4、开中断
5、返回
时钟系统
XTLpll,XTOpll(晶振crystal)+OSC(振荡器oscillator)-->Fin(12MHZ)
-->Upll(USB Phase Locked Loop) -->UCLK(48MHZ)用于USB设备
-->Mpll(锁相环Main Phase Locked Loop)-->Mpll->CLKCNTL->FCLK用于内核(自由运行)
(Free running )
->HCLK用于AHB总线(高速)
(Advanced High performance Bus)
PCLK用于APB(外围低速)
(Advanced Peripheral Bus)
*(LOCKTIME)锁定时间计数寄存器:rLOCKTIME => 0x4C000000
U_LTIME M_LTIME,300us
1111 1111 1111 1111 /1111 1111 1111 1111
(MPLLCON和UPLLCON)PLL控制寄存器:rMPLLCON ->0x4C000004
MDIV MDIV SDIV
Mpll = ( 2 × m × Fin ) / ( p × 2s )
m = ( MDIV + 8 ), p = ( PDIV + 2 ), s = SDIV
0000 0000 0000 1001 0110 0000 0011 0000
*(CLKCON)时钟控制寄存器:rCLKCON ->0x4C00000C
(CLKDIVN)时钟分频控制寄存器: rCLKDIVN ->0x4C000014
HDIVN[2:1] ,PDIVN[0]
0000 0000 0000 0000 0000 0000 0000 0000
假设外部晶振产生12MHz的频率,要求:FCLK=400MHz,HCLK = 100MHz,PCLK=50MHz;问,寄存器该怎么样设置?
400M = (2 * m * 12M)/p / 2
400 / 12 = m / p
100 / 3
m=100 MDIV=92
p=3 PDIV=1
s=1 SDIV=1
400M = (2 * m * 12M) / p / 4
400/6 = m / p
200/3 = m / p
m=200 MDIV=192
p=3 PDIV=1
s=2 SDIV=2
FCLK : HCLK = 4 : 1 ==>HDIVN [2:1]=10
HCLK : PCLK = 2 : 1 ==>PDIVN [0] = 1
定时器中断与PWM
PCLK ->预分频TCFG0->分频TCFG1-> 比较TCMPB0,计数TCNTB0
* TCMP0, * TCNT0 ->TCNTO0(监视) -> TOUT0(PWM)
->中断 “PulseWidthModulation”
定时器配制寄存器 0(TCFG0): rTCFG0 -> 0x51000000
Prescaler 1[15:8] 定时器 2,3 和 4 的预分频值
Prescaler 0 [7:0] 定时器 0 和 1 的预分频值
0000 0000 0000 0000 0000 0000 /0000 0000
定时器配制寄存器 1(TCFG1):rTCFG1 ->0x51000004
MUX0[3:0] MUX1[7:4] MUX2[11:8] MUX3[15:12] MUX4[19:16] DMA模式[23:20]
0000 =1/2 0001=1/4 0010=1/8 0011=1/16 01xx =外部TCLK1
0000 0000 0000 0000 0000 0000 0000 0000
定时器控制寄存器 1(TCON): rTCON ->0x51000008
定时器 0 启动/停止 [0]
定时器 0 手动更新(注释) [1]
定时器 0 输出变相开/关 [2]
定时器 0 自动重载开/关 [3]
0000 0000 0000 0000 0000 0000 0000 0000
定时器 0 计数缓冲寄存器和比较缓冲寄存器(TCNTB0/TCMPB0):TCNTB0 ->0x5100000C
TCMPB0 ->0x51000010
定时器 0 比较缓冲寄存器 [15:0]
0000 0000 0000 0000 0000 0000 0000 0000
定时器 0 计数缓冲寄存器 [15:0]
0000 0000 0000 0000 0000 0000 0000 0000
*定时器 0 计数监视寄存器(TCNTO0):rTCNTO0 ->0x51000014
定时器 0 计数监视寄存器 [15:0]
0000 0000 0000 0000 0000 0000 0000 0000
看门狗定时器中断
PCLK ->预分频->分频 ->WTDAT
WTCON WTCNT->RESET
->中断
看门狗定时器控制(WTCON)寄存器: rWTCON ->0x53000000
预分频值[15:8] 看门狗定时器使能[5] 时钟选择(分频)[4:3] 中断使能[2] 复位使能/禁止[0]
0000 0000 0000 0000 0000 0000 000/0 0/000
看门狗定时器数据(WTDAT)寄存器 : rWTDAT ->0x53000004
计数重载值 [15:0]
0000 0000 0000 0000 0000 0000 0000 0000
看门狗定时器计数(WTCNT)寄存器: rWTCNT ->0x53000008
计数值 [15:0]
0000 0000 0000 0000 0000 0000 0000 0000
实时时钟
日历时间使用BCD码(二-十进制)来表示
RTCCON
128hz ->TICNT ->节拍中断
XTIrtc,XTOrtc<36.785M>->分频器->1Hz-> BCDSEC,BCDMIN,BCDHOUR,BCDDATE,BCDDAY,BCDMON,BCDYEAR
ALMSEC,ALMMIN,ALMHOUR,ALMDATE, ALMMON,ALMYEAR
RTCALM -> INT_RTC中断
实时时钟控制(RTCCON)寄存器 :rRTCCON ->0x57000040(L)0x57000043(B)
RTCEN [0] , CLKSEL [1],CNTSEL [2], CLKRST [3]
0000 0000 0000 0000 0000 0000 0000 0000
节拍时间计数(TICNT)寄存器 :rTICNT ->0x57000044(L)0x57000047(B)
TICK 时间计数 [6:0] ,TICK INT 使能 [7]
0000 0000 0000 0000 0000 0000 0000 0000
RTC 闹钟控制(RTCALM)寄存器 :rRTCALM-> 0x57000050(L) 0x57000053(B)
SECEN[0],SECEN[0],HOUREN[2],DATEEN[3],DATEEN [3],MONREN[4],YEAREN[5],ALMEN[6],ALMEN [6]
0 = 禁止 ,1 = 使能
0000 0000 0000 0000 0000 0000 0000 0000
BCDSEC,BCDMIN,BCDHOUR,BCDDATE,BCDDAY,BCDMON,BCDYEAR
ALMSEC,ALMMIN,ALMHOUR,ALMDATE, ALMMON,ALMYEAR
串口UART
连接:
COM1: ->TTL转RS_232芯片->串口COM0输出
TXD0---TXD0/GPH2
RXD0---RXD0/GPH3
COM2:
TXD1---TXD1/GPH4
RXD1---RXD1/GPH5
COM3:
TXD2---TXD2/GPH6
RXD2---RXD2/GPH7
端口H配置GPHCON:rGPHCON ->0x56000070
00=输入, 01=输出 ,10=TXD[0], 11=保留
端口配置:TXD0/GPH2sRXD0/GPH3
rGPHCON = 0xa0;//将GPH2和3作为串口数据线使用
0000 0000 0000 0000 0000 0000 00/00 0000
波特率分频寄存器:UBRDIVn: UBRDIV0->0x50000028,UBRDIV1->0x50004028,UBRDIV2->0x50008028
UBRDIVn =int( PCLK / 波特率 / 16) - 1
一般rUBRDIVn = 6;//115200HZ
rUBRDIVn =324;//9600HZ
0000 0000 0000 0000 0000 0000 0000 0000
UART 线路控制寄存器 : rULCON0->0x50000000,ULCON1->0x50004000,ULCON2->0x50008000
保留[7] , 红外模式[6] ,奇偶校验模式[5:3] ,停止位数[2], 字长度[1:0]
00=5位 ,01=6位, 10=7位, 11=8位
0 = 每帧1个停止位 , 1= 每帧2个停止位
0xx = 无奇偶校验
0 = 普通模式操作 1 = 红外Tx/Rx 模式
一般rULCON0=0x03// 数据位8位,停止位1位,无奇偶检验位,普通模式
0000 0000 0000 0000 0000 0000 0/0/00 0/0/00
UCON:控制寄存器: UCON0 ->0x50000004,UCON1 ->0x50004004 ,UCON2 ->0x50008004
FCLK 分频器[15:12] ,时钟选择[11:10],Tx 中断类型[9],Rx 中断类型[8] ,Rx超时使能[7],Rx错误状态中断使能[6],环回模式[5],发出断点信号[4],
Transmit Mode [3:2], Receive Mode [1:0]
00 = Disable, 01 = 中断或者查询方式,
10 = DMA0 request (Only for UART0),DMA3 request (Only for UART2)
11 = DMA1 request (Only for UART1)
//串口数据的收发采用中断或者查询方式,异常时允许UART产生中断,如果使用中断方式进行数据收发,中断触发的方式为电平触发
rUCON0 = 0x245;
0000 0000 0000 0000 0000 /00/0/0/ 0/0/0/0 /00/00
*UFCON(0-2):FIFO控制寄存器
*UMCON:MODEM 控制寄存器
UTRSTAT:TX/RX 状态寄存器:UTRSTAT0->0x50000010,UTRSTAT1->0x50004010,UTRSTAT2->0x50008010
发送器空[2],发送缓冲器空 [1],接收缓冲器数据就绪 [0]
0为不可收发,1为可收发
0000 0000 0000 0000 0000 0000 0000 0000
*UFSTAT:FIFO 状态寄存器
*UMSTAT:MODEM 状态寄存器
*UERSTAT:错误状态寄存器
UTXH(0-2):发送缓冲寄存器
URXH:接收缓冲寄存器
AD转换:
模拟->数字
连接:
电位器---AIN0---AIN0
AIN1---AIN1
AIN2---AIN2
AIN3---AIN3
触摸屏: TSYM---AIN4/TSYM
TSYP---AIN5/TSYP
TSXM---AIN6/TSXM
TSXP---AIN7/TSXP
A --> MUX -> A/D Converter -> ADC interface ->Interrupt Generation -> INT_ADC
&Touch Screen INT_TC
Control
ADC 控制寄存器(ADCCON):rADCCON -> 0x5800000
ECFLG [15] ,PRSCEN [14] , PRSCVL [13:6], SEL_MUX [5:3] , STDBM [2] , READ_ START [1] , ENABLE_START [0]
rADCCON = 0; //工作模式设置为工作模式
rADCCON &= ~(0x7 << 3); //模拟输入通道选择,选择通道0(AIN0)
rADCCON |= 24 << 6; //A/D 转换器预分频值,设置为2MHz , 50MHz / 25 (最大为2.5MHZ)
rADCCON |= 1 << 14; //A/D 转换器预分频器使能
0000 0000 0000 0000 0/0/11 1111 11/00 0/1/0/0
ADC 转换数据寄存器(ADCDAT0): ADCDAT0 -> 0x580000C
转换精度为10位。
rADCCON |= 1; //使能 A/D 转换启动,该位应该在第[1]位为0的时候来启动
while(!(rADCCON & 0x1 << 15)); //转换结束标志位(只读),转换没有结束,等待
rADCCON |= 1 << 1; //读启动
res = rADCDAT0 & 0x3ff; //读取数据
0000 0000 0000 0000 0000 0000 0000 0000
触摸屏
子中断INT_ADC_S,INT_TC -> 中断INT_ADC
ADC 触摸屏控制寄存器(ADCTSC): rADCTSC -> 0x5800004
UD_SEN[8],YM_SEN[7] , AUTO_PST[2],XY_PST[1:0],
rADCTSC = 0xd3; //等待中断模式,YM 输出驱动器使能
0000 1101 0011
0000 0000 0000 0000 0000 0000 /01/01 1/0/00
ADC 启动延时寄存器(ADCDLY): rADCDLY -> 0x5800008
DELAY [15:0]
0000 0000 0000 0000 0000 0000 1111 1111
ADC 转换数据寄存器(ADCDAT0): rADCDAT0 -> 0x580000C
UPDOWN[15] ,AUTO_PST[14] ,XY_PST[13:12] ,保留 [11:10], XPDATA (正常 ADC) [9:0]
0000 0000 0000 0000 0000 00/00 0000 0000
ADC 转换数据寄存器(ADCDAT1): rADCDAT1 -> 0x5800010
YPDATA [9:0]
0000 0000 0000 0000 0000 00/00 0000 0000
ADC 触摸屏起落中断检测寄存器(ADCUPDN): rADCUPDN -> 0x5800014
TSC_UP[1] ,TSC_DN[0]
笔尖抬起中断 ,笔尖落下中断
0000 0000 0000 0000 0000 0000 0000 0000
1.设置ADCTSC,触摸屏为等待中断模式,检测笔尖落下。打开YM,PULL_UP
2.INT_TC发生后,设置ADCTSC,选择X,Y坐标转换模式(自动)。关闭PULL_UP,启动AD转换
3.轮询法,通过中断挂起INTPND(INT_ADC)产生后,获取xy坐标。重新等待中断模式,等待笔尖抬起,打开YM,PULL_UP。
4.抬起后,显示坐标值。
5,返回步骤1.等待中断,检测笔尖落下,打开YM,PULL_UP
。
LCD显示屏
lcd: liquid crystal display
连接:
控制线--GPC[7:0]
数据线:
VD[7:0]--GPC[15:8]
VD[23:8]--GPD[15:0]
LCD控制器 --> LCD驱动器 --> LCD显示屏
1.静态驱动
2.简单矩阵驱动:TN 扭转向列型;STN 超转向列型
3.主动矩阵驱动:TFT(薄膜场效应晶体管Thin FilmTransistor)
REGBANK ->TIMEGEN -> VIDEO MUX-> 控制信号VSYNC (帧(垂直)同步Vertical sync. Signal)
LPC3600 HSYNC (行(水平)同步Horizontal sync. Signal)
VCLK (像素时钟Pixel clock signal)
VD[23:0](Pixel Data )
VDEN (pixel data Eable)
LEND (Line END)
LCDCDMA -> VIDPRCS -> DMA 数据传输
CLKVAL = HCLK / VCLK / 2 - 1 = 6
VCLK=HCLK÷[(CLKVAL+1)×2] = 7.1MHz
VSYNC 帧同步信号周期:
垂直同步信号脉宽VSPW vertical sync pulse width
垂直同步信号后肩(VBPD) vertical back porch
LINEVAL 320-1
垂直同步信号前肩(VFPD) vertical front porch
(VSPW+1)+(VBPD+1)+ LINEVAL+1+(VFPD+1)
场频:VSF=HSF÷[(VSPW+1)+(VBPD+1)+(VFPD+1)+(LINEVAL+1)]
=21.8÷(20+10+10+240)=77.8Hz
HSYNC 行同步信号周期:
水平同步信号脉宽HSPW horizontal sync pulse width
水平同步信号后肩(HBPD) horizontal back porch
HOZVAL 240-1
水平同步信号前肩(HFPD)horizontal front porch
(HSPW+1)+(HBPD+1)+ (HOZVAL + 1) + (HFPD+1)
HSF=VCLK÷[(HSPW+1)+(HSPD+1)+(HFPD+1)+(HOZVAL+1)]
=7.1M÷(6+320)=21.8kHz
LCD 控制 1 寄存器:LCDCON1 -> 0X4D000000
LINECNT(只读) [27:18],CLKVAL [17:8],MMODE [7],PNRMODE [6:5],BPPMODE [4:1],ENVID [0]
TFT:VCLK = HCLK / [(CLKVAL + 1) × 2] (CLKVAL≥0)
11 = TFT LCD 面板
1000 = TFT 的 1 bpp
1001 = TFT 的 2 bpp
1010 = TFT 的 4 bpp
1011 = TFT 的 8 bpp
1100 = TFT 的 16 bpp
1101 = TFT 的 24 bpp
0 = 禁止视频输出和 LCD 控制信号
1 = 允许视频输出和 LCD 控制信号
0000 0000 0000 00/00 0000 0000/ 0/00/0 000/0
LCD 控制 2 寄存器: LCDCON2 -> 0X4D000004
VBPD[31:24], LINEVAL[23:14], VFPD[13:6],VSPW[5:0]
0000 0000/ 0000 0000 00/00 0000 00/00 0000
LCD 控制 3 寄存器:LCDCON3 -> 0X4D000008
HBPD(TFT)[25:19] ,HOZVAL[18:8] , HFPD(TFT)[7:0]
0000 0000 0000 0/000 0000 0000 /0000 0000
LCD 控制 4 寄存器:LCDCON4 -> 0X4D00000C
MVAL[15:8], HSPW(TFT)[7:0]
0000 0000 0000 0000 0000 0000 /0000 0000
*LCD 控制 5 寄存器:LCDCON5 -> 0X4D000010
帧缓冲器开始地址 1 寄存器 :LCDSADDR1 -> 0X4D000014
LCDBANK [29:21] , LCDBASEU [20:0]
系统存储器中视频缓冲器的 bank 位置的 A[30:22]
对于单扫描 LCD:这些位表明 LCD 帧缓冲器的开始地址的 A[21:1]。
0000 0000 0000 /0000 0000 0000 0000 0000
帧缓冲器开始地址 2 寄存器: LCDSADDR2 -> 0X4D000018
LCDBASEL [20:0]
对于单扫描 LCD:这些位表明 LCD 帧缓冲器的结束地址的 A[21:1]。
LCDBASEL = ((帧结束地址) >> 1) + 1
= LCDBASEU +
(PAGEWIDTH+OFFSIZE) × (LINEVAL+1)
0000 0000 0000 0000 0000 0000 0000 0000
帧缓冲器开始地址 3 寄存器:LCDSADDR3 -> 0X4D00001C
OFFSIZE [21:11] ,PAGEWIDTH [10:0]
虚拟屏偏移尺寸(半字数)
虚拟屏页宽度(半字数)
0000 0000 0000 0000 0000 0/000 0000 0000
LCD初始化
1.端口初始化,GPCCOM,GPDCON
2.显示模式初始化
3.帧缓冲初始化
将图像写入帧缓冲