📄 interrupt_usart.c
字号:
//* File Name : interrupt_Usart.c
#include "bsp.h"
#include "interrupt_Usart.h"
#include "ST16C2550.h"
//#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define USART0_INTERRUPT_LEVEL 1
#define USART1_INTERRUPT_LEVEL 2
#define USART_BAUD_RATE0 115200
#define USART_BAUD_RATE1 9600
void InitUSART1(void);
extern AT91PS_USART COM0 ;
extern AT91PS_USART COM1;;
//AT91PS_USART u_pUSART0 = AT91C_BASE_US0;
//AT91PS_USART u_pUSART1 = AT91C_BASE_US1;
//unsigned char receivebyte;
extern struct _AT91S_CDC pCDC;
//unsigned char buff_tx[0xff];
//unsigned char *pbuff_tx=buff_tx;
unsigned char buff_tx;
unsigned int first =0;
extern unsigned char ReceiverStr1[100];
extern unsigned char IsStartCommand;
unsigned char flagstatus0;
unsigned char status0;
unsigned char receivebyte0;
unsigned char flagstatus1;
unsigned char status1;
unsigned char receivebyte1;
int Pos0=0;
int Datahead=0;
unsigned char GPSstrTemp[20];
extern struct {
float time;
double latitude;
double longitude;
int GPSquality;
int GPSNum;
double GPSprecision;
double GPSHight;
}GPSData;
extern char measure_data[200];
/*extern float compass;
extern float pitch;
extern float roll;
extern float V;
*/
extern int send_pos;
extern unsigned char receiverdata_portA;
extern unsigned char receiverdata_portB;
extern unsigned char receiver_porta_state;
extern unsigned char receiver_portb_state;
extern void mDelay1_2uS( );
extern void GetValue_chanel5();
extern int measure_data_flag;
extern int Isctlhead;
extern unsigned char Receiver_CTL[15];
extern int ctl_Pos;
unsigned int ctl_checksum;
unsigned int temp_checksum;
extern char PowerState;
extern int Light;
/*******************************************************************************
* 说明:Usart_init函数,UART0初始化
* 参数:无
* 返回值:无
*初始化 UART1
*115200,n,8,1
*数据准备就绪中断
*发送中断
*******************************************************************************/
void InitUSART0(void)
{ // 初始化 UART0
//AT91PS_USART COM0 = AT91C_BASE_US0;
//* Configure PIO controllers to periph mode
AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA,
((unsigned int) AT91C_PA5_RXD0 ) |
((unsigned int) AT91C_PA6_TXD0 ) ,
0); // Peripheral B
// First, enable the clock of the PIOB
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_US0 ) ;
// Usart Configure
AT91F_US_Configure (COM0, MCK, AT91C_US_ASYNC_MODE, USART_BAUD_RATE0, 0);
// Enable usart
COM0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
//* Enable USART IT error and RXRDY
//AT91F_US_EnableIt(COM0,AT91C_US_TIMEOUT | AT91C_US_FRAME | AT91C_US_OVRE | AT91C_US_RXRDY);
AT91F_US_EnableIt(COM0,AT91C_US_TIMEOUT | AT91C_US_FRAME | AT91C_US_OVRE |AT91C_US_RXRDY);
//AT91F_US_EnableIt(COM0,AT91C_US_RXRDY|AT91C_US_TXRDY);
//* open Usart 1 interrupt
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_US0, USART0_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, Usart0_c_irq_handler);
//AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_US0, USART_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL, Usart_c_irq_handler);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0);
}
void write_char_USART0(unsigned char ch)
{ // 向UART0写入字符数据
while (!(COM0->US_CSR&AT91C_US_TXRDY)==1);
COM0->US_THR = ((ch & 0xFF));//0x1ff
}
unsigned char read_char_USART0(void) { // 从UART0读取字符数据
while (!(COM0->US_CSR&AT91C_US_RXRDY)==1);
return((COM0->US_RHR) & 0x1FF);
}
unsigned char read_char_USART0_nonstop(void) { // 从UART0读取字符数据,无停止位
if((COM0->US_CSR&AT91C_US_RXRDY)==1)
return((COM0->US_RHR) & 0x1FF);
else return 0;
}
void write_str_USART0(unsigned char* buff) { // 向UART0写入字符串数据
unsigned int i = 0x0;
while(buff[i] != '\0') {
write_char_USART0(buff[i]);
i++;
}
}
/***************************************
*初始化 UART1
*9600,n,8,1
*数据准备就绪中断
***************************************/
void InitUSART1(void)
{
//AT91PS_USART COM1 = AT91C_BASE_US1;
//* Configure PIO controllers to periph mode
AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA,
((unsigned int) AT91C_PA21_RXD1 ) |
((unsigned int) AT91C_PA22_TXD1 )
, // Peripheral A
0); // Peripheral B
// First, enable the clock of the PIOB
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_US1 ) ;
// Usart Configure
AT91F_US_Configure (COM1, MCK, AT91C_US_ASYNC_MODE, USART_BAUD_RATE1, 0);
// Enable usart
//COM1->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
COM1->US_CR = AT91C_US_RXEN;
//* Enable USART IT error and RXRDY
//AT91F_US_EnableIt(COM1,AT91C_US_TIMEOUT | AT91C_US_FRAME | AT91C_US_OVRE |AT91C_US_RXRDY|AT91C_US_TXRDY);
AT91F_US_EnableIt(COM1,AT91C_US_RXRDY);
//* open Usart 1 interrupt
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_US1, USART1_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, Usart1_c_irq_handler);
//AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_US0, USART_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL, Usart_c_irq_handler);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US1);
}
void write_char_USART1(unsigned char ch)
{ // 向UART1写入字符数据
while (!(COM1->US_CSR&AT91C_US_TXRDY)==1);
COM1->US_THR = ((ch & 0xFF));//0x1ff
}
unsigned char read_char_USART1(void)
{ // 从UART1读取字符数据
while (!(COM1->US_CSR&AT91C_US_RXRDY)==1);
return((COM1->US_RHR) & 0x1FF);
}
unsigned char read_char_USART1_nonstop(void) { // 从UART1读取字符数据,无停止位
if((COM1->US_CSR&AT91C_US_RXRDY)==1)
return((COM1->US_RHR) & 0x1FF);
else return 0;
}
void write_str_USART1(unsigned char* buff) { // 向UART1写入字符串数据
unsigned int i = 0x0;
while(buff[i] != '\0') {
write_char_USART1(buff[i]);
i++;
}
}
void write_nchar_USART1(unsigned char* buff,int n)
{ // 向UART1写入字符串数据
unsigned int i = 0x0;
for(i=0;i<n;i++)
{
write_char_USART1(buff[i]);
}
}
/*******************************************************************************
* 说明:Usart_c_irq_handler函数,中断句柄
* 参数:无
* 返回值:无
*连接GPS
*9600,n,8,1
*******************************************************************************/
void Usart1_c_irq_handler(void)
{
int i;
//AT91PS_USART USART_pt = AT91C_BASE_US0;
//* get Usart status register
flagstatus1 =COM1->US_CSR;
if((COM1->US_CSR&AT91C_US_RXRDY)==1)
{
receivebyte1=AT91F_US_GetChar(AT91C_BASE_US1);
if(receivebyte1=='$') Datahead=1;
if(Datahead==1)
{
ReceiverStr1[Pos0]=receivebyte1;
if(Pos0>=99 ||receivebyte1=='*')
{
ReceiverStr1[Pos0]=0;
Datahead=0;
for(i=0;i<6;++i)
{
GPSstrTemp[i]=ReceiverStr1[i];
}
GPSstrTemp[6]=0;
if(strcmp((char const *)GPSstrTemp,"$GPGGA")==0)
{
strcpy(measure_data,(char *)ReceiverStr1);
measure_data_flag=1;
}//if(strcmp((char const *)strTemp,"$GPGGA")==0)
Pos0=0;
}//if(Pos0>=100 ||receivebyte==0x0A )
else
{
++Pos0;
}
}// if(Datahead==1)
}// if((COM1->US_CSR&AT91C_US_RXRDY)==1)
}
/*******************************************************************************
* 说明:Usart0_c_irq_handler函数,中断句柄
* 参数:无
* 返回值:无
*连接GPS
*115200,n,8,1
*和串口服务器连接
*******************************************************************************/
void Usart0_c_irq_handler(void)
{
int i;
unsigned char ctl_strTemp[10];
flagstatus0 = COM0->US_CSR;
if((COM0->US_CSR&AT91C_US_RXRDY)==1)
{
receivebyte0=AT91F_US_GetChar(AT91C_BASE_US0);
if(receivebyte0=='$') Isctlhead=1;
if(Isctlhead==1)
{
Receiver_CTL[ctl_Pos]=receivebyte0;
if(ctl_Pos>=13 ||receivebyte0==0x0A )
{
Isctlhead=0;
for(i=0;i<4;++i)
{
ctl_strTemp[i]=Receiver_CTL[i];
}
ctl_strTemp[4]=0;
if(strcmp((char const *)ctl_strTemp,"$CTL")==0)
{
if(receivebyte0==0x0A)
{
ctl_checksum=0;
for(i=0;i<9;++i)
{
ctl_checksum^=Receiver_CTL[i];
}
temp_checksum=16*((int)(Receiver_CTL[9]-48))+(int)(Receiver_CTL[10]-48);
if(ctl_checksum==temp_checksum)//电源关
{
if(Receiver_CTL[7]=='1')
{
if(Receiver_CTL[5]=='1')
{
*AT91C_PIOA_SODR|=(powerswithTV1);
PowerState |=0x01;
}
else if(Receiver_CTL[5]=='2')
{
*AT91C_PIOA_SODR|=(powerswithTV2);
PowerState |=0x02;
}
else if(Receiver_CTL[5]=='3')
{
*AT91C_PIOA_SODR|=(powerswithCommunication1);
PowerState |=0x04;
}
else if(Receiver_CTL[5]=='4')
{
*AT91C_PIOA_SODR|=(powerswithCommunication2);
PowerState |=0x08;
}
}
else
{
if(Receiver_CTL[7]=='0')//电源开
{
if(Receiver_CTL[5]=='1')
{
*AT91C_PIOA_CODR|=(powerswithTV1);
PowerState &=0xFE;
}
else if(Receiver_CTL[5]=='2')
{
*AT91C_PIOA_CODR|=(powerswithTV2);
PowerState &=0xFD;
}
else if(Receiver_CTL[5]=='3')
{
*AT91C_PIOA_CODR|=(powerswithCommunication1);
PowerState &=0xFB;
}
else if(Receiver_CTL[5]=='4')
{
*AT91C_PIOA_CODR|=(powerswithCommunication2);
PowerState &=0xF7;
}
}
}
}// if(ctl_checksum==temp_checksum)
}//if(receiverdata==0x0A)
}//if(strcmp((char const *)strTemp,"$CTL")==0)
ctl_Pos=0;
}// if(ctl_Pos>=10 ||receiverdata==0x0A )
else
{
++ctl_Pos;
}
}//if(Datahead==1)
}//接收中断
/* if((COM0->US_CSR&AT91C_US_TXRDY)==2)
{
send_pos++;
if(measure_data[send_pos]!=0x0)
{
// COM0->US_THR = ((measure_data[send_pos] & 0xFF));
write_char_USART0(measure_data[send_pos]);
}
else
{
send_pos=0;
if(Light==1)
{
*AT91C_PIOA_SODR|=LED1; //light LED1
Light=0;
}
else
{
*AT91C_PIOA_CODR|=LED1; //light LED1
Light=1;
}
}
}
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -