当前位置:
文档之家› 基于S3C2440的ARM9基础程序设计及分析
基于S3C2440的ARM9基础程序设计及分析
#define LED1_OFF #define LED2_OFF #define LED3_OFF #define LED4_OFF
(1<<5) (1<<6) (1<<7) (1<<8)
//LED 初始化函数,设置 GPBCON 为输出端口,并往端口送数据,使所有 LED 处于灭的 状态
void LEDInit() {
void Timer0Init()//PCLK=50MHZ {
rTCFG0 = 49; rTCFG1 |= 2; //CLK=62500HZ //TCFG0 TCFG1 设置定时器预分频值和分配值 然后得出定时器 0 频率: FCLK/(49+1)/16 rTCNTB0 = 62500; //TCNTB0 设置定时器的计数寄存器
void UartSendString(char *str) {
while(*str)
Uart_SendByte(*str++); }
void UartSendByte(char byte) {
switch(whic hUart) {
case 0: while( ! (rUTRSTAT0 & 0x02));//等待发生区为空 WrUTXH0(byte); break;
pISR_ADC = (U32)ADCHandle;//设置中断向量表 ClearPending(BIT_ADC);//清挂起寄存器 rSUBSRCPND &= (1<<10);//清子中断挂起寄存器 EnableIrq(BIT_ADC);//使能 ADC 中断,实际是关闭 INTMSK 对 ADC 的屏蔽 rINTSUBMSK &= (0<<10);//关闭子中断对 ADC_S 的屏蔽
}
static void __irq Timer0Handle() {
ClearPending(BIT_TIMER0);//清除 TIMER0 中断挂起寄存器,防止其反复相应 LedRun(); } 四,串口发送程序 流程: 初始化 1 设置相应的 GPIO 端口为串口输出端口 2 设置串口发生数据格式 ULCONn 3 设置接收和发生方式 ULCONn 4 设置波特率 rUBRDIVn 发送数据 5 等待发送缓冲区为空 rUTRSTATn 6 向发生数据寄存器写数据 UTXHn 程序: void UartInit(int num, int buad)
{ int i; switch(num) { case 0: rGPHCON |= (1<<5 | 1<<7);//设置 GPH 端口为串口 rULCON0 = 0x03;//设置数据格式为 8 位数据 rUCON0 = (1<<0 | 1<<2); //设置接收和发送为查询模式 rUBRDIV0 = ((int)PCLK/(16*buad) - 1);//设置波特率 break; case 1: rGPHCON |= (1<<9 | 1<<11); rUBRDIV1 = ((int)PCLK/(16*buad) - 1); rULCON1 = 0x03; rUCON1 = (1<<0 | 1<<2); break; case 2: rGPHCON |= (1<<13| 1<<15); rUBRDIV2 = ((int)PCLK/(16*buad) - 1); rULCON2 = 0x03; rUCON2 = (1<<0 | 1<<2); break; default: break; }
rEINTPEND |= (1<<8 | 1<<11 | 1<<13 | 1<<14); //清外部中断挂起寄存器,防止干扰 ClearPending(BIT_EINT8_23);
rEINTMASK &= ~(1<<8 | 1<<11 | 1<<13 | 1<<14); //打开外部中断屏蔽器 //rEXTINIT1 为设置中断触发方式寄存器,因为其默认是低电平触发,所以不需要设 置 EnableIrq(BIT_EINT8_23);//使能中断,其实是打开 MASK
for( i=0; i != 100; ++i);//延时,使设置生效 }
void UartPrintf(char *fmt, ...) {
va_list ap; char string[256];
//将不定参数格式化成字符串 string va_start(ap, fmt); vsprintf(string, fmt, ap); UartSendString(string); va_end(ap); }
ClearPending(BIT_TIMER0);//清除计数器 0 中断挂起寄存器 pISR_TIMER0 = (U32)Timer0Handle; EnableIrq(BIT_TIMER0);//打开 MASK 对定时器 0 的屏蔽
rTCON |=(1<<1); //更新 TCNTB0 和 TCMTB0 的值 rTCON =0; //将 TCON 的值清 0,注这一步很重要,如没有,定时器将一直更新 TCNTB0 和 TCMTB0 的值导致无法启动 rTCON |= (1<<3 | 1<<0);//启动定时器 0,并设置为自动装载
程序: static void __irq KeyHander();//声明中断处理函数 //按键初始化函数 void KeyInit() {
MMU_Init();
rGPGCON |= (1<<1 | 1<<7 | 1<<11 | 1<<13 );//设置 GPGCON 相应端口为中断
pISR_EINT8_23 = (U32)KeyHander;//设置中断程序入口
基于 S3C2440 的 ARM9 基础程序设计及分析 -------JustDo
最近学习了 ARM9 基础程序的设计,记录下所学心得,希望对初学者提供一些帮助。学 习 ARM 程序要注意方法,先去芯片手册的相应模块部分的结构原理框图,搞清楚所使用的 模块的基本原理,然后根据框图搞清楚需要设置哪些对应的寄存器,再根据时序图搞明白相 应寄存器应该怎样设置,再接着理清楚你所写程序的大概流程,最后就可以动手写程序了。 如果把流程理清楚了,你的程序基本上已经成功一半了。 我使用的是 S3C2440 ARM 芯片,如有疑问或者遗漏之处,请联系:qq,843308498。 源码下载地址:http://down load.csd /source /3149713 一 LED 流水灯程序
case 1: while( ! (rUTRSTAT1 & 0x02)); WrUTXH1(byte); break;
case 2: while( ! (rUTRSTAT2 & 0x02)); WrUTXH2(byte); break;
defБайду номын сангаасult: break;
} } 五,ADC 转换程序 流程 初始化 1 设置转换通道和转换频率 ADCCONn 2 清相应的中断挂起寄存器,设置中断入口程序,取消 MASK 屏蔽 启动 3 设置 ADCCONn 相应的位启动转换 中断服务程序 4 通过 SUBSRCPND 判断是不是普通的 ADC 转换 5 清 SUBSRCPND 相应的位 6 读取转换值 ADCDATn 程序 void AD CInit() { int channel = 0, preScaler = 50000000/AD CFRE - 1; rADCCON = (channel<<3) | (preScaler<<6) | (1<<14);//设置 ADC 通道和预分频值 Delay(100);
流程: 1,设置端口控制寄存器将 LED 对应端口设为输出模式 (GPxCON)。 2,向端口对应的数据寄存器发送数据(GPxDAT)。 实现: //这段宏定义了使对应 LED 亮应该送的数据 #define LED1_ON ~(1<<5) #define LED2_ON ~(1<<6) #define LED3_ON ~ (1<<7) #define LED4_ON ~(1<<8)
void SetSysClk()//FCLK=405MHZ FCLK:HCLK:PCLK=1:4:8
{ rMPLLCON = 0; rMPLLCON |= (0x3f<<12 | 2<<4 | 2<<0);//设置 FCLK 的值 rCLKDIVN |= (1<<2 | 1<<0);//设置 FCLK:HCLK:PCLK 的比值 //LOCKTIME 不需要设置,如没设置,系统将自动选择 LOCKTIME }
}
//按键响应函数 void KeyHander() {
ClearPending(BIT_EINT8_23);//清中断挂起寄存器包括 SRCPND INTPND if(rEINTPEND & 1<<8)//通过外部中断挂起寄存器判断是哪个按键请求中断 {
rEINTPEND |= 1<<8;//清外部中断挂起寄存器,防止反复中断 LightLed(1); } if(rEINTPEND & 1<<11) { rEINTPEND |= 1<<11; LightLed(2); } if(rEINTPEND & 1<<13) { rEINTPEND |= 1<<13; LightLed(3); } if(rEINTPEND & 1<<14) { rEINTPEND |= 1<<14; LightLed(4); } } 三 定时器中断程序 CPU 时钟设置流程 1 设置 MPLLCON 寄存器设置 FCLK 2 设置 CLKDIVN 寄存器设置 FCLK:HCLK:PCLK 的值 时钟设置流程 初始化 1 设置分频值 TCFG0 TCFG1 2 设置定时器计数值 TCNTB0 3 设置中断程序入口,清挂起寄存器和关闭 MASK 屏蔽 4 更新 TCTNB0 和 TCMTB0 的值 TCCON 5 将 TCCON 清 0,否则就会 cpu 就会一直在更新 启动定时器 6 启动定时器,TCCON 中断函数 清挂起寄存器,执行响应代码