一、实验目的
熟悉ARM的定时器的基本设置及应用。
二、实验设备
硬件: PC机
一台
ARM9 S3C2440教学实验开发平台 一套 软件: Windows98/XP/2000系统,MDK集成开发环境
三、实验内容
设置Timer0 0.5秒钟触发一次中断
四、原理及源代码
S3C2440有三种时钟:FCLK(用于CPU核),HCLK(用于主机模块),PCLK(用于外设).两种PLL(锁相环):MPLL(用于设置FCLK,HCLK,PCLK),UPLL(用于设置USB设备)。
S3C2440的CPU核工作电压为1.2V时,主频FCLK可以达到300M,CPU核工作电压为1.3V时,主频FCLK可以达到400M。为了降低电磁干扰,降低板间的布线要求,s3c2410/s3c2440外接的晶振通常很小,一般为12M,那么如何达到主频FCLK的400M的呢?——PLL倍频。
一.设置主频FCLK主要是通过MPLL来软件实现倍频。MPLL主要由3个值MDIV,PDIV,SDIV来决定。而这3个值是由MPLLCON寄存器决定的,MPLLCON的第12位到第19位的值为MDIV,如下所示。
* 对于MPLLCON寄存器,[19:12]为MDIV,[9:4]为PDIV,[1:0]为SDIV * 计算公式:S3C2440: MPLL(FCLK) = (2 * m * Fin)/(p * 2^s) * 其中: m = MDIV + 8, p = PDIV + 2, s = SDIV * 开发板上晶振,Fin = 12MHz
二.设置好了MPLLCON寄存器也就基本上算是设置好了FCLK,可以在此基础上设置HCLK,PCLK,主要是设置分频比,主要通过设置CLKDIV寄存器设置。
三.代码详解: 1.设置/启动MPLL
#define S3C2410_MPLL_200MHZ ((0x5c<<12)|(0x04<<4)|(0x00)) #define S3C2440_MPLL_200MHZ ((0x5c<<12)|(0x01<<4)|(0x02))
/* 对于MPLLCON寄存器,[19:12]为MDIV,[9:4]为PDIV,[1:0]为SDIV * 有如下计算公式:
* S3C2410: MPLL(FCLK) = (m * Fin)/(p * 2^s)
* S3C2440: MPLL(FCLK) = (2 * m * Fin)/(p * 2^s) * 其中: m = MDIV + 8, p = PDIV + 2, s = SDIV * 对于本开发板,Fin = 12MHz
* 设置CLKDIVN,令分频比为:FCLK:HCLK:PCLK=1:2:4, * FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */ void clock_init(void)
{ // LOCKTIME = 0x00ffffff; // 使用默认值即可
CLKDIVN = 0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1
/* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */
__asm__(
\"mrc p15, 0, r1, c1, c0, 0\\n\" /* 读出控制寄存器 */
\"orr r1, r1, #0xc0000000\\n\" /* 设置为“asynchronous bus mode” */ \"mcr p15, 0, r1, c1, c0, 0\\n\" /* 写入控制寄存器 */ );
/* 判断是S3C2410还是S3C2440 */
if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002)) { MPLLCON = S3C2410_MPLL_200MHZ; /* 现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */
} else
{ MPLLCON = S3C2440_MPLL_200MHZ; /* 现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */
} }
2.初始化定时器0,并设置中断。
/* Timer input clock Frequency = PCLK / {prescaler value+1} / {divider value}
* {prescaler value} = 0~255
* {divider value} = 2, 4, 8, 16
* 本实验的Timer0的时钟频率=100MHz/(99+1)/(16)=62500Hz * 设置Timer0 0.5秒钟触发一次中断:*/ void timer0_init(void)
{ TCFG0 = 99; // 预分频器0 = 99
TCFG1 = 0x03; // 选择16分频
TCNTB0 = 31250; // 0.5秒钟触发一次中断 TCON |= (1<<1); // 手动更新
TCON = 0x09; // 自动加载,清“手动更新”位,启动定时器0 }
/* 定时器0中断使能 */ void init_irq(void)
{ // 定时器0中断使能 INTMSK &= (~(1<<10));
}
µC/OS-Ⅱ移植实验
一、实验目的
1.了解uCOS-II内核的主要结构。
2.掌握将uCOS-II内核移植到ARM9处理器上的基本方法。
二、实验设备
硬件: PC机
一台
ARM9 S3C2440教学实验开发平台 一套 软件: Windows98/XP/2000系统,MDK集成开发环境
二、实验原理
所谓移植,指的是一个操作系统可以在某个微处理器或者微控制器上运行。虽然uCOS-II的大部分源代码是用C语言写成的,仍需要用C语言和汇编语言完成一些与处理器相关的代码。比如:uCOS-II在读写处理器、寄存器时只能通过汇编语言来实现。因为uCOS-II在设计的时候就已经充分考虑了可移植性,所以,uCOS-II的移植还是比较容易的。
三、实验步骤
1.将uCOS-II内核移植到ARM9微处理器上。
2.编写两个简单任务,在超级终端上观察两个任务的切换来测试一下移植是否成功。
为了使uCOS-II可以正常运行,除了上述必须的移植工作外,硬件初始化和配置文件也是必须的。STARTUP目录下的文件还包括中断处理,时钟,串口通信等基本功能函数。
在文件main.c中给出了应用程序的基本框架,包括初始化和多任务的创建,启动等。任务创建方法如下:
1)在程序开头定义任务堆栈,任务函数声明和任务优先级:
OS_STK TaskName_Stack[STACKSIZE]={0, }; //任务堆栈 void TaskName(void *Id); //任务函数 #define TaskName_Prio N //任务优先级
2)在main()函数中调用OSStart()函数之前用下列语句创建任务:
OSTaskCreate(TaskName,(void*)0,(OS_STK*)&TaskName_Stack[STACKSIZE-1], TaskName_Prio);
OSTaskCreate()函数的原型是:
INT8U OSTaskCreate (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT8U prio);
需要将任务函数TaskName,任务堆栈TaskName_Stack,任务优先级TaskName_Prio三个参数传给OSTaskCreate()函数。根据任务函数的内容决定堆栈大小,宏STACKSIZE定义为4KB,可以在此基数上乘倍。任务优先级越高,TaskName_Prio值越小;uCOS-II可以管理64个任务,由OSInit()创建的空闲任务的优先级最低为63;uCOS-II保留4个最高和4个最低优先级,用户任务可以使用其余56个优先级值。
3)编写任务函数内容:
void TaskName(void *Id) {
//添入任务初始化语句 for(;;)
{ //添入任务循环内容
OSTimeDly(SusPendTime);//挂起一定时间,以使其他任务可以占用CPU
} }
uCOS-II至少要有一个任务,这里首先创建一个系统任务SYS_Task,其中由语句
OSRunning=TRUE; //使能uCOS-II运行 uHALr_InstallSystemTimer(); 启动系统时钟和多任务切换。
为了验证uCOS-II多任务切换的进行,再编写两个简单的任务,分别在超级终端上输出run task1和run task2。可以参考main.c的结构创建多个不同功能的任务,观察个任务的切换。
3.编译并下载移植后的uCOS-II
所有的源代码都准备好后就可以进行编译了。在ADS环境下需要设置工程的访问路径。从菜单Edit | Debug Settings进入设置对话框,在Target | Access Paths 中选择User Paths并选上Always search user paths。然后点Add按钮添加路径ucos-ii和arch。这主要是设置编译器处理文件包含时的搜索范围。
按照实验一的方法可以对编译后的代码进行调试或下载到平台的电子硬盘中。这个实验从结构上看和其他的实验没有多大区别,同样生成可执行文件system.bin。可以在平台BIOS中激活电子硬盘,然后把system.bin拷贝进去,重启平台,然后在超级终端上观察结果。
4.实验结果是超级终端上交替显示run task1,run task2,run task1,run task1,run task1,run task2,run task1,run task1,run task1。表明由于task1的优先级为12,而task2的优先级为15,所以系统在task1和task2同时就绪时总是先执行task1后执行task2.由于task2挂起时间为3秒,所以在task2挂起期间task1能执行两次,而当第三次时由于task1与task2同时处于就绪态,由优先级次序,还是先执行task1在执行task2.然后就这样周而复始的循环下去。
基于µC/OS-Ⅱ的人机交互输入与输出程序设计
一、实验目的
(1) 掌握将μC/OS-II 操作系统移植到ARM9 处理器的方法。 (2) 了解μC/OS-II 操作系统的基本原理和移植条件。
二、实验设备
硬件:PC 机 一台,ARM9 S3C2440 教学实验开发平台一套
软件:Windows98/XP/2000 系统,MDK 集成开发环境,μC/OS-II 操作系统(V2.52)
三、实验内容
学习移植 μC/OS-II 操作系统到ARM9 处理器,然后编写一个简单的多任务应用程序,实现键盘与数码管显示。
四、实验步骤
1. 理解并掌握键盘和数码管显示驱动电路结构和功能实现方法。 2. 编写数码管显示驱动程序。 3. 编写键盘识别与码值存储程序。
4. 编写简单任务,测试一下移植是否成功。 3. 编译并下载移植后的uCOS-II。 4. 实验结果是开发板上进行验证。
因篇幅问题不能全部显示,请点此查看更多更全内容