`
java-mans
  • 浏览: 11710945 次
文章分类
社区版块
存档分类
最新评论

Maray中对8259A PIC的初始化代码

 
阅读更多

学习接口,才发现原来做的很多事情是在对接口在编程:(

捡起到处凑出来的代码看看,唉,其实真的很简单!

重新写了些注释,为后来人铺路~


/**//*
Name:irq.c
Copyright:GPL
Author:Raywill
Date:22-12-06
Description:init,disableandenableinterruptprocedure
*/


#ifndefIRQ1_PORT
#defineIRQ1_PORT
0x21
#defineIRQ2_PORT
0xA1
#endif
/**//*
关于8259A
1.8259A是PC中管理中断的芯片。在实际PC主板中并不能找到8259,
这是因为它被集成到了一个大规模芯片中去了,其可提供的功能于8259等价
作为OSer,我们我们完全可以当做PC中含有8259芯片。

2.8259工作前需要对其初始化,包括
1)中断请求方式的设定(ICW1)
2)中断类型号的设定(ICW2)
3)中断级联方式的设定(ICW3)
4)特定完全嵌套方式(ICW4)

3.PIC端口地址
MasterPICcommand0x20
MasterPICdata0x21
SlavePICcommand0xA0
SlavePICdata0xA1

4.对init_irq()函数中的操作的解释
==========================================
outportb(0x20,0x11);
*)对ICW1编程使用20H号端口(A0=0)
*)11H=00010001B
D7-D5000中断向量地址的A7~A5
D4=1
D30边缘出发输入
D20调用间隔为8
D10级联方式
D01要写ICW4

==========================================

outportb(0x21,irq0_int);
outportb(0xA1,irq8_int);

*)对ICW2编程使用21H号端口(A0=1)
*)irq0_int=20H=00100000B
D7-D300100中断类型号高5位100000=20H
经过这一步后,IR0对应的中断号码为100000B=20H
IR1对应的中断号码为100000B=21H
·······
IR7对应的中断号码为100000B=27H
D2-D0000低三位中断类型号,由硬件IR0~IR7提供
*)irq8_int=28H=00101000B;
D7-D300101中断类型号高5位101000=28H
经过这一步后,IR8对应的中断号码为100000B=28H
IR9对应的中断号码为100000B=29H
·······
IR15对应的中断号码为100000B=2FH
D2-D0000低三位中断类型号,由硬件IR8~IR15提供

==========================================

outportb(0x21,0x04);//对主片(Master)编程
outportb(0xA1,0x02);//对从片(Slave)编程
*)对ICW3编程使用21H号端口(A0=1)
*)只有配置成为级联模式才需要设置ICW3
*)主片和从片的ICW各位表示的含义不同
*)主片
04H=00000010B
1)D7-D000000010INT级联掩码,第二位S1=1表示从片是通过IR1引脚连接到主片的
*)从片
02H=00000010
1)D7-D300000保留不用,全置零
2)D2-D0010表示本从片的INT信号连接到主片的第几个引脚,
010B表示2号引脚,和主片中的04H正好对应

==========================================

outportb(0x21,0x01);
outportb(0xA1,0x01);
*)01H=00000001
D7-D5000强制为0
D40非特殊全嵌套方式
D3-D200非缓冲方式
D10正常EIO(需要在中断末尾加入中断结束命令)
D01MCS8086/88模式

==========================================

5.对上面过程的总结
init_irq主要做了下面几件事:
1)重定向中断向量位置
Thedefault(BIOS-defined)vectoroffsetsare8forMasterPICand0x70forSlavePIC:
Master:IRQ0..7->INT8..0xF(vectoroffset=0x08)
Slave:IRQ8..15->INT0x70..0x77(vectoroffset=0x70)
However,thesedefaultvaluesdon'tsuittheneedsofProtectedModeprogramming:there'sacollisionbetweenIRQs0..7(mappedtoINT8..0xF)andprocessorexceptions(INT0..0x1Farereserved).Consequentlyyouwouldn'tbeabletotellthedifferencebetweenanIRQoransoftwareerror.
2)对级联进行编程,确定工作模式

6.ICW初始化完成后,就可以对PIC发OCW命令字了用来初始化中断屏蔽字
MasterPICdata0x21
SlavePICdata0xA1
Di=1为关i对应中断,Di=0为关闭对应中断
Maray中代码为:
//DisableAllInterruptFirst
outportb(0x21,~0x00);
outportb(0xA1,~0x00);
*/

voidinit_irq()
...{
staticconstunsignedirq0_int
=0x20,irq8_int=0x28;
/**//**/

/**//*InitializationControlWord#1(ICW1)*/
outportb(
0x20,0x11);
outportb(
0xA0,0x11);
/**//*ICW2:
routeIRQs0-7toINTs20h-27h
*/

outportb(
0x21,irq0_int);
/**//*routeIRQs8-15toINTs28h-2Fh*/
outportb(
0xA1,irq8_int);
/**//*ICW3*/
outportb(
0x21,0x04);
outportb(
0xA1,0x02);
/**//*ICW4*/
outportb(
0x21,0x01);
outportb(
0xA1,0x01);
/**//*enableIRQ0(timer)andIRQ1(keyboard)*/
outportb(
0x21,~0x00);/**//*onlykeyboardfortesting*/
outportb(
0xA1,~0x00);

kprintf(
"8259initOK! ");
}


voidenable_irq(intirq)
...{
/**//*twocase:irq<8,irq>=8*/
bytebit=1;

if(irq>(15+IRQ_OFFSET)||irq<(0+IRQ_OFFSET))return;

bit
<<=irq%8;
if(irq<(8+IRQ_OFFSET))...{
outportb(IRQ1_PORT,
~bit&inportb(IRQ1_PORT));
}
else...{
outportb(IRQ2_PORT,
~bit&inportb(IRQ2_PORT));
}

}


voiddisable_irq(intirq)
...{
/**//*twocase:irq<8,irq>=8*/
bytebit=1;

if(irq>(15+IRQ_OFFSET)||irq<(0+IRQ_OFFSET))return;

bit
<<=irq%8;
if(irq<(8+IRQ_OFFSET))...{
outportb(IRQ1_PORT,bit
|inportb(IRQ1_PORT));
}
else...{
outportb(IRQ2_PORT,bit
|inportb(IRQ2_PORT));
}

}

分享到:
评论

相关推荐

    8259A的编程(初始化和编程)

    1. **ICW1设置**:设置ICW1(初始化命令字1)告诉8259A将要进行初始化,并选择级联模式(如果使用了从8259A)。 2. **ICW2设置**:设置ICW2(初始化命令字2)定义主8259A和从8259A的中断输入线(IRQ线)。例如,主...

    PIC18系列单片机各个功能模块的通用初始化代码

    标题"PIC18系列单片机各个功能模块的通用初始化代码"揭示了这个压缩包文件包含的是针对PIC18系列单片机的各种功能模块的初始化程序。PIC18系列是Microchip公司生产的8位微控制器,广泛应用于嵌入式系统设计。初始化...

    PIC单片机初始化设置助手

    标题中的“PIC单片机初始化设置助手”是一个专门针对初学者设计的工具,旨在帮助他们更好地理解和操作PIC系列单片机的初始化设置。PIC单片机是由Microchip Technology公司生产的微控制器,广泛应用在各种电子设备中...

    pic单片机串口初始化相关命令

    在本篇文章中,我们将深入探讨有关PIC单片机串口初始化的相关命令,特别是针对18F2580型号的单片机。通过对所提供的代码片段进行解析,我们可以了解到如何通过编程来实现串口通信的基本设置。 ### PIC单片机串口...

    8259a中断控制程序

    例如,在实验提供的源代码中,以下指令用于初始化8259A: ```assembly mov dx, 203h ; 设置初始化命令寄存器ICW1 mov al, 36h ; ICW1值 out dx, al mov dx, 200h ; 设置ICW2寄存器地址 mov al, 00h ; ICW2值 out dx,...

    PIC16F1829 TIMER1初始化程序

    通过以上的内容,可以了解到PIC16F1829中TIMER1初始化程序的基本结构和关键设置。程序中不仅涉及到了分频值、时钟源、中断使能的设置,还包括了如何通过宏定义简化配置过程,并最终通过函数调用来激活TIMER1模块。...

    PIC18F65K40 PIC18F66K40 PIC18F67K40 多usart 串口初始化以及发送代码

    PIC18F65K40 PIC18F66K40 PIC18F67K40 多usart 串口初始化以及发送代码 K40系列 发送字符串有IC 硬件BUG 请查看官方的勘误手册

    C#例子代码 A4002_PI

    C#例子代码 A4002_PIC#例子代码 A4002_PIC#例子代码 A4002_PIC#例子代码 A4002_PIC#例子代码 A4002_PIC#例子代码 A4002_PIC#例子代码 A4002_PIC#例子代码 A4002_PIC#例子代码 A4002_PIC#例子代码 A4002_PIC#例子代码...

    PIC16F1829 TIMER0初始化程序

    在介绍PIC16F1829单片机的TIMER0初始化程序之前,我们需要了解一些基础概念和术语。PIC单片机是由Microchip Technology Inc.(微芯科技公司)生产的一系列8位微控制器产品,广泛应用于嵌入式系统设计。PIC16F1829是...

    8259_experiment_8259A实现快关灯控制_proteus8259_开关灯_proteus_8259_

    8259A是Intel设计的一种可编程中断控制器( Programmable Interrupt Controller,PIC),它在早期的个人计算机系统中广泛用于管理和处理中断请求。在这个实验中,8259A被用来实现一个简单的快关灯控制功能,通过循环...

    PIC16F690 时钟初始化实例

    本文将深入探讨如何对PIC16F690这款微控制器进行时钟初始化,并提供一个具体的示例程序。 #### 二、PIC16F690 时钟源与配置 在开始之前,我们需要了解几个关于PIC16F690的关键概念: 1. **时钟源选择**:可以选择...

    8259a芯片设计文件

    在早期的个人计算机(PC)系统中,尤其是基于IBM PC兼容架构的系统中,8259A扮演了重要的角色,它能够帮助CPU有效地管理多个中断源,提高系统的响应速度。 8259A芯片包含两个独立的中断控制器,通常被称为主中断...

    PIC16f877a课程实验代码

    标题中的“PIC16F877A课程实验代码”表明这是一个关于微控制器 PIC16F877A 的教学项目,其中包含了用于实验的源代码。PIC16F877A是Microchip Technology公司生产的一款8位微控制器,广泛应用在嵌入式系统设计中。这...

    PIC16F877A和LCD1602液晶显示以及mpx4250压力传感器显示代码实测可以

    这些代码可能包含了初始化ADC、设置LCD1602显示、读取MPX4250数据、处理和显示压力值等关键函数。通过分析这些代码,开发者可以了解到如何配置和操作这些硬件组件,以及如何编写相应软件来实现特定的测量和显示任务...

    PIC16F877A OLED显示 汉字源代码

    标题 "PIC16F877A OLED显示汉字源代码" 涉及到的是一个基于PIC16F877A微控制器的项目,该项目使用了有机发光二极管(OLED)显示器来呈现汉字和字符数字。PIC16F877A是Microchip Technology公司生产的一款8位微控制器...

    LCD1602_PIC16_driver_for_C.zip_PIC16初始化_单片机

    //单片机:PIC16F877A(4MHz) //******************初始化说明************************** //4位总线方式初始化,应注意LCD接线方式,及初始化首条指令 //4位总线初始化方法:因LCD加电初始化后默认为8位总线方式, //故...

    pic16f887 883单片机编程实例教程

    在上述提供的内容中,首先介绍了如何初始化PIC16F887/883单片机的I/O端口,并通过一个无限循环,向PORTD端口输出数据(0XF0),同时涉及到SPI(Serial Peripheral Interface)的初始化设置,包括清空PIR1寄存器的...

    PIC单片机内部A/D转换

    init函数负责初始化单片机的A/D转换模块及相关I/O端口。其中,TRISA=0x01和TRISD=0分别设置了PIC单片机端口RA0作为输入和端口RD作为输出。ADCON0和ADCON1寄存器的设置指定了A/D转换器的时钟分频、参考电压源、通道...

    PIC18定时器 ADC,PWM,串口出初始化设置

    关于PIC18系列控制器的ADC,PWM,串口的初始值设置问题,填入相关的参数即可。

    PIC单片机A\D转换实验程序代码

    2. **程序代码**:提供了一个完整的实验程序代码示例,包括了配置、初始化、A/D转换、数据处理及显示等步骤。 3. **数据分析**:通过对转换结果的分析,验证程序的正确性并加深对A/D转换的理解。 #### 硬件配置 ...

Global site tag (gtag.js) - Google Analytics