- UID
- 1029342
- 性别
- 男
|
二.实验目的
验证上述所描述的串口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);
} |
|