// Fonction d'initialisation void init(void) { unsigned char i; for(i=0;i<=5;i++) Data_Received[i] = 0x00; cli(); // Désactiver toutes les interruptions DDRD = 0b10000110; // config pour BP1 2 3 et 4 (BP = bouton poussoir) sbiBF (PORTD, PORTD3); // BP0 sbiBF (PORTD, PORTD4); // BP1 sbiBF (PORTD, PORTD5); // BP2 sbiBF (PORTD, PORTD6); // BP3 sDDR(DDRD,1); // mettre port TX en sortie sbiBF(PORTD,0); // mettre pull-up sur RX sbiBF(PORTC,0); // mettre pull-up sur RX sDDR(DDRC,1); // mettre port en sortie DDRB = 0b00111111; // PORTB.6et7 en entrée (quartz) sbiBF (PORTB, PINB0); // communication usart à 600baud non modulé USART0_Init_9600(); // initialise le port série Init_Buffers_USART (); // initialise les buffers de la communication série init_pcint(); // initialise les interruptions externes TIMER0_INIT(); // initialise le timer 0 TIMER1_INIT (); // initialiser le timer 1 TIMER2_INIT (); // initialiser le timer 2 sei(); }
/***************************************************************************** * 函 数 名 : hsUartInit * * 功能描述 : HS UART的基本参数的初始化 * * 输入参数 : 无 * * 输出参数 : 无 * 返 回 值 : HSUART_STATUS_OK 设置成功 * HSUART_STATUS_BAUTRATE_ERR 设置波特率超时失败 * * 修改记录 :2010年12月16日 鲁婷 创建 *****************************************************************************/ HSUART_STATUS hsUartInit(RECV_STR *pstQue) { UINT32 u32Divisor = 0; UINT32 u32DivisorLow = 0; UINT32 u32DivisorHigh = 0; UINT32 u32Discard = 0; UINT32 u32Fcr = 0; UINT32 u32Times = 0; if(NULL == pstQue) { return HSUART_STATUS_PARA_ERR; } /* 管脚复用为高速串口 */ HSUART_IOS_SYS_CONFIG(); /* 计算分频比 */ u32Divisor = HSUART_CLOCK_FREQ / (16 * HSUART_BAUT_RATE_DEFAULT); u32DivisorHigh = (u32Divisor&0xFF00) >> 8; u32DivisorLow = u32Divisor&0xFF; /*写FCR,把接收FIFO 和发送FIFO 全部复位清空,设置FIFO使能,非DMA Model */ u32Fcr = UART_DEF_RT_ONEFOUR|UART_DEF_TET_NULL|UART_DEF_NO_DMA_MODE|UART_RESET_TX_FIFO|UART_RESET_RCV_FIFO|UART_DEF_FIFOE_ENABLE; OUTREG32(HSUART_BASE_ADDR + UART_FCR, u32Fcr); /*去使能所有中断*/ OUTREG32(HSUART_BASE_ADDR + UART_IER, 0x00); /*clear line status interrupt*/ u32Discard = INREG32(HSUART_BASE_ADDR + UART_LSR); /*clear rcv interrupt*/ u32Discard = INREG32(HSUART_BASE_ADDR + UART_RBR); /*clear send empty interrupt*/ u32Discard = INREG32(HSUART_BASE_ADDR + UART_IIR); /*clear line busy interrupt*/ u32Discard = INREG32(HSUART_BASE_ADDR + UART_USR); /* 读取UART 状态寄存器,看UART是否处于idle状态*/ u32Discard = INREG32(HSUART_BASE_ADDR + UART_USR); while((u32Discard & 0x01)&&(u32Times<1000))/*uart is busy*/ { u32Discard = INREG32(HSUART_BASE_ADDR + UART_USR); u32Times++; } if(1000 == u32Times) { return HSUART_STATUS_BAUTRATE_ERR; } /* USR bit[0]=0 即UART 处在idle 态时,才能对LCR bit[7]该位进行写操作*/ OUTREG32(HSUART_BASE_ADDR + UART_LCR, UART_DEF_LCR_DIVENABLE); /* 配置DLH 和DLL 寄存器,设置分频比*/ OUTREG32(HSUART_BASE_ADDR + UART_DLL, u32DivisorLow); OUTREG32(HSUART_BASE_ADDR + UART_DLH, u32DivisorHigh); /* 配置外围发送和接收数据的数目为8bit,1停止位,无校验位,disable DLL&DLH */ OUTREG32(HSUART_BASE_ADDR + UART_LCR, UART_DEF_PARITY_NONE|UART_DEF_LCR_STP1|UART_DEF_LCR_CS8); /* 配置MCR ,rts,打开流控*/ OUTREG32(HSUART_BASE_ADDR + UART_MCR, 0x22); /* 配置发送FIFO */ OUTREG32(HSUART_BASE_ADDR + UART_TXDEPTH, 10); /* 使用接收中断 */ OUTREG32(HSUART_BASE_ADDR + UART_IER, 0x11); pstQue->ulRead = 0; pstQue->ulWrite = 0; pstQue->ulTotalNum = 0; /* 初始化超时定时器 */ TIMER0_INIT(); return HSUART_STATUS_OK; }