首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM开发调试笔记心得(转)(5)

ARM开发调试笔记心得(转)(5)

二.实验目的
        验证上述所描述的串口DMA控制器的工作过程,可用串口调试软件进行验证。
三.实验程序和参数设置
        1>连接器选项设置和启动代码都与上个实验相同
        2>C语言的代码
        #include "AT91SAM7S64.h"
        #include "Board.h"
        unsigned char RxBuff[256],TxBuff[256];
        int main(void)
        {
                unsigned int i;
                *AT91C_CKGR_MOR = 0x701; //使能主振荡器和设置起振时间
                *AT91C_PMC_MCKR = 0x01;//选择Mster Clock is main clock, divided by 0
                *AT91C_PMC_SCER = AT91C_CKGR_MOSCEN;//使能系统时钟寄存器的处理器时钟
                *AT91C_PMC_PCER = AT91C_ID_US0; //使能USART0时钟
                *AT91C_PIOA_PDR = US_RXD_PIN | US_TXD_PIN;//禁止该两个管脚的I/O口功能
                *AT91C_PIOA_ASR= US_RXD_PIN | US_TXD_PIN;//将该两个I/O口分配给外围A
                *AT91C_US0_CR = 0x1ac; //复位接收器和发送器,使能接收与发送,复位状态位
                *AT91C_US1_MR =0x8c0; //正常模式,时钟为MCK,8位长度,无校验,1位停止位,
                *AT91C_US0_IDR = 0xf3fff; //禁止所有UART相关的中断
                *AT91C_US0_BRGR = 30; //设置波特率为38400Hz,AT91C_US0_BRGR为CD值
                *AT91C_US0_CR = 0x50; //使能发送与接收
                *AT91C_US0_PTCR = AT91C_PDC_TXTEN | AT91C_PDC_RXTEN;//使能US0的PDC 发送与接收
                for (i = 0; i < 256; i++)
                { //给发送缓冲区覆值
                       TxBuff = i;
                } //下面可用单步执行,来观察现象
                *AT91C_US0_TPR = (unsigned int)TxBuff;//覆发送缓冲区起始地址
                *AT91C_US0_TCR = 256; //起动PDC发送256个字节
                *AT91C_US0_RPR = (unsigned int)RxBuff;//覆接收缓冲区起始地址
                *AT91C_US0_RCR = 256; //开始PDC接收
                while (1);
         }
四.总结
           我们在用51等单片机的串口进行收发数据时,因为发送与接收共用一个Buffer,所以在发送一字节数据后,通常都要加“while(!TI);”语句,来等待数据发送完毕;在接收数据时都要使用中断来处理,每当接收到一个字节数据后都要中断一次CPU。有了DMA这个功能,就不用这样浪费CPU的时间,可大大的提高CPU的实时性能。

中断控制实验
一.背景
        实际上ARM的中断与51单片机的中断类似,都有类似的中断入口地址(ARM称异常向量表)。只不过51给两个相互的中断入口之间留有足够的空间(如外部中断0的中断入口在03H处,而定时器0的中断入口在0BH处),在这段空间中可以放多条指令,这样在编写中断处理程序时非常灵活。ARM总共有7种中断(或异常)类型,它们的入口分别为00H、04H ┄┄ 1CH,入口与入口之间只够放一条指令,这条通常为“B XX”或者“LDR PC, ResetAddr”的跳转指令。
二.实验目的
        在IRQ中断向量地址(0x18)处设置一个断点后全速运行,用按钮产生PIO中断输入信号,使产生中断,而跳转到设置的断点处。
三.实验程序和参数设置
        1> 连接器选项设置与上个实验相同
        2> 启动代码
        与前几个实验相比,使能了IRQ中断后再跳到C语言的主函数。
        AREA init,CODE,READONLY
        CODE32
        Mode_USR EQU 0x10 ;CPSR中各种处理器模式对应的控制位
        USR_Stack EQU 0x00204000 ;定义RAM的最高地址,无重映射
        ENTRY
        B InitReset ; 0x00 Reset handler
        Undefvec B undefvec ; 0x04 Undefined Instruction
        swivec B swivec ; 0x08 Software Interrupt
        pabtvec B pabtvec ; 0x0C Prefetch Abort
        dabtvec B dabtvec ; 0x10 Data Abort
        rsvdvec B rsvdvec ; 0x14 reserved
        irqvec B irqvec ; 0x18 IRQ
        fiqvec B fiqvec ; 0x1c FIQ
        InitReset
        MSR CPSR_c,#Mode_USR ;使能FIQ,IRQ中断
        LDR SP,=USR_Stack
        IMPORT main
        b main
        END
        3> C语言代码
        #include "AT91SAM7S64.h"
        #include "Board.h"
        unsigned int Key_Val;
        unsigned int key;
        int main(void)
        {
                *AT91C_PMC_SCER = 0x1; //使能系统时钟寄存器的处理器时钟
                *AT91C_PMC_PCER = 1 << AT91C_ID_PIOA; //使能PIOA外围时钟
                *AT91C_PIOA_PER = SW_MASK; //使能KEY引脚的I/O口功能
                *AT91C_AIC_IDCR = 1 << AT91C_ID_PIOA; //禁止PIO外围中断功能
                *AT91C_PIOA_ODR = SW_MASK; //使能4个KEY管脚的输入功能
                AT91C_BASE_AIC -> AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_PRIOR_HIGHEST |                 AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED;//中断模式(优先级和触发模式)
                *AT91C_AIC_ICCR = 1 << AT91C_ID_PIOA; //中断清除
                *AT91C_PIOA_IDR = 0xffffffff; //禁止所有PIO口的中断功能
                *AT91C_PIOA_IER = SW3_MASK; //使能PIO的SW3脚中断功能
                *AT91C_AIC_IECR = 1 << AT91C_ID_PIOA; //使能PIO外围中断功能
                while (1);
        }
继承事业,薪火相传
返回列表