ARM中断实现串口通信

更新时间:2023-09-24 12:03:01 阅读量: IT计算机 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

#include //终端服务函数入口地址

#define _ISR_STARTADDRESS 0x33ffff00

#define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x20))//存放ISR函数的入口地址

#define pISR_EINT2 (*(unsigned *)(_ISR_STARTADDRESS+0x28)) #define pISR_EINT8_23 (*(unsigned *)(_ISR_STARTADDRESS+0x34))

// _PND register must be clr by write 1

#define Clear1Pending(bit) {SRCPND = bit; INTPND = INTPND;} // precent write wrong data

#define FCLK 202800000 #define HCLK (202800000/2) #define PCLK (202800000/4) #define UART0 0x0 #define UART1 0x1 #define UART2 0xBB

///////////////////////////////////////////////////////////////////////////////////////////// void uart_init(int nMainClk, int nBaud, int nChannel) {

if(nMainClk == 0) nMainClk = PCLK;

switch (nChannel) {

case UART0:

UBRDIV0=( (int)(nMainClk/16./nBaud+0.5) -1 );// Baud rate divisior register 0

UCON0 = 0x245;

// Control register

UFCON0 = 0x0; //UART channel 0 FIFO control register, FIFO disable UMCON0 = 0x0; //UART chaneel 0 MODEM control register, AFC disable ULCON0 = 0x3; //Line control register : Normal,No parity,1 stop,8 bits

// UART symbol

}

}

break;

UFCON1 = 0x0; //UART channel 1 FIFO control register, FIFO disable UMCON1 = 0x0; //UART chaneel 1 MODEM control register, AFC disable ULCON1 = 0x3; UCON1 = 0x245;

UBRDIV1=( (int)(nMainClk/16./nBaud) -1 ); break; break;

case UART1:

default:

void uart_sendbyte(int nData) { }

void uart_sendstring(char *pString) {

while(*pString != '\\0')

uart_sendbyte(*pString++); }

void uart_printf(char *fmt) {

uart_sendstring(fmt); }

//////////////////////////////////////////////////////////////////////////////////////

/*进入中断处理函数,中断模式的寄存器先进入输入模式,所有列线输出置为1;

UTXH0 = nData;

while(!(UTRSTAT0 & 0x2));

依次把列线拉低,检测输入端口,EINT的值,如果为低点平,说明该列被拉低; 这样行列坐标就确定了。

处理完成,返回中断模式,IO口重新设定为输出低电平,使能下降沿触发中断;*/

void __irq int0_int(void) {

// clr _pend bit is essential after E_int }

Clear1Pending(0x1);

GPEDAT |= (1<<13); //set pre_bit GPGDAT &= ~(1<<2);

//clr exam_bit

if(((GPFDAT>>0)&1)==0) uart_printf(\//enter eint_mod , ouput_mod 0 GPFCON |= (0x2<<0); //EINT0 mod GPEDAT &= ~((1<<11)|(1<<13));//output 0 GPGDAT &= ~((1<<2)|(1<<6));

//output 0

GPGDAT |= (1<<6); GPEDAT &= ~(1<<13);

//set

pre_bit //clr

exam_bit

GPEDAT |= (1<<11);//set pre_bit GPGDAT &= ~(1<<6);

// clr exam_bit

if(((GPFDAT>>0)&1)==0) uart_printf(\GPGDAT |= ((1<<2)|(1<<6));//output 1

GPFCON &= ~(0x3<<0);//EINT_mod to input_mod

if(((GPFDAT>>0)&1)==0) uart_printf(\// 10 11 12 16

// enter input_mod ,kscan0-kscan3 output 1 GPGDAT &= ~(1<<11);// 0 GPEDAT |= (1<<13); // 1

if(((GPFDAT>>0)&1)==0) uart_printf(\

void __irq int2_int(void) {

GPEDAT |= (1<<13); GPGDAT &= ~(1<<2);

if(((GPFDAT>>2)&1)==0) uart_printf(\

GPFCON |= (0x2<<4); // EINT2 mod GPEDAT &= ~((1<<11)|(1<<13)); GPGDAT &= ~((1<<2)|(1<<6)); GPGDAT |= (1<<6); GPEDAT &= ~(1<<13);

if(((GPFDAT>>2)&1)==0) uart_printf(\GPEDAT |= (1<<11); GPGDAT &= ~(1<<6);

if(((GPFDAT>>2)&1)==0) uart_printf(\ // 7 8 9 15

GPGDAT &= ~(1<<11);// 0 GPEDAT |= (1<<13); // 1

GPGDAT |= ((1<<2)|(1<<6));//output 1 GPFCON &= ~(0x3<<4);// input_mod if(((GPFDAT>>2)&1)==0) uart_printf(\

// uart_printf(\ Clear1Pending(0x1<<2); }

void __irq int11_int(void) {

if(((EINTPEND>>11)&1)==1) {

//4 5 6 14

GPGDAT &= ~(1<<11);// 0 GPEDAT |= (1<<13); // 1

GPGDAT |= ((1<<2)|(1<<6));//output 1 GPGCON &= ~(0x3<<6);// input mod

if(((GPGDAT>>3)&1)==0) uart_printf(\GPEDAT |= (1<<11); GPGDAT &= ~(1<<6);

if(((GPGDAT>>3)&1)==0) uart_printf(\GPGDAT |= (1<<6); GPEDAT &= ~(1<<13);

if(((GPGDAT>>3)&1)==0) uart_printf(\GPEDAT |= (1<<13); GPGDAT &= ~(1<<2);

if(((GPGDAT>>3)&1)==0) uart_printf(\

GPGCON |= (0x2<<6);//EINT 11 mod GPEDAT &= ~((1<<11)|(1<<13)); GPGDAT &= ~((1<<2)|(1<<6));

EINTPEND=(1<<11); } else {

// 1 2 3 13

GPGDAT &= ~(1<<11);// 0

// uart_printf(\

GPEDAT |= (1<<13); // 1

GPGDAT |= ((1<<2)|(1<<6));//output 1 GPGCON &= ~(0x3<<22);// input mod

本文来源:https://www.bwwdw.com/article/e30d.html

Top