📄 interrupt_usart.c
字号:
//* File Name : interrupt_Usart.c
#include<string.h>
#include<stdlib.h>
#include "Board.h"
#include "interrupt_Usart.h"
#include "ST16C2550.h"
#include "os_cpu.h"
#define USART0_INTERRUPT_LEVEL 1
#define USART1_INTERRUPT_LEVEL 3
#define USART_BAUD_RATE0 115200
#define USART_BAUD_RATE1 9600
extern AT91PS_USART COM0 ;
extern AT91PS_USART COM1;
extern struct _AT91S_CDC pCDC;
unsigned char buff_tx;
unsigned int first =0;
extern unsigned char ReceiverStr1[100];
extern unsigned char ReceiverStr2[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 char measure_data[200];
extern struct {
float time;
double latitude;
double longitude;
int GPSquality;
int GPSNum;
double GPSprecision;
double GPSHight;
}GPSData;
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初始化
* 参数:无
* 返回值:无
* 初始化 UART0
* 115200,n,8,1
* 数据准备就绪中断
* 发送中断
*******************************************************************************/
void InitUSART0(void)
{
// 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;
AT91F_US_EnableIt(COM0,AT91C_US_TIMEOUT | AT91C_US_FRAME | AT91C_US_OVRE |AT91C_US_RXRDY);
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_US0, USART0_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, Usart0_c_irq_handler);
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_US0);
}
/***************************************
*初始化 UART1
*9600,n,8,1
*数据准备就绪中断
***************************************/
void InitUSART1(void)
{
// Configure PIO controllers to periph mode
AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA,
(unsigned int)AT91C_PA21_RXD1 | (unsigned int)AT91C_PA22_TXD1,
0);
// 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);
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_EnableIt (AT91C_BASE_AIC, AT91C_ID_US1);
}
// 向UART0写入字符数据
void write_char_USART0(unsigned char ch)
{
while (!(COM0->US_CSR&AT91C_US_TXRDY) == 1);
COM0->US_THR = ((ch & 0xFF));
}
// 向UART0写入字符串数据
void write_str_USART0(unsigned char* buff) {
unsigned int i = 0x0;
while(buff[i] != '\0') {
write_char_USART0(buff[i]);
i++;
}
}
// 从UART0读取字符数据
unsigned char read_char_USART0(void)
{
while (!(COM0->US_CSR&AT91C_US_RXRDY) == 1);
return((COM0->US_RHR) & 0x1FF);
}
// 从UART0读取字符数据,无停止位
unsigned char read_char_USART0_nonstop(void) {
if((COM0->US_CSR&AT91C_US_RXRDY) == 1)
return((COM0->US_RHR) & 0x1FF);
return 0;
}
// 向UART1写入字符数据
void write_char_USART1(unsigned char ch)
{
while (!(COM1->US_CSR&AT91C_US_TXRDY)==1);
COM1->US_THR = ((ch & 0xFF));
}
// 从UART1读取字符数据
unsigned char read_char_USART1(void)
{
while (!(COM1->US_CSR&AT91C_US_RXRDY)==1);
return((COM1->US_RHR) & 0x1FF);
}
// 从UART1读取字符数据,无停止位
unsigned char read_char_USART1_nonstop(void)
{
if((COM1->US_CSR&AT91C_US_RXRDY) == 1)
return((COM1->US_RHR) & 0x1FF);
return 0;
}
// 向UART1写入字符串数据
void write_str_USART1(unsigned char* buff)
{
unsigned int i = 0x0;
while(buff[i] != '\0') {
write_char_USART1(buff[i]);
i++;
}
}
// 向UART1写入字符串数据
void write_nchar_USART1(unsigned char* buff,int n)
{
unsigned int i = 0x0;
for(i=0;i<n;i++) {
write_char_USART1(buff[i]);
}
}
/*******************************************************************************
* 说明:Usart1_c_irq_handler函数,中断句柄
* 参数:无
* 返回值:无
* 连接GPS
* 9600,n,8,1
*******************************************************************************/
void Usart1_c_irq_handler(void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
AT91C_BASE_AIC->AIC_ICCR = AT91C_ID_US1; // 清除中断
AT91C_BASE_AIC->AIC_EOICR = 0; // 中断结束信号
OS_EXIT_CRITICAL();
int i = 0;
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;
}
Pos0 = 0;
} else {
Pos0++;
}
}
}
}
/*******************************************************************************
* 说明:Usart0_c_irq_handler函数,中断句柄
* 参数:无
* 返回值:无
*******************************************************************************/
void Usart0_c_irq_handler(void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
AT91C_BASE_AIC->AIC_ICCR = AT91C_ID_US0; // 清除 中断
AT91C_BASE_AIC->AIC_EOICR = 0; // 中断结束信号
OS_EXIT_CRITICAL();
flagstatus0 = COM0->US_CSR;
if((COM0->US_CSR&AT91C_US_RXRDY)==1) {
receivebyte0=AT91F_US_GetChar(AT91C_BASE_US0);
AT91F_US_PutChar(AT91C_BASE_US0,receivebyte0);
}
}
/* int i;
unsigned char ctl_strTemp[10];
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 + -