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 p3out_addr = get_uart_port(uart_num,out_pin);//get out port p0 p1 p2 p3GPCOM_SET_IN_PORT(uart_num,in_addr);//set input modeout_reg |=GPCOM_OUT_ENABLE(out_addr);//set outputmodeout_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);}