串口通讯在应用中具有广泛的用途,通过对例程的学习可以逐步来掌握这方面的使用方法。
在串口通讯中波特率的设置是一个关键,这要涉及到系统时钟源的选择。对于该多线程开发板它有2种外部时钟源,即48M无源晶振X3(已焊接)和有源晶振X5(未焊接)。

图1 外部时钟源
在使用外部48M时钟源的情况下,经分频可得到115200bps的波特率。
经测试,却无法获得9600 bps的波特率,这对于一些串口通讯设备来说不能不说是一个较大的限制。
此外,从程序分析可以得知其使用的发送与接收引脚为PA3和PA2。
为了便于测试,这里是用AT_link中的串口通讯功能来进行连接,其中TX接PA2,RX接PA3,见图2所示。

图2 通讯连接
若以线程1来启动串口通讯,则其程序代码为:
voidthread1_main(void)
{
while(1){
GPCOM_UART_EXAMPLE(GPCOM0_BASE_ADDR);
}
thread_end();
}
此时,若通讯程序为如下内容:
void GPCOM_UART_EXAMPLE(u32gpcom_sel)
{
INTDEV_SET_CLK_RST(gpcom_sel,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV4));
GPCOM_SET_IN_PORT(gpcom_sel,(GPCOM_RXD_IS_P2));
GPCOM_SET_OUT_PORT(gpcom_sel,( \
GPCOM_P0_OUTPUT_DISABLE|GPCOM_P3_OUTPUT_ENABLE|GPCOM_P2_OUTPUT_DISABLE|GPCOM_P1_OUTPUT_DISABLE|\
GPCOM_P0_IS_HIGH |GPCOM_P3_IS_TXD |GPCOM_P2_IS_HIGH |GPCOM_P1_IS_HIGH \));
GPCOM_SET_COM_MODE(gpcom_sel,GPCOM_UART_MODE);
GPCOM_SET_COM_SPEED(gpcom_sel,12000000,115200);
GPCOM_SET_OVERRIDE_GPIO(gpcom_sel, ( \
GPCOM_P2_OVERRIDE_GPIO|GPCOM_P2_INPUT_ENABLE | \
GPCOM_P3_OVERRIDE_GPIO \
));
while(1){
while(GPCOM_TX_FIFO_FULL(gpcom_sel));
for (u32 var = 0; var< 90; ++var) {
NOP();
}
GPCOM_PUSH_TX_DATA(gpcom_sel,0x31);
}
}
则其运行结果如图3所示,即连续不断地发送字符“1”,即0x31。

图3 发生字符
若将通讯程序改为如下内容:
void GPCOM_UART_EXAMPLE(u32gpcom_sel)
{
INTDEV_SET_CLK_RST(gpcom_sel,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV4));
GPCOM_SET_IN_PORT(gpcom_sel,(GPCOM_RXD_IS_P2));
GPCOM_SET_OUT_PORT(gpcom_sel,( \
GPCOM_P0_OUTPUT_DISABLE|GPCOM_P3_OUTPUT_ENABLE|GPCOM_P2_OUTPUT_DISABLE|GPCOM_P1_OUTPUT_DISABLE|\
GPCOM_P0_IS_HIGH |GPCOM_P3_IS_TXD |GPCOM_P2_IS_HIGH |GPCOM_P1_IS_HIGH \ ));
GPCOM_SET_COM_MODE(gpcom_sel,GPCOM_UART_MODE);
GPCOM_SET_COM_SPEED(gpcom_sel,12000000,115200);
GPCOM_SET_OVERRIDE_GPIO(gpcom_sel, ( \
GPCOM_P2_OVERRIDE_GPIO|GPCOM_P2_INPUT_ENABLE | \
GPCOM_P3_OVERRIDE_GPIO \
));
u8rx_data_rp=0;
u8rx_data=0;
rx_data_rp=GPCOM_GET_RX_WP(gpcom_sel);
while(1) {
if(rx_data_rp!=(GPCOM_GET_RX_WP(gpcom_sel))){
rx_data=GPCOM_GET_RX_DATA(gpcom_sel,rx_data_rp);
GPCOM_PUSH_TX_DATA(gpcom_sel,rx_data);
rx_data_rp++;
rx_data_rp&=0x0f;
}
}
}
则其运行结果如图4所示,即通过串口向开发板发送字符串,会在其接收后回馈接收的内容。

图4接收与回馈
仿此,可通过修改字符发送程序来实现串口设备的指令发送,以控制其完成指定任务。或通过修改接收程序,以实现串口设备的数据采集工作。总之,串口通讯功能是十分重要的,应该很好地去掌握。