首页 > 代码库 > 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.帧缓冲初始化

将图像写入帧缓冲