教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 范文大全 > 资料大全 >

东莞理工学院 arm期末参考资料——程序题

来源:网络收集 时间:2026-09-12
导读: 东莞理工学院 arm期末参考资料 东莞理工学院 arm期末参考资料——程序题 1.编写设置系统时钟的程序。Fin=12MHZ,要求fclk:hclk:pclk=200:100:50M HZ MPLLCON:设为(0x5c 12)|(0x04 4)|(0x00),即0x5c0040 对于MPLLCON寄存器,[19:12]为MDIV,[9:4]为PDIV,[1:

东莞理工学院 arm期末参考资料

东莞理工学院 arm期末参考资料——程序题

1.编写设置系统时钟的程序。Fin=12MHZ,要求fclk:hclk:pclk=200:100:50M HZ

MPLLCON:设为(0x5c << 12)|(0x04 << 4)|(0x00),即0x5c0040

对于MPLLCON寄存器,[19:12]为MDIV,[9:4]为PDIV,[1:0]为SDIV。有如下计算公式:

MPLL(FCLK) = (m * Fin)/(p * 2^s)

其中: m = MDIV + 8, p = PDIV + 2

Fin 即默认输入的时钟频率12MHz。MPLLCON设为0x5c0040,可以计算出FCLK=200MHz,再由CLKDIVN的设置可知:HCLK=100MHz,PCLK=50MHz。

程序如下:

#define rLOCKTIME (*(volatile unsigned *)0x4c000000) //PLL lock time

#define rMPLLCON (*(volatile unsigned *)0x4c000004) //MPLL Control

#define rCLKCON (*(volatile unsigned *)0x4c00000c) //Clock

#define rCLKDIVN (*(volatile unsigned *)0x4c000014) //Clock pider

#define rUPLLCON (*(volatile unsigned *)0x4c000008) //UPLL Control

#define rCLKSLOW (*(volatile unsigned *)0x4c000010) //Slow clock

void clock_init(void){

rLOCKTIME = 0xFFFFFF; 设定锁定时间

rCLKDIVN = 0x3; 设定分频比例fclk:hclk:pclk=1:2:4

rMPLLCON = 0x5c0040; }

用汇编程序:

rLOCKTIME equ 0x4c000000 rMPLLCON equ 0x4c000004

rCLKCON equ 0x4c00000c

ldr r0 , = rLOCKTIME mov r1 ,# 0xFFFFFF str r1 ,[r0]

ldr r0 , = rMPLLCON mov r1 ,# 0x03 str r1 ,[r0]

ldr r0 , = rCLKCON mov r1 ,# 0x5c0040 str r1 ,[r0]

2.利用计时器,Fin=12MHZ,fclk:hclk:pclk=200:100:50,编写定时2秒的程序。

#define rTCFG0 (*(volatile unsigned *)0x51000000) //Timer 0 configuration

#define rTCFG1 (*(volatile unsigned *)0x51000004) //Timer 1 configuration

#define rTCON (*(volatile unsigned *)0x51000008) //Timer control

#define rTCNTB0 (*(volatile unsigned *)0x5100000c) //Timer count buffer 0

* Timer input clock Frequency = PCLK / {prescaler value+1} / {pider value}

* {prescaler value} = 0~255

* {pider value} = 2, 4, 8, 16

* Timer0的时钟频率=100MHz/(99+1)/(16)=62500Hz

void timer0_init(void){

rTCFG0 = 99; // 预分频器0 = 99

rTCFG1 = 0x03; // 选择16分频

rTCNTB0 = 250000; // 2秒钟计时 ,250000/62500=2秒

rTCON |= (1<<1); // 手动更新

rTCON = 0x09; // 自动加载,清“手动更新”位,启动定时器0 }

汇编程序:

rTCFG0 equ 0x51000000 rTCFG1 equ 0x51000004

rTCNTB0 equ 0x5100000c rTCON equ 0x51000008

ldr r0 , = rTCFG0 mov r1 ,# 0x63 str r1 ,[r0] // 预分频器0 = 99

ldr r0 , = rTCFG1 mov r1 ,# 0x03 str r1 ,[r0] // 选择16分频

ldr r0 , = rTCNTB0 mov r1 ,# 250000 str r1 ,[r0] // 2秒钟计时

ldr r0 , = rTCON mov r1 ,# 0x02 str r1 ,[r0] // 手动更新

东莞理工学院 arm期末参考资料

ldr r0 , = rTCON mov r1 ,# 0x09 str r1 ,[r0] 自动加载,清“手动更新”位,启动定时器0

3.编写外中断为EINT0,EINT1,EINT2时的设置程序和中断服务子程序,中断服务子程序内容自定。

中断发生后,首先进行现场保护,接下来转入中断的入口代码处执行,该部分代码通常使用汇编语言书写。在执行中断服务程序之前,首先要确保HandleIRQ地址处保存中断分发程序IsrIRQ的入口地址。

ldr r0,=HandleIRQ

ldr r1,=IsrIRQ

str r1,[r0]

接下来将执行IsrIRQ中断分发程序,具体代码如下:

IsrIRQ

sub sp,sp,#4 ;为保存PC预留堆栈空间

stmfd sp!,{r8-r9}

ldr r9,=INTOFFSET

ldr r9,[r9] ;加载INTOFFSET寄存器值到r9

ldr r8,=HandleEINT0 ;加载中断向量表的基地址到r8

add r8,r8,r9,lsl #2 ;获得中断向量

ldr r8,[r8] ;加载中断服务程序的入口地址到r8

str r8,[sp,#8] ;保存sp,将其作为新的pc值

ldmfd sp!,{r8-r9,pc} ;跳转到中断服务子程序执行

。。。

HandleEINTO DCD INT0

DCD INT1

DCD INT2

DCD INT3

各子程序:

INT0

.

清除SRCPND,INTPND

SUBS PC,R14,#0X04

INT1

清除SRCPND,INTPND

SUBS PC,R14,#0X04

INT2

清除SRCPND,INTPND

SUBS PC,R14,#0X04

INT3

..

清除SRCPND,INTPND

SUBS PC,R14,#0X04

汇编程序:

rGPFCON equ 0x56000050

rEXTINTO equ 0x56000088

rEXTINT1 equ 0x5600008c

rEXTINT2 equ 0x56000090

SRCPND equ 0x4a000000

INTPND equ 0x 4a000010

INTMASK equ 0x 4a000008

INTOFFSET equ 0x 4a000014

Area int ,code readonly

东莞理工学院 arm期末参考资料

Mrs r0 ,spsr

Bic r0,r0,0xc0

Msr spsr_cxsf,r0 ;开I,F总中断

ldr r0 , = rGPFCON

mov r1 ,# 0x2a

str r1 ,[r0] ;功能方式

ldr r0 , = rEXTINTO

mov r1 ,# 0x4 ;触发方式

str r1 ,[r0]

ldr r0 , = rEXTINT1

mov r1 ,# 0x040触发方式

str r1 ,[r0]

ldr r0 , = rEXTINT2

mov r1 ,# 0x400

str r1 ,[r0] ; 触发方式

LDR R0 ,=SRCPND ; MOV R1,#0X0000 ; STR R1,[R0] ;

LDR R0 ,=INTPND ; MOV R1,#0X0000 ; STR R1,[R0] ;

LDR R0 ,=INTMASK ; MOV R1,#0X0000 ; STR R1,[R0] ;优先缺省

;IsrIRQ的入口地址。

ldr r0,=HandleIRQ

ldr r1,=IsrIRQ

str r1,[r0]

接下来将执行IsrIRQ中断分发程序,具体代码如下:

IsrIRQ

sub sp,sp,#4 ;为保存PC预留堆栈空间

stmfd sp!,{r8-r9}

ldr r9,=INTOFFSET

ldr r9,[r9] ;加载INTOFFSET寄存器值到r9

ldr r8,=HandleEINT0 ;加载中断向量表的基地址到r8

add r8,r8,r9,lsl #2 ;获得中断向量

ldr r8,[r8] ;加载中断服务程序的入口地址到r8

str r8,[sp,#8] ;保存sp,将其作为新的pc值

ldmfd sp!,{r8-r9,pc} ;跳转到中断服务子程序执行

HandleEINTO DCD INT0

DCD INT1

DCD INT2

各子程序:

INT0

. 中断服务程序1 (略)

LDR R0 ,=SRCPND ; MOV R1,#0X0000 ; STR R1,[R0] ;

LDR R0 ,=INTPND ; MOV R1,#0X0000 ; STR R1,[R0] ;清除SRCPND,INTPND

SUBS PC,R14,#0X04

INT1

中断服务程序2 (略)

LDR R0 ,=SRCPND ; MOV R1,#0X0000 ; STR R1,[R0] ;

东莞理工学院 arm期末参考资料

LDR R0 ,=I …… 此处隐藏:6823字,全部文档内容请下载后查看。喜欢就下载吧 ……

东莞理工学院 arm期末参考资料——程序题.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/fanwen/1815934.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)