学习ARM开发(17)

发布者:JoyfulSpirit最新更新时间:2024-11-14 来源: cnblogs关键字:ARM开发  中断  S3C44B0 手机看文章 扫描二维码
随时随地手机看文章

因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序,然后不断地调试。在这个程序之前,先要深入去了解ARM的中断方式,知道它有7种工作方式。下面先看初始化的代码是怎么样初始化不同模式栈的。


/*  IRQMODE。  */   
orr     r1,r0,#0x12|0xc0
msr     cpsr,r1  
ldr     sp,=IRQ_MODE_SP_START

这段代码,就是初始化IRQ模式的栈,这样在IRQ中断时就可以使用栈了。

S3C44B0的中断过运行过程是这样的:
当有中断发生时,就会跳到FLASH中的地址0x18处理取到一条指令并执行,因为那里只允许放一条指令,因此只能放一条跳转指令了。比如:ldr pc,=0x0c000018  ,这条指令就是跳到SDRAM里运行,意思从0x0c000018取一条指令运行,其实我总是在那地址里放一条跳转指令的,这样又到相应的中断处理程序了。比如在那里一条:

b irq,这条指令就是跳到IRQ的中断处理程序运行,它的作用就是根据不同的中断源来进一步查找不同的中断处理程序。它的代码如下:

/*
采用IRQ中断,查找各个中断的入口函数地址,并且跳到相应的入口函数运行。 
*/

irq:sub     sp,sp,#4       /* 保留一个栈给PC */
    stmfd   sp!,{r8-r9}  
  
    ldr     r9,=I_ISPR    /* 读取中断源寄存器 */
    ldr     r9,[r9]

    cmp  r9, #0x0 /* 如果没有中断源发生,就退出去。 */
    beq  IDLE_IRQ
 
    mov     r8,#0x0    /* 计算中断源对应的中断程序位置  */
LOOP_IRQ:
    movs    r9,r9,lsr #1
    bcs     HAVE_IRQ
    add     r8,r8,#4   /* 每个中断入口占4个字节 */
    b     LOOP_IRQ

HAVE_IRQ:
    ldr     r9,=CONFIG_SDRAM_START+4*8  /* 从HandleADC中断入口  */
    add     r9,r9,r8
    ldr     r9,[r9]
    str     r9,[sp,#8]           /* 保存到前面保留的SP位置 */
       
    ldmfd   sp!,{r8-r9,pc}      /* 跳到中断程序运行.  */

IDLE_IRQ:                       /* 没有中断处理。 */
 ldmfd sp!,{r8-r9}
 add sp,sp,#4
 subs pc,lr,#4

这段代码的功能就是先从S3C44B0的中断源保存寄存器I_ISPR取出中断源的标识位,然后不断移位,判断这位是否有中断,如果有中断就处理它。根据移位来算出它的中断入口地址在那里,这样的做法,就可以动态地改变中断入口函数。CONFIG_SDRAM_START+4*8,这个就是中断入口函数基地址,如果是第一位有中断,就是ADC中断。


那么就直接跳到这个地址运行就OK了。

比如我使用S3C44B0的TICK中断,就是时间片中断。就会在相应的地址设置入口函数,使用如下代码:
///////////////////////////////////////////////////////////////////////////////
//函数名称:   TickInstall
//函数功能:   安装Tick中断函数。
//输入参数:
//输出参数:
//返 回 值:   
//开发人员:   蔡军生
//时    间:   2006/02/13
//修改说明:  
//
///////////////////////////////////////////////////////////////////////////////
void TickInstall(unsigned int nTickFunc)
{
 //
 *((unsigned int *)(INT_ADDR_START + 20*4)) = nTickFunc; 
}

上面语句就是把一个中断入口函数设置为时间片运行函数。当有TICK中断时,就会跑到时间片函数里运行了。
总结一下,写一个S3C44B0的中断处理需要做以下几部分工作:

1. 在FLASH里0x18处放一条跳转指令,跳到SDRAM里运行。
2. 在SDRAM里0x0c000018处,放一条跳转指令,跳到IRQ子程序运行。
3. 写一段IRQ处理程序。
4. 写一段处理实际中断源的处理函数。
5. 设置中断寄存器,清除中断源屏蔽位。


关键字:ARM开发  中断  S3C44B0 引用地址:学习ARM开发(17)

上一篇:学习ARM开发(18)
下一篇:学习ARM开发(16)

推荐阅读最新更新时间:2024-11-14 11:34

HAL库中断处理以及相关的回调函数
今天就分享一个读者问到的关于中断处理的问题。 很多人都知道STM32CubeMX这套工具的一个目的:减少开发者对STM32底层驱动的开发时间,把重心放在应用代码上。 但是,STM32CubeMX只是生成了底层驱动的初始化代码。所以,我们还需要掌握:应用层代码如何调用HAL库函数(API接口),以及HAL库中断处理机制等相关知识。 HAL库牵涉的内容较多,下面简单描述一下HAL库中断处理,以及相关的回调函数。 1HAL库中断处理机制 之前使用标准外设库开发时,中断程序(函数)由我们自己实现。 而HAL库的中断处理函数是按照HAL处理机制来实现,如USART1,统一由HAL_UART_IRQHandler来进行处理,如下图: 其
[单片机]
HAL库<font color='red'>中断</font>处理以及相关的回调函数
51单片机入门教程(6)——外部中断
一、外部中断 1.1 中断 关于中断的概念在上一篇博客中已经提到了。(传送门:51单片机入门教程(5)——定时器中断) 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。 51单片机的中断源优先级与向量号如下表: 中断源 优先级 中断向量号 INT0 – 外部中断0 最高 0 T0 – 定时器/计数器0中断 第2 1 INT1 – 外部中断1 第3 2 T1 – 定时器/计数器1中断 第4 3 串口中断 第5 4 T2 – 定时器/计数器2中断 最低 5 1.2 外部中断 除了定时器中断外,51单片机还有两个外部中断源
[单片机]
51单片机入门教程(6)——外部<font color='red'>中断</font>
每一个GPIO如何配置成一个外部中断触发源
STM32中断分组 STM32 的每一个GPIO都能配置成一个外部中断触发源,这点也是 STM32 的强大之处。STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0为第一组,那么依此类推,我们能得出一共有16 组,STM32 规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F103 的19 个外部中断为: 线 0~15:对应外部 IO 口的输入中断。 线 16:连接到 PVD 输出。 线
[单片机]
STM32学习笔记(2) 使用外部中断控制按键
中断概述 中断:打断CPU正常程序运行,转去执行中断服务函数的内容,然后再回来执行原来的程序 NVIC:嵌套向量中断控制器,属于内核外设,管理怎与中断相关的功能 typedef struct { uint8_t NVIC_IRQChannel; //中断源 uint8_t NVIC_IRQChannelPreemptionPriority; //抢占优先级 uint8_t NVIC_IRQChannelSubPriority; //子优先级 FunctionalState NVIC_IRQChannelCmd; //使能或失能 } NVIC_InitTypeDef;
[单片机]
STM32学习笔记(2) 使用外部<font color='red'>中断</font>控制按键
C51中断函数格式
C51 Keil 编译器中断函数语法定义: void 函数名() interrupt n using m C51编译器允许0~31个中断,C51控制器所提供的中断及中断地址如下: 中断号 中断源 中断地址 0 EXTERNAL 0 0003H 1 TIMER/COUNTER 0 000BH 2 EXTERNAL 1 0013H 3 TIMER/COUNTER 1 001BH 4 SERIAL PORT 0023H 中断函数编写规则: 不能进行参数传递 无返回值 在任何情况,不能直接调用中断函数 可以在中断函数定义中用using指定当前使用的寄存器组 void 函数名 () i
[单片机]
STM32之外部中断例程
外部中断的基本步骤如下: 1.设置好相应的时钟; 2.设置相应的中断; 3.IO口初始化; 4.把相应的IO口设置为中断线路(要在设置外部中断之前)并初始化; 5.在选择的中断通道的响应函数中中断函数。
[单片机]
STM32之外部<font color='red'>中断</font>例程
stm32 exti 5~9 中断源区分
void EXTI9_5_IRQHandler(void) { u32 Temp = 0x00; PEout(2) = ~PEout(2); Temp = EXTI- PR; //取读是那个引脚的中断 switch(Temp) { case Exti_From_Pin8: EXTI_ClearITPendingBit(EXTI_Line8); break; case Exti_From_Pin9: if(Sys_Status MAX_STATUS) { Sys_Status ++; } EXTI_ClearITPendingBit(EXTI_Line9)
[单片机]
stm32 exti 5~9 <font color='red'>中断</font>源区分
GD32F303固件库开发(15)----外部中断EXTI
概述 本章配置GD32F303使用EXTI进行驱动LED。 需要GD样片的可以加群申请:615061293 。 视频教学 https://www.bilibili.com/video/BV1ig411Y7bB/ csdn课程 课程更加详细。 https://download.csdn.net/course/detail/37144 生成例程 这里准备了自己绘制的开发板进行验证。 查看原理图,PB14为按键管脚。 LED管脚为PB7. 配置中断口 GPIO 口连接到 16 个外部中断 / 事件线如下图 。可以看到PC13应该是在EXTI14上。 外部中断/事件控制器用于产生事件/中断请求的边沿检测器。每根输入线都
[单片机]
GD32F303固件库<font color='red'>开发</font>(15)----外部<font color='red'>中断</font>EXTI
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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