一、基于RS232的串口重映射
RS232是全双工的,基于RS232的串口重映射实现就很简单,官方例程有提供,不再赘述;
- int fputc(int ch,FILE *p)
- {
- usart_data_transmit(USART0,(u8)ch);
- while(!usart_flag_get(USART0,USART_FLAG_TBE));
- return ch;
- }
二、基于RS485的串口打印输出
大部分的RS485芯片支持半双工通讯模式,与RS232的全双工不同多了一个收发控制,同一时刻最多只能处于收发模式中的一种,
利用编译器下的库实现,包含头文件如图,,因为需要用到va_list 类和“vsnprintf()”函数,需要将“stdarg.h”等头文件添加
三、程序
(1)、串口初始化
- void USART1_Init(u32 bound)
- {
- //时钟设置
- rcu_periph_clock_enable(RCU_GPIOA);
- rcu_periph_clock_enable(RCU_USART1);
-
- //USARTx_TX
- gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_2);
- //USARTx_RX
- gpio_init(GPIOA,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_3);
-
- #if RS485_USART1==1
- gpio_init(GPIOA,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_1);
- RS485_USART1_TX_EN=0;
- #endif
-
- //NVIC 配置
- nvic_irq_enable(USART1_IRQn,0,2);
-
- //USARTx初始化
- usart_baudrate_set(USART1,bound);
- usart_parity_config(USART1,USART_PM_NONE);
- usart_word_length_set(USART1,USART_WL_8BIT);
- usart_stop_bit_set(USART1,USART_STB_1BIT);
- usart_transmit_config(USART1,USART_TRANSMIT_ENABLE);
- usart_receive_config(USART1,USART_RECEIVE_ENABLE);
- usart_hardware_flow_rts_config(USART1,USART_RTS_DISABLE);
- usart_hardware_flow_cts_config(USART1,USART_CTS_DISABLE);
-
- //使能配置
-
- usart_interrupt_enable(USART1,USART_INT_RBNE);
- usart_interrupt_enable(USART1,USART_INT_IDLE);//开启串口空闲IDEL中断
- usart_enable(USART1); //使能串口
- USART1_printf("USART1 OK...\r\n");
- }
(2)、RS485打印函数
- void USART1_printf (char *fmt, ...)
- {
- u16 i = 0;
- va_list arg_ptr;
- va_start(arg_ptr, fmt);
- vsnprintf((char *)USART1_TX_BUF, USART1_MAX_TX_LEN+1, fmt, arg_ptr);
- va_end(arg_ptr);
-
- #if RS485_USART1==1
- RS485_USART1_TX_EN=1;
- #endif
-
- while ((i < USART1_MAX_TX_LEN) && USART1_TX_BUF[i])
- {
- while (usart_flag_get(USART1, USART_FLAG_TBE) == RESET);
- usart_data_transmit(USART1, (u8) USART1_TX_BUF[i++]);
- while (usart_flag_get(USART1, USART_FLAG_TC) == RESET);
- }
-
- #if RS485_USART1==1
- RS485_USART1_TX_EN=0;
- #endif
- }
(3)主函数
- int main(void)
- {
- sysdelay_set(96);
- led_set();
- USART1_Init(9600);
- while (1)
- {
- led_on(5);
- delay_nms(500);
- USART1_printf("led on\r\n");
- led_off(5);
- delay_nms(500);
- USART1_printf("led off\r\n");
- }
- }
四、验证结果
|