中科蓝讯 串口接收和发送 536x 530x

1. 引脚映射

 (这张图是抄人家的,原链接:中科蓝讯530X、532X模块之硬件UART - 秃头君 - 博客园 (cnblogs.com))

2. 定义

/**
// 引脚和串口映射关系
// 例:PA1 UART0 TX G5(RX)  表示该引脚可以同时作为输入输出
PIN 串口 功能 //
PA0 UART0 RX G5
PA1 UART0 TX G5(RX)
PA3 UART1 RX G2
PA4 UART1 TX G2(RX)
PA6 UART0 RX G1/UART1 RX G1
PA7 UART0 TX G1/UART1 TX G1(RX)
PB1 UART0 RX G2/UART2 RX G2
PB2 UART0 TX G2/UART2 TX G2(RX)
PB3 UART0 TX G3(RX)
PB4 UART0 RX G3
PE0 UART0 TX G6(RX)
PE1 UART0 RX G6
PE2 UART2 RX G1
PE3 UART2 TX G1(RX)
PE6 UART0 RX G4
PE7 UART0 TX G4
PF2 UART0 TX G7(RX)
***********************************************/
// uart con 寄存器位定义
typedef enum
{
    UTEN,       // UART_ENABLE
    BIT9_EN,    // BIT9 ENABLE BIT
    RXIE,       // RECEIVE INTERRUPT ENABLE
    TXIE,       // TRANSMIT INTERRUPT ENABLE
    SB2EN,      // TWO STOP BIT ENABLE
    CLKSRC,     // CLOCK SOURCE SELECT 0:SYS CLOCK ;1:UART_INC;
    ONELINE,    // ONE LINE MODE 0:TX/RX separate;1:TX/RX one line;
    RXEN,       // RX ENABLE
    TXPND,      // TX PENDING
    RXPND,      // RX PENDING
}UARTCON_BIT;


// FUNCMCON0
#define  UART0_RX_MAP_G1()        FUNCMCON0 |= (1<<12)
#define  UART0_RX_MAP_G2()        FUNCMCON0 |= (2<<12)
#define  UART0_RX_MAP_G3()        FUNCMCON0 |= (3<<12)
#define  UART0_RX_MAP_G4()        FUNCMCON0 |= (4<<12)
#define  UART0_RX_MAP_G5()        FUNCMCON0 |= (5<<12)
#define  UART0_RX_MAP_G6()        FUNCMCON0 |= (6<<12)
#define  UART0_RX_MAP_TXRX()      FUNCMCON0 |= (7<<12)// RX与TX同一引脚
#define  UART0_RX_MAP_RESET()     FUNCMCON0 |= (0xF<<12)

#define  UART0_TX_MAP_G1()        FUNCMCON0 |= (1<<8)
#define  UART0_TX_MAP_G2()        FUNCMCON0 |= (2<<8)
#define  UART0_TX_MAP_G3()        FUNCMCON0 |= (3<<8)
#define  UART0_TX_MAP_G4()        FUNCMCON0 |= (4<<8)
#define  UART0_TX_MAP_G5()        FUNCMCON0 |= (5<<8)
#define  UART0_TX_MAP_G6()        FUNCMCON0 |= (6<<8)
#define  UART0_TX_MAP_G7()        FUNCMCON0 |= (7<<8)
#define  UART0_TX_MAP_RESET()     FUNCMCON0 |= (0xF<<8)

#define  UART1_RX_MAP_G1()        FUNCMCON0 |= (1<<28)
#define  UART1_RX_MAP_G2()        FUNCMCON0 |= (2<<28)
#define  UART1_RX_MAP_TXRX()      FUNCMCON0 |= (3<<28) // RX与TX同一引脚
#define  UART1_RX_MAP_RESET()     FUNCMCON0 |= (0xF<<28)

#define  UART1_TX_MAP_G1()        FUNCMCON0 |= (1<<24)
#define  UART1_TX_MAP_G2()        FUNCMCON0 |= (2<<24)
#define  UART1_TX_MAP_RESET()     FUNCMCON0 |= (0xF<<24)

// FUNCMCON1
#define  UART2_RX_MAP_G1()        FUNCMCON1 |= (1<<8)
#define  UART2_RX_MAP_G2()        FUNCMCON1 |= (2<<8)
#define  UART2_RX_MAP_TXRX()      FUNCMCON1 |= (3<<8) // RX与TX同一引脚
#define  UART2_RX_MAP_RESET()     FUNCMCON1 |= (0xF<<8)

#define  UART2_TX_MAP_G1()        FUNCMCON1 |= (1<<4)
#define  UART2_TX_MAP_G2()        FUNCMCON1 |= (2<<4)
#define  UART2_TX_MAP_RESET()     FUNCMCON1 |= (0xF<<4)

#define  UART0_CLK_EN()       CLKGAT0 |= BIT(10);    //clk enble
#define  UART1_CLK_EN()       CLKGAT0 |= BIT(21);    //clk enble
#define  UART2_CLK_EN()       CLKGAT1 |= BIT(11);    //clk enble

#define  UART0_RESET()        UART0CON  = 0;
#define  UART1_RESET()        UART1CON  = 0;
#define  UART2_RESET()        UART2CON  = 0;

#define  UART0_EN()           UART0CON  |= BIT(UTEN);
#define  UART1_EN()           UART1CON  |= BIT(UTEN);
#define  UART2_EN()           UART2CON  |= BIT(UTEN);

#define  UART0_MAP_RESET()      UART0_RX_MAP_RESET();UART0_TX_MAP_RESET();
#define  UART1_MAP_RESET()      UART1_RX_MAP_RESET();UART1_TX_MAP_RESET();
#define  UART2_MAP_RESET()      UART2_RX_MAP_RESET();UART2_TX_MAP_RESET();

3. 应用举例

用 PA6 PA7作为串口通讯引脚;

(1)先查看映射关系,选择 

PA6 UART1 RX G1
PA7 UART1 TX G1

(2)引脚初始化

#define  UART_PORT_INIT()     GPIOADE  |= BIT(7)|BIT(6);\
                              GPIOAPU  |= BIT(7)|BIT(6);\
                              GPIOADIR &= ~BIT(7);GPIOADIR |= BIT(6);\
                              GPIOAFEN |= BIT(7)|BIT(6);

#define  UART_MAPPING()         UART1_MAP_RESET();\
                                UART1_RX_MAP_G1();UART1_TX_MAP_G1();

#define  UART1_CLK_SRC()      UART1CON  |= (BIT(RXIE)|BIT(CLKSRC)|BIT(RXEN)); // 中断接收;时钟源为 UART_INC 

(3)串口初始化

void uart1_init(void)
{
    u32 baud_cfg;

    // IO初始化
    UART_PORT_INIT();

    // 引脚映射
    UART_MAPPING();

    // 串口寄存器配置
    UART1_RESET();

    UART1_CLK_SRC();

    // 串口时钟
    CLKCON1 |= BIT(14);//uart_inc from x26m_clkdiv4  

    // 使能相应串口的时钟
    UART1_CLK_EN();

    // 设置波特率
    baud_cfg = (26000000/2 + 115200/2)/115200 - 1;  //时钟源x26m_div2 //baud/2  

    UART1BAUD = ((baud_cfg<<16) | baud_cfg);

    // 串口模块使能
    UART1_EN();

    // 注册中断函数
    sys_irq_init(IRQ_UART_VECTOR, 0 , uart1_isr0);//注册低优先级UART中断
}

(4)中断函数

AT(.com_text.uart)
void uart1_isr0(void)
{
    u8 data = 0;
    if(UART1CON & BIT(9)){      //rx pending finish
        UART1CPND |= BIT(9);    //clean rx pending
        data = UART1DATA;
        printf("rev %x ",data);       
    }
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部