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);
}
}