S3C6410裸机 - 外部中断程序

发布者:TranquilDreamer最新更新时间:2024-09-20 来源: cnblogs关键字:S3C6410  裸机  外部中断程序 手机看文章 扫描二维码
随时随地手机看文章

一、外部中断分组:


外部中断组0  GROUP0  GPN0--GPN15  GPL8--GPL14  GPM0--GPM4


外部中断组1  GROUP1  GPA0--GPA7   GPB0--GPB6


外部中断组2  GROUP2  GPC0--GPC7


外部中断组3  GROUP3  GPD0--GPD5


外部中断组4  GROUP4  GPF0--GPF14


外部中断组5  GROUP5  GPG0--GPG7


外部中断组6  GROUP6  GPH0--GPH9


外部中断组7  GROUP7  GPO0--GPO15


外部中断组8  GROUP8  GPP0--GPP14


外部中断组9  GROUP9  GPQ0--GPQ9


二、中断组的中断号:


NO      中断源                       说明                             GROUP


0      INT_EINT0        外部中断组0 bit[0-3]                   VIC0


1      INT_EINT1        外部中断组0 bit[4-11]                 VIC0


32    INT_EINT2        外部中断组0 bit[12-19]               VIC1


33    INT_EINT3        外部中断组0 bit[20-27]               VIC1


53    INT_EINT4        外部中断组1-9                           VIC1


三、中断程序配置:


1、设置相应的GPIO口为外部中断模式;


所用到的寄存器:GPxCON


1     //清除GPN0 GPN1

2     GPNCON &=~(3 << 0);

3     GPNCON &=~(3 << 2);

4     

5     //GPN0 GPN1设置为中断模式

6     GPNCON |= (1 << 1);

7     GPNCON |= (1 << 3);



2、配置外部中断相关的配置寄存器;

所用到的寄存器:EINT0CONx(配置中断触发方式)

EINT0MASK(失能中断屏蔽,使能中断)

PRIORITY(中断优先级配置)


1     //EINT0,1下降沿触发

2     EINT0CON0 &=~(7 << 0);

3     EINT0CON0 |= (2 << 0);

4     

5     //失能中断屏蔽

6     EINT0MASK &=~(1 << 0);

7     EINT0MASK &=~(1 << 1);


3、使能中断源请求

所用到的寄存器:VICxINTENABLE


1 /使能中断源请求

2 VIC0INTENABLE |= (1 << 0);

 

4、配置向量地址


所用到的寄存器:VIC0VECTADDRx(把中断服务函数的地址写入向量地址寄存器)


1 //配置向量地址

2 VIC0VECTADDR0 = (int)IRQ_Handle_Exit;

 


5、允许向量中断(6410支持非向量中断和向量中断。210只支持向量中断不需要做此步骤)


所用到的寄存器:协处理器CP15的C1控制寄存器(置位bit24)


6、使能IRQ中断(开总中断)


所用到的寄存器:程序状态寄存器CPSR


 1     __asm__(

 2         //允许向量中断

 3         'mrc p15, 0, r0, c1, c0, 0n'

 4         'orr r0, r0, #(1 << 24)n'

 5         'mcr p15, 0, r0, c1, c0, 0n'

 6         //开RIQ总中断

 7         'mrs r0, cpsrn'

 8         'bic r0, r0, #(1 << 7)n'

 9         'msr cpsr_c, r0n'

10         :

11         :

12     );


7、编写中断服务程序


保护现场


中断程序


清除中断标志


EINT0PEND清除中断标志(写1清零)


VICxADDRESS清除向量地址


恢复现场


 1 void IRQ_Handle_Exit(void)

 2 {

 3     //保护现场

 4     __asm__(

 5         'sub lr, lr, #4n'

 6         'stmfd sp!, {r0-r12, lr}n'

 7         :

 8         :

 9     );

10     

11     //服务程序

12     if(EINT0PEND & (1 << 0))            //EINT0

13     {

14         led_all_on();

15     }

16     else if(EINT0PEND & (1 << 1))        //EINT1

17     {

18         led_all_off();

19     }

20     

21     //清除中断标志

22     EINT0PEND = 0xFFFFFFFF;

23     VIC0ADDRESS = 0x00000000;

24     

25     //恢复现场

26     __asm__(

27         'ldmfd sp!, {r0-r12, pc}^n'

28         :

29         :

30     );

31 }


8、启动代码设置


设置IRQ堆栈


 1 //start.S

 2 init_stack:

 3     //初始化IRQ SP

 4     msr cpsr_c, #0xd2

 5     ldr sp, =0x53000000

 6 

 7     //初始化SVC SP

 8     msr cpsr_c, #0xd3

 9     ldr sp, =0x54000000

10     mov pc ,lr


关键字:S3C6410  裸机  外部中断程序 引用地址:S3C6410裸机 - 外部中断程序

上一篇:S3C6410之uboot回炉再造(2)地址无关性
下一篇:使用Libpng库实现Tiny6410显示PNG图片

推荐阅读最新更新时间:2026-03-25 14:50

正在删除 s3c6410裸机程序(2)
  本来以为自己可以很快就把中断程序写好的,但是没想到知道昨天才有了点眉目,虽然还不知道对不对,但是写出来给大家批评指正。   笔者自从上次写了一个轮询式的按键驱动LED灯之后就一直在弄中断这一部分,可是弄来弄去都没什么起色,只好也中断一段时间去配置自己的linux系统,写写应用程序,果然停了几天后突然就成了,真是不知道怎么回事。下面说说笔者的思路。   笔者从《ARM体系结构与编程》这本书中知道了ARM中有七种中断,中断需要中断向量表,而且中断向量表需要放在最低端从地址空间0开始的连续32字节内,为什么七个中断要32字节呢?因为倒数第三个四字节的空间需要空出来。然后是ARM中的中断处理体系,想必阅者都知道x86的中断过程
[单片机]
s3c6410 uart 裸机 轮询 非fifo
/* uart 非中断模式R,轮询,不用fifo */ #include stdio.h #include uart.h #include gpio.h #include sysc.h #define UART0 ( ( volatile UART_REGS * ) (UART_BASE)) u32 Inp32(u32 xx) { return xx; } void GpioInit() { // 设置gpio ,使用uart0 u32 TEMP; TEMP = GPIO- rGPIOACON; TEMP &= ~(0XFF); TEMP |= 0X22; GPIO- rGPIOACON =
[单片机]
S3C6410裸机UART驱动(将printf重定义到串口)
要确保S3C6410已经初始化,一般是使用UBOOT初始化 //串口寄存器 //UART0 #defineULCON0 *((vu32*)0x7F005000) //UART通道0 行控制寄存器 #defineUCON0 *((vu32*)0x7F005004) //UART通道0 控制寄存器 #defineUFCON0 *((vu32*)0x7F005008) //UART通道0 FIFO 控制寄存器 #defineUMCON0 *((vu32*)0x7F00500C) //UART通道0 调制解调器(Modem)
[单片机]
S3C6410裸机RTC实时时钟
相对于STM32,6410的RTC是相当的简单. /*************************************************************************************************************   * 文件名: RTC.c   * 功能:      S3C6410 RTC底层驱动函数   * 作者:      cp1300@139.com   * 创建时间:    2012年3月28日21:52   * 最后修改时间:2012年3月28日   * 详细:      RTC相关底层驱动函数  **********************
[单片机]
s3c6410串口裸机开发串口波特率计算
假设时钟选择为PCLK(S3C6410为66Mhz) 由以下两个公式可以帮助我们通过设置相关寄存器来决定串口波特率 公式1: 公式2: 我们可以先通过公式2算出DIV_VAL的值,然后将接近DIV_VAL的值赋给寄存器UBRDIVn,然后在根据公式1算出num of 1's in UDIVSLOTn。其中UDIVSLOTn的赋值可以根据下表来设置: 通过上述配置,就将UBRDIVn和UDIVSLOTn的值确定下来,从而得到我们想要的波特率bps 将此公式和表格列出,方便以后再做开发使用。 参考: S3C6410 datasheet
[单片机]
<font color='red'>s3c6410</font>串口<font color='red'>裸机</font>开发串口波特率计算
对于c51外部中断程序调用的理解
首先介绍一下C51外部中断的基本概念 中断的优点: 1、实时处理。需要CPU立即做出相应或处理。 2、异常处理。运行过程中,出现断电、程序出错等问题,就需要CPU对故障源进行处理。 3、提高效率。采用中断技术可以大大提高CPU的运行效率。 中断源:C51单片机有5个中断源(2个外部中断、2个定时器中断和一个串口中断)。对中断的配置操作,主要通过控制三个寄存器就可以(中断允许寄存器IE)、定时器控制寄存器(TCON)和中断优先级寄存器(IP)。即通过控制EA EX IT 的直接赋值,即可调用中断服务程序 注:中断服务程序与while(1)中的程序调用是不一样的 中断服务函数:在CPU接收到中断后,会执行相应中断的中断服务函数
[单片机]
对于c51<font color='red'>外部中断</font>和<font color='red'>程序</font>调用的理解
STM32-自学笔记(14.NVIC和外部中断程序用到的库函数介绍)
1.GPIO_EXTILineConfig 函数原型:void GPIO_EXTILineConfig(u8 GPIO_PortSource,u8 GPIO_PinSource) 功能:选择GPIO引脚用作外部中断线路 参数: GPIO_PortSource:选择用作外部中断源的GPIO端口 GPIO_PinSource:待设置的外部中断引脚。该参数可以取GPIO_PinSourcex(x可以是0~15) 返回值:无 参数:GPIO_PortSource GPIO_PortSourceGPIOA 选择GPIOA GPIO_PortSourceGPIOB 选择GPIOB GPIO_Port
[单片机]
STM32-自学笔记(14.NVIC和<font color='red'>外部中断</font>,<font color='red'>程序</font>用到的库函数介绍)
STM32外部中断程序
原理图: 程序分析: #include led.h #include delay.h #include key.h #include sys.h #include usart.h #include exti.h #include beep.h //STM32开发板实验5 //外部中断实验 int main(void) { delay_init(); //延时函数初始化 NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(9600);//串口初始化为9600 LED_Init();
[单片机]
STM32<font color='red'>外部中断</font><font color='red'>程序</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved