在这里需要重点说明的是,并不是所有的管脚都能成为Uart管脚,只要被定义成Uart相关功能的GPIO管脚才行,具体来说,需要参考mbed每个平台实现的Serial_api.c文件,其中的相关代码入如下: #define UART_NUM 4 static const PinMap PinMap_UART_TX[] = { {P0_0, UART_3, 2}, {P0_2, UART_0, 1}, {P0_10, UART_2, 1}, {P0_15, UART_1, 1}, {P0_25, UART_3, 3}, {P2_0 , UART_1, 2}, {P2_8 , UART_2, 2}, {P4_28, UART_3, 3}, {NC , NC , 0} }; static const PinMap PinMap_UART_RX[] = { {P0_1 , UART_3, 2}, {P0_3 , UART_0, 1}, {P0_11, UART_2, 1}, {P0_16, UART_1, 1}, {P0_26, UART_3, 3}, {P2_1 , UART_1, 2}, {P2_9 , UART_2, 2}, {P4_29, UART_3, 3}, {NC , NC , 0} }; static const PinMap PinMap_UART_RTS[] = { {P0_22, UART_1, 1}, {P2_7, UART_1, 2}, {NC, NC, 0} }; static const PinMap PinMap_UART_CTS[] = { {P0_17, UART_1, 1}, {P2_2, UART_1, 2}, {NC, NC, 0} }; 这四个PinMap类型的定义就定义了可以用作Uart各类功能的管脚名称,其中的PinMap类型定义如下: typedefstruct { PinNamepin; intperipheral; intfunction;
} PinMap; 其中的各个成员函数可以理解成管脚好、功能类型即UART、ADC、I2C等以及该功能对应GPIO的复用功能知识,如PinMap_UART_TX[]中的 {P0_0, UART_3, 2}表示P0_0管脚可以用作UART3的TX管脚,它对应的功能序号为2;PinMap_UART_RX[]中的{P0_1 , UART_3, 2}表示P0_1管脚可以用作UART3的RX管脚,它对应的功能序号为2。如果你查找LPC1768的Datasheet,你可以发现下面的说明: ![](http://mbed.smeshlink.com/images/handbook/uart2.png)
后面的I2C,SPI等的构造函数也是同样的原理。对于xbed LPC1768来说,它一共有4个UART口,分别是UART0,UART1,UART2,UART3,其中的UART0已经和CP2104相连,同时也用作printf的重定向输出,用户无法外接使用。
|