当我以任何波特率发送给1788的时候,串口寄存器UART_ACR的最低位会自动清零,表示同步完成,用will语句来等待同步完成并执行上下位机的通信。
串口函数:
#include "lpc177x_8x_uart.h"
#include "lpc177x_8x_pinsel.h"#include "uart.h"
#include "lpc177x_8x_gpio.h"
#include "lpc177x_8x_clkpwr.h"
/************************** PRIVATE DEFINTIONS *************************/
#define _LPC_UART UART_0
#define _UART_IRQ UART0_IRQn
#define _UART_IRQHander UART0_IRQHandler
uint8_t syncmenu[] = "\n\rAutoBaudrate Status: Synchronous! \n\r";
uint8_t menu1[8]="\n\r1234\n\r";
uint8_t menu2[] = "\n\rUART Polling demo terminated!";
uint32_t idx, len;
__IO FlagStatus exitflag;
uint8_t buffer[10];
uint32_t tmpBaud;
__IO FlagStatus Synchronous;
UART_AB_CFG_Type ABConfig; // Auto baudrate configuration structure
void lpc1788_Uart_Init(int port)//LPC1788_Uart_Init
{
UART_CFG_Type UARTConfigStruct; /* UARTÅäÖÃ */
UART_FIFO_CFG_Type UARTFIFOConfigStruct; /* UART FIFOÅäÖÃ */
UART_AB_CFG_Type ABConfig; // Auto baudrate configuration structure
if( port == 0 ){PINSEL_ConfigPin(0,2,1); PINSEL_ConfigPin(0,3,1);} /* ÅäÖÃUART0Òý½ÅP0.2: U0_TXD P0.3: U0_RXD*/
UART_ConfigStructInit(&UARTConfigStruct);/* ³õʼ»¯UARTConfigStruct½á¹¹ÌåΪ£º²¨ÌØÂÊΪ115200£¬8λÊý¾Ý£¬ÎÞÆæÅ¼Ð£Ñ飬1λֹͣλ */
UART_Init((UART_ID_Type)port, &UARTConfigStruct); /* ÓÃUARTConfigStruct¸ø¶¨µÄ²ÎÊý³õʼ»¯UARTÍâÉè */
UART_FIFOConfigStructInit(&UARTFIFOConfigStruct);
UART_FIFOConfig((UART_ID_Type)port, &UARTFIFOConfigStruct); /* ΪUARTÍâÉè³õʼ»¯FIFO */
UART_TxCmd((UART_ID_Type)port, ENABLE);/* ʹÄÜUART·¢ËÍ */
// UART_IntConfig(UART_0, UART_INTCFG_RBR, ENABLE);²»ÄÜ´ò¿ª£¬Ò»´ò¿ªËÀÔÚÖжÏ
// UART_IntConfig(UART_0, UART_INTCFG_RLS, ENABLE);
UART_IntConfig(_LPC_UART, UART_INTCFG_ABEO, ENABLE); /* Enable UART End of Auto baudrate interrupt */
UART_IntConfig(_LPC_UART, UART_INTCFG_ABTO, ENABLE); /* Enable UART Auto baudrate timeout interrupt */
NVIC_SetPriority(_UART_IRQ, ((0x01<<3)|0x01)); /* preemption = 1, sub-priority = 1 */
NVIC_EnableIRQ(UART0_IRQn);
ABConfig.ABMode = UART_AUTOBAUD_MODE0; //×Ô¶¯²¨ÌØÂÊģʽ0
ABConfig.AutoRestart = ENABLE; //
UART_ABCmd(_LPC_UART, &ABConfig, ENABLE);// Start auto baudrate mode
while ((LPC_UART0->ACR&0x01)==1); /*µÈ´ý¿ªÆô×Ô¶¯²¨ÌØÂÊ£¬µ±ÎÒÒÔÈκβ¨ÌØÂÊ·¢Ë͸ø1788ºó£¬Æä´®¿ÚACR¼Ä´æÆ÷µÄ×îµÍλ»á×Ô¶¯ÇåÁ㣬¼ì²éÆäÊÇ·ñÇåÁã¿ÉÖªÓÐûÓÐͬ²½²¨ÌØÂÊ */
//while (Synchronous == RESET);//ÓëÉϾäµÈЧ
UART_Send(_LPC_UART, syncmenu, sizeof(syncmenu), BLOCKING);
UART_Send(_LPC_UART, menu1, sizeof(menu1), BLOCKING);
exitflag = RESET;
}
void _UART_IRQHander(void)
{
uint32_t intsrc, tmp, tmp1;// Call Standard UART 0 interrupt handler
uint8_t dlm[2];
intsrc = UART_GetIntId(_LPC_UART);/* Determine the interrupt source */
tmp = intsrc & UART_IIR_INTID_MASK;// Receive Line Status
if (tmp == UART_IIR_INTID_RLS) // Check line status
{
tmp1 = UART_GetLineStatus(_LPC_UART);// Mask out the Receive Ready and Transmit Holding empty status
tmp1 &= (UART_LSR_OE | UART_LSR_PE | UART_LSR_FE| UART_LSR_BI | UART_LSR_RXFE);
if (tmp1) // If any error exist
{while(tmp1){;}} //implement error handling here
}
intsrc &= (UART_IIR_ABEO_INT | UART_IIR_ABTO_INT);
if (intsrc)// ¼ì²éÊÇ×Ô¶¯²¨ÌØÂÊÍê³É»¹ÊÇʱ¼äÒç³öCheck if End of auto-baudrate interrupt or Auto baudrate time out
{
if(intsrc & UART_IIR_ABEO_INT)// Clear interrupt pending
{
dlm[0]=LPC_UART0->DLM;
dlm[1]=LPC_UART0->DLL;
tmpBaud=CLKPWR_GetCLK(CLKPWR_CLKTYPE_PER)/(16 *(256*dlm[0]+dlm[1]));
printf("%d",tmpBaud);
UART_ABClearIntPending(_LPC_UART, UART_AUTOBAUD_INTSTAT_ABEO);
}
if (intsrc & UART_IIR_ABTO_INT)
UART_ABClearIntPending(_LPC_UART, UART_AUTOBAUD_INTSTAT_ABTO);
if (Synchronous == RESET)
{
if (intsrc & UART_AUTOBAUD_INTSTAT_ABEO) /* Interrupt caused by End of auto-baud */
{UART_IntConfig(_LPC_UART, UART_INTCFG_ABEO, DISABLE);// Disable AB interrupt
Synchronous = SET;} // Set Sync flag
if (intsrc & UART_AUTOBAUD_INTSTAT_ABTO) /* Auto-Baudrate Time-Out interrupt (not implemented) */
{ UART_ABClearIntPending(_LPC_UART, UART_AUTOBAUD_INTSTAT_ABTO);}/* Just clear this bit - Add your code here */
}
}
}
PUTCHAR_PROTOTYPE
{
UART_Send((UART_ID_Type)UART_0, (uint8_t*) &ch, 1, BLOCKING); /* ·¢ËÍÒ»¸ö×Ö·ûµ½UART */
while (UART_CheckBusy((UART_ID_Type)UART_0) == SET); /* µÈÓÚ·¢ËÍÍê³É£¬THR±ØÐëΪ¿Õ*/
return ch;
}
主函数
#include "lpc177x_8x_gpio.h"
#include "lpc177x_8x_clkpwr.h"
#include "lpc177x_8x_pinsel.h"
#include "lpc177x_8x_lcd.h"
#include "lpc177x_8x_uart.h"
#include "uart.h"
#include "dma.h"
volatile unsigned int SysTickCnt;
extern uint32_t idx, len;
extern __IO FlagStatus exitflag;
extern uint8_t buffer[10];
extern uint8_t menu1[];
extern uint8_t menu2[];
extern uint32_t tmpBaud;
void SysTick_Handler (void)
{
SysTickCnt++;
}
void Delay (int tick)//ÑÓʱ(ºÁÃë)
{
unsigned int systickcnt;
systickcnt = SysTickCnt;
while ((SysTickCnt - systickcnt) < tick);
}
void SysTick_Init(void)
{
uint32_t cclk = CLKPWR_GetCLK(CLKPWR_CLKTYPE_CPU); /* »ñȡϵͳʱÖÓÆµÂÊ */
SysTick_Config(cclk/1000 - 1); /* ÅäÖÃSysTickΪ1msÖжÏÒ»´Î */
}
int main(void)
{
CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCGPIO, ENABLE);// /* ´ò¿ªGPIOÍâÉèµçÔ´£¬ÉϵçºóGPIOµçԴĬÈÏÊÇ´ò¿ªµÄ£¬´ËÐпÉÈ¥µô */
PINSEL_ConfigPin(0,23,0);// /* ¹Ü½Å¸´ÓÃÅäÖã¬ÅäÖÃp0.23£¬p0.24ΪÆÕͨGPIO¹¦ÄÜ£¬ÉϵçºóĬÈÏÊÇÆÕͨGPIO¹¦ÄÜ£¬´ËÐпÉÈ¥µô */
PINSEL_ConfigPin(0,24,0);
GPIO_SetDir(0,1<<22,1);
GPIO_OutputValue(0,1<<22,0);//°Ñ¸ÃËÀµÄ·äÃùÆ÷¹ØÁË£¬ÌرðÌÖÑáǧÍò±ðÈ¥µô£¡
GPIO_SetDir(0,1<<23,1); /* ÉèÖÃp0.23ΪÊä³ö */
GPIO_SetDir(0,1<<24,1); /* ÉèÖÃp0.24ΪÊä³ö */
SysTick_Init(); /* ³õʼ»¯SysTick¶¨Ê±Æ÷ */
lpc1788_Uart_Init(0); /* ³õʼ»¯´®¿ÚUart0 */
while(1)
{
GPIO_OutputValue(0,1<<23,0);/* p0.23Êä³öµÍµçƽ£¬µãÁÁLED1 */
GPIO_OutputValue(0,1<<24,1);/* p0.24Êä³öµÍµçƽ£¬µãÁÁLED2 */
Delay(500);/* ÑÓʱ500ms */
GPIO_OutputValue(0,1<<23,1); /* p0.23Êä³ö¸ßµçƽ£¬Ï¨ÃðLED1 */
GPIO_OutputValue(0,1<<24,0); /* p0.24Êä³ö¸ßµçƽ£¬Ï¨ÃðLED2 */
Delay(500);/* ÑÓʱ500ms */
exitflag = RESET; // reset exit flag
while (exitflag == RESET) /* Read some data from the buffer */
{
len = 0;
while (len == 0)
{
len = UART_Receive(UART_0, buffer, sizeof(buffer), NONE_BLOCKING);
}
/* Got some data */
idx = 0;
while (idx < len)
{
if (buffer[idx] == 27)
{/* ESC key, set exit flag */
// UART_Send(UART_0, menu2, sizeof(menu2), BLOCKING);
exitflag = SET;
}
else if (buffer[idx] == 'r')
{/* Echo it back */
UART_Send(UART_0, &buffer[idx], 1, BLOCKING);
printf("%d",tmpBaud);
//UART_Send(UART_0, menu1, sizeof(menu1), BLOCKING);
}
else/* Echo it back */
{
UART_Send(UART_0, &buffer[idx], 1, BLOCKING);
}
idx++;
}
}
while (UART_CheckBusy(UART_0) == SET); // wait for current transmission complete - THR must be empty
UART_DeInit(UART_0); // DeInitialize UART0 peripheral
}
}