S5PV210 串口实验(中断方式)
结合之前的串口实验(轮询方式)与中断体系分析,我们来做下中断方式的串口接收实验。
start.S
.global _start .global IRQ_handle _start: /* 关 Watch Dog */ ldr r0, =0xE2700000 mov r1, #0 str r1, [r0] /* 设置系统模式栈指针 */ ldr sp, =0x40000000 /* 开 IRQ 总中断开关 */ mov r0, #0x53 msr CPSR_cxsf, r0 /* 时钟初始化 */ bl clock_init bl main halt: b halt IRQ_handle: /* 设置 IRQ 模式栈指针 */ ldr sp, =0xD0037F80 /* 设置 lr */ sub lr, lr, #4 stmfd sp!, {r0-r12, lr} /* 另一个 ISR 的接口 */ bl irq_handler /* 弹出保存的数据 */ ldmfd sp!, {r0-r12, pc}^
配置串口
#define UART_UBRDIV_VAL 34 #define UART_UDIVSLOT_VAL 0xDFDD void uart_init() { /* 配置引脚为串口模式 */ GPA0CON = 0x22; /* 不使用 FIFO */ UFCON0 = 0x00; /* 无流控 */ UMCON0 = 0x00; /* 配置数据格式 */ ULCON0 = 0x03; /* 配置 UART */ UCON0 = 0x105; /* 配置波特率 */ UBRDIV0 = UART_UBRDIV_VAL; UDIVSLOT0 = UART_UDIVSLOT_VAL; /* 开放 RX0 中断 */ UINTM = 0x0e; }
配置中断
所调用的 API 可在之前串口实验文章中找到。
/* 初始化异常向量 */ system_initexception(); /* 配置 ISR 函数 */ intc_setvectaddr(NUM_UART0, handler); /* 使能 NUM_UART0 中断 */ intc_enable(NUM_UART0);
中断服务程序
void handler(void) { /* 发送 +1 后的结果 */ putc(getc()+1); /* 清 VICnADDR */ intc_clearvectaddr(); /* 清除中断标志 */ UINTP = 0x0f; UINTSP = 0x0f; }
运行结果
向 S5PV210 发送一个字符,会得到这个字符 +1 后的字符。
相关推荐
LandryBean 2020-06-16
vanturman 2020-06-11
xiaoxiaoCNDS 2020-04-20
furongwei 2020-03-26
rareli 2020-03-20
老和山下的小学童 2020-02-22
internetofthings 2019-12-30
huangzonggui 2019-12-12
NeverAgain 2019-12-07
jj 2010-09-15
LUOPING0 2010-08-27
wwater 2011-04-08
jj 2011-03-30
RayDon 2011-02-12
liuweinn 2011-02-08
hbcbgcx 2010-12-04
zjwijy 2011-08-09