这样的话,在初始化时就可以同时对两个串口以不同的方式初始化了,但是要想使用串口1的话还需要设置串口1的位置(位置1或者2),也就是串口以所在的端口,以及其他相关的寄存器,要修改的位置在_hal_uart_isr.c文件中,在这里我们将串口1配置到位置1,也就是P04作为UART1的TX,P05作为UART1的RX,首先要将文件中所有的预编译判断#if (HAL_UART_ISR == 1)修改为#if (HAL_UART_ISR == 2),这是因为我们将他的宏定义改成了2,然后修改串口1配置有关的寄存器宏定义如下(我将默认的注释掉了): #if (HAL_UART_ISR == 2) //#if (HAL_UART_ISR == 1) /*unenable the default**********/ /*
#define PxOUT P0 #define PxDIR P0DIR #define PxSEL P0SEL #define UxCSR U0CSR #define UxUCR U0UCR #define UxDBUF U0DBUF #define UxBAUD U0BAUD #define UxGCR U0GCR #define URXxIE URX0IE #define UTXxIE UTX0IE #define UTXxIF UTX0IF */
/****************END**************/
/***************use add*******************/
#define PxOUT P0 //UART1在P0口位置 #define PxDIR P0DIR //端口0方向控制寄存器 #define PxSEL P0SEL //端口0功能选择
#define UxCSR U1CSR //UART1控制和状态寄存器 #define UxUCR U1UCR //UART1控制寄存器
#define UxDBUF U1DBUF //UART1发送和接收数据缓冲区 #define UxBAUD U1BAUD //UART1波特率设置寄存器 #define UxGCR U1GCR //UART1通用控制 #define URXxIE URX1IE //UART1 RX中断使能 #define UTXxIE UTX1IE //UART1 TX中断使能 #define UTXxIF UTX1IF //UART1 TX中断标志 /****************END***************/
接着是串口1位置有关的寄存器宏定义:
#if (HAL_UART_ISR == 2) //#if (HAL_UART_ISR == 1) /***********unenable the default************/ /*
#define HAL_UART_PERCFG_BIT 0x01 // USART0 on P0, Alt-1; so clear this bit.
#define HAL_UART_Px_RX_TX 0x0C // Peripheral I/O Select for Rx/Tx. #define HAL_UART_Px_RTS 0x20 // Peripheral I/O Select for RTS. #define HAL_UART_Px_CTS 0x10 // Peripheral I/O Select for CTS.
*/
/***************end*******************/
/*******************use add*****************/
#define HAL_UART1_PERCFG_BIT 0x02 // USART1 on P0, Alt-1; so clear this bit.
#define HAL_UART1_Px_RX_TX 0x30 // Peripheral I/O Select for Rx/Tx. #define HAL_UART1_Px_RTS 0x20 // Peripheral I/O Select for RTS. #define HAL_UART1_Px_CTS 0x10 // Peripheral I/O Select for CTS. /***********************end********************/
具体的定义不再详细说,查一下数据手册一切都明白了,
然后为了不和DMA方式中的宏定义重复,我将_hal_uart_isr.c文件中文件中的HAL_UART_PERCFG_BIT都替换成了HAL_UART1_PERCFG_BIT、把HAL_UART_Px_RX_TX都替换成了HAL_UART1_Px_RX_TX、把HAL_UART_Px_RTS都替换成了HAL_UART1_Px_RTS、把HAL_UART_Px_CTS都替换成了HAL_UART1_Px_CTS。 然后:HalUARTInitISR函数修改如下: static void HalUARTInitISR (void) {
// Set P2 priority - USART0 over USART1 if both are defined. P2DIR &= ~P2DIR_PRIPO; P2DIR |= HAL_UART_PRIPO;
#if (HAL_UART_ISR == 2)
PERCFG &= ~HAL_UART1_PERCFG_BIT; // Set UART0 I/O location to P0. #else
PERCFG |= HAL_UART1_PERCFG_BIT; // Set UART1 I/O location to P1. #endif
PxSEL |= HAL_UART1_Px_RX_TX; // Enable Tx and Rx on P1.
ADCCFG &= ~HAL_UART1_Px_RX_TX; // Make sure ADC doesnt use this. UxCSR = CSR_MODE; // Mode is UART Mode. UxUCR = UCR_FLUSH; // Flush it. }
到这里底层的修改都全部完成了,然后我们回到APP层来调用串口1,只修改协调器那里就行了。
在上一节配置默认串口的基础上,在HalUARTOpen (0,&uartConfig);后面增加语句 HalUARTOpen (1,&uartConfig);//对串口1进行初始化 这样就打开串口0和串口1
在HalUARTWrite(0,(uint8*)&sendBuff,sizeof(sendBuff)); 后面增加语句
HalUARTWrite(1,(uint8*)&sendBuff,sizeof(sendBuff)); //将接收到的数据输出到串口 这样就通过函数调用将数据通过串口0和串口1各自发送了出去。
然后同样在电脑上用串口调试软件观察就会发现两个串口都会有数据收到: