⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interrupt.c

📁 《IAR EWARM 嵌入式系统 编程与实践》书中例程
💻 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 + -