📄 interrupt_usart.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 + -