MC3172 支持12个串口对应关系如下
串口模块初始化
第一个是uart0~11
inpin RX 脚 管脚号
outpin TX脚 管脚号
baud 波特率
read_ptr ,数据读取指针
void uart_init(u32 uart_num,u8 in_pin,u8 out_pin,u32 baud,u8* read_ptr)
{
INTDEV_SET_CLK_RST(uart_num,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV4));
switch(uart_num)
{
case GPCOM0:
case GPCOM1:
case GPCOM2:
case GPCOM3:
INTDEV_SET_CLK_RST(GPIOA,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV4));
break;
case GPCOM4:
case GPCOM5:
case GPCOM6:
case GPCOM7:
INTDEV_SET_CLK_RST(GPIOB,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV4));
break;
case GPCOM8:
case GPCOM9:
case GPCOM10:
case GPCOM11:
INTDEV_SET_CLK_RST(GPIOC,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV4));
break;
}
u32 in_addr,out_addr ;
u32 out_reg =0;
in_addr = get_uart_port(uart_num,in_pin);//get input port p0 p1 p2 p3
out_addr = get_uart_port(uart_num,out_pin);//get out port p0 p1 p2 p3
GPCOM_SET_IN_PORT(uart_num,in_addr);//set input mode
out_reg |=GPCOM_OUT_ENABLE(out_addr);//set outputmode
out_reg |=GPCOM_OUT_DISABLE((out_addr+1)%4);
out_reg |=GPCOM_OUT_DISABLE((out_addr+2)%4);
out_reg |=GPCOM_OUT_DISABLE((out_addr+3)%4);
out_reg |=GPCOM_PX_HIGH((out_addr+1)%4);
out_reg |=GPCOM_PX_HIGH((out_addr+2)%4);
out_reg |=GPCOM_PX_HIGH((out_addr+3)%4);
GPCOM_SET_OUT_PORT(uart_num,out_reg);
GPCOM_SET_COM_MODE(uart_num,GPCOM_UART_MODE);
GPCOM_SET_COM_SPEED(uart_num,SYS_CLK/4,baud);
GPCOM_SET_OVERRIDE_GPIO(uart_num,GPCOM_OVERRID_GPIO(in_addr)\
|GPCOM_INPUT_ENABLE(in_addr)\
|GPCOM_OVERRID_GPIO(out_addr));
*read_ptr =GPCOM_GET_RX_WP(uart_num);
}
初始化步骤参考官方例程,需使能相关GPIO 时钟,否则无法收发
发送数据
void UartSendByte(u32 gpcom_sel, u8 dat)
{
while(GPCOM_TX_FIFO_FULL(gpcom_sel));
GPCOM_PUSH_TX_DATA(gpcom_sel,dat);
}
void UartSendMultiByte(u32 gpcom_sel,u8*dat,u32 len)
{
for(u32 i=0;i<len;i++)
{
UartSendByte(gpcom_sel,dat[i]);
}
}
接收数据
void UartReadData(u8*read_ptr,u32 gpcom_sel,u8* pData,u16 size)
{
u16 count=0;
while(count<size){
if(*read_ptr!=(GPCOM_GET_RX_WP(gpcom_sel))){ //写指针发生变化,说明有数据了
pData[count++]=GPCOM_GET_RX_DATA(gpcom_sel,*read_ptr); //读取指针指向的数据
*read_ptr=++(*read_ptr)&0x0f;
}
}
}
例子
收取到收据后,直接发出
u8 rx_data_rp;
u8 rx_data=0;
uart_init(gpcom_sel,2,3,115200,&rx_data_rp);
while(1)
{
UartReadData(&rx_data_rp,gpcom_sel,&rx_data,1);
UartSendByte(gpcom_sel,rx_data);
}