⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interrupt_usart.c

📁 使用arm7芯片
💻 C
字号:
#include "Board.h"


unsigned int address;
unsigned int function;
unsigned int data;

extern int fan_dir ;
extern int repeat_times;
extern int move_direction;
extern int move_speed;
extern int move_distance;
extern int move_interrupt;
extern int candg ;
extern unsigned int output_pulse0;
extern unsigned int output_pulse1;
extern int far_point;
extern int near_point;
extern int count_timer0_interrupt;
extern int count_timer1_interrupt;
extern unsigned char send_data[24];
extern unsigned char read_data[24];
extern unsigned char temp_send_data[24];
extern unsigned char temp_read_data[24];
extern unsigned int back;
extern unsigned int gui_wei;
extern int tc1;
extern void  Tran_COM0(unsigned char send_data[]);

int scale_speed = 0;

#define USART_INTERRUPT_LEVEL		7
#define AT91_BAUD_RATE			115200//19200//
#define AT91C_US_ASYNC_MODE ( AT91C_US_USMODE_NORMAL + \
                        AT91C_US_NBSTOP_1_BIT + \
                        AT91C_US_PAR_NONE + \
                        AT91C_US_CHRL_8_BITS + \
                        AT91C_US_CLKS_CLOCK )
                        
//__ramfunc 
void Usart_c_irq_handler(void)
{
    AT91PS_USART USART_pt = AT91C_BASE_US0;
    unsigned int status;
    status = USART_pt->US_CSR;
    if ( status & AT91C_US_TIMEOUT){     
        for(int i=0; i<24; i++) {
            read_data[i] = temp_read_data[i];//读取数据 
            temp_read_data[i] = 0;
            temp_send_data[i] = 0;            
        }//end for
        address = (unsigned int)read_data[0];
        function = (unsigned int)read_data[1];
        data = (unsigned int)read_data[2]*256+(unsigned int)read_data[3];
        
        AT91C_BASE_US0->US_CR = AT91C_BASE_US0->US_CR | AT91C_US_STTTO;
        if(function==WHO_RU){
            temp_send_data[0] = (unsigned char)0x01;
            temp_send_data[1] = (unsigned char)IAM_MOTOR;
	    for(int i=0;i<6;i++) temp_send_data[i+2] = 0;
	    Tran_COM0(temp_send_data);
        }
        //-----------------command-------------------------------------
        if(address == 0x01){
            switch (function) {
                case CHANGE_SPEED:
                    move_speed = data;
		    temp_send_data[0] = (unsigned char)0x01;
		    temp_send_data[1] = (unsigned char)CHANGE_SPEED;
		    for(int i=0;i<6;i++) temp_send_data[i+2] = 0;
		    Tran_COM0(temp_send_data);
		    break;
		case GET_REPEAT:
		    repeat_times = data;
		    break;
		case START:
		if(output_pulse1==0){
		    temp_send_data[0] = (unsigned char)0x01;
		    temp_send_data[1] = (unsigned char)START;
		    for(int i=0;i<6;i++) temp_send_data[i+2] = 0;
		    Tran_COM0(temp_send_data);
		    
		    count_timer1_interrupt = 0;
		    move_direction = 0;
		    move_speed = 40;
		    scale_speed = (unsigned int)read_data[4]*256+(unsigned int)read_data[5];
		    repeat_times =(unsigned int)read_data[6]; 
		    move_distance = data;
		    
		    fan_dir = (unsigned int)read_data[7]; 
		    if(fan_dir!=0){
		    move_direction =1;   
		    }
		    
		    near_point = move_distance*200;
		    far_point = move_distance*(-200);
		    output_pulse1 = 1;
		    back = 1;			    
		}	    
		    break;
		case START_SCALE:
		    (move_direction==1)?(move_direction=0):(move_direction=1);
                    move_speed = scale_speed;
                    output_pulse1 = 1;
                    back = 0;
		case GUI_WEI:
		    if(output_pulse1==0){
		        gui_wei = 1;		        
		        move_speed = 40;	
		    
		        temp_send_data[0] = (unsigned char)0x01;
		        temp_send_data[1] = (unsigned char)GUI_WEI;
		        for(int i=0;i<6;i++) temp_send_data[i+2] = 0;
		        Tran_COM0(temp_send_data);
		    }	        
		    break;
            }
        }
        *AT91C_US0_RPR = (unsigned  int)temp_read_data ;   
        *AT91C_US0_RCR = 96 ;   
        *AT91C_US0_PTCR = AT91C_PDC_RXTEN;
        //-------------------end---------------------------------------
    }//end if ( status & AT91C_US_TIMEOUT)
    USART_pt->US_CR = AT91C_US_RSTSTA; 
}

void Usart_init_interrupt ( void )
{
    AT91PS_USART COM0 = AT91C_BASE_US0;
    AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA,
                       ((unsigned int) AT91C_PA5_RXD0    ) |
 		       ((unsigned int) AT91C_PA6_TXD0    ), // Peripheral A
 		       0); // Peripheral B   	
    AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC,1<<AT91C_ID_US0);//enable the clock of the PIO	
    AT91F_US_Configure(COM0,MCK,AT91C_US_ASYNC_MODE,AT91_BAUD_RATE,0);// Usart Configure	
    COM0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN | AT91C_US_STTTO;// Enable usart   
    COM0->US_RTOR = 32 ;   //超时时间设置   
    AT91F_US_EnableIt(COM0,AT91C_US_TIMEOUT);// Enable USART IT error and RXRDY    	
    AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, 
	                    AT91C_ID_US0, 
	                    USART_INTERRUPT_LEVEL,
	                    AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, 
	                    Usart_c_irq_handler);//* open Usart 1 interrupt
    AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -