中科蓝讯 串口接收和发送 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);       
    }
}

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值