LPC1788自动波特率同步第一步:等待自动同步版只能验证同步波特率,实际应用欠佳

当我以任何波特率发送给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         
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值