📄 interrupt.c
字号:
#pragma language=extended // enable use of extended keywords
#include <stdio.h>
#include <inarm.h>
#include <arm_interrupt.h>
#include <ioml674001.h>
#include "Utilities.h"
const unsigned int RESET_VEC_ADDR = 0x0;
__irq __arm void irqHandler(void);
/********************************************************************
* 函数名: install_handler
* 输入: vector - 中断向量
* function - 函数地址
* 返回: 原向量地址内容
* 说明: 将"function"函数安装到由"vector"指定的向量地址,在向量地址处放
* 置一条转移到该函数的分支指令,原向量地址内容被返回,并可以用于
* 链接另一个句柄。
********************************************************************/
static unsigned int install_handler(unsigned int *vector,
unsigned int function) {
unsigned int vec, old_vec, vectoraddr;
old_vec = *vector;
vectoraddr = 4*(vector-resetvec) + RESET_VEC_ADDR;
vec = ((function - vectoraddr - 8) >> 2);
vec |= 0xea000000; // 为B指令添加操作码
*vector = vec;
old_vec &= ~0xea000000;
old_vec = ( old_vec << 2 ) + vectoraddr + 8;
return(old_vec);
}
/********************************************************************
* 函数名: InitUart
* 输入: 无
* 输出: 修改UART配置寄存器
* 返回: 无
* 说明: 对UART进行初始化
********************************************************************/
static void InitUart(void) {
UARTFCRIIR_bit.FCR0 = 0; // 无缓冲操作
UARTLCR_bit.LCR10 = 3; // 8位字符
UARTLCR_bit.LCR2 = 0; // 1位停止位
UARTLCR_bit.LCR3 = 0; // 无校验
UARTLCR_bit.LCR7 = 1; // 允许访问UARTDLL/DLH
UARTDLL = 0xD7; // 9600 波特率,33MHz CCLK
UARTDLM = 0x00;
UARTLCR_bit.LCR7 = 0; // 允许访问UARTRBR/THR
UARTIER_bit.IER0 = 1; // 允许接收中断数据
ILC1_bit.ILR9 = 4; // 设置UART中断优先级
}
int callCount = 0;
static void do_foreground_process( void ) {
putchar('.');
}
// IRQ句柄
__irq __arm void irqHandler(void) {
unsigned int fib;
// 仅使用UART接收中断,因此不用检查中断源
// 从UART接收缓冲区读取fib数值
fib = UARTRBRTHR;
put_fib(fib);
++callCount;
// 清除当前中断
CILCL = 0;
}
void main( void ) {
// 初始化UART及fibonacci数列
init_fib();
InitUart();
// 将irqHandler函数安装到向量irqvec
install_handler(irqvec, (unsigned int)irqHandler);
__enable_interrupt();
// 进入循环等待,中断发生时获取数据
while (callCount < MAX_FIB) {
do_foreground_process();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -