TA的每日心情 | 擦汗 4 小时前 |
---|
签到天数: 616 天 连续签到: 2 天 [LV.9]以坛为家II
|
下面测试学习串口操作。参考例子,实现串口的发送接收,printf的重定向和nr_micro_shell移植。首先对串口初始化
- //uart
- #define UART0_RTX_PIN UART0_RX_PB3 //SINGLE
- #define UART0_TX_PIN UART0_TX_PB2
- #define UART0_RX_PIN UART0_RX_PB3
- #define UART0_CTS_PIN UART0_CTS_PA1
- #define UART0_RTS_PIN UART0_RTS_PA2
复制代码- //UART
- uart_reset(UART0);
- uart_rtx_en(UART0);
- uart_set_pin(UART0_TX_PIN,UART0_RX_PIN);
- uart_cal_div_and_bwpc(115200, sys_clk.pclk*1000*1000, &div, &bwpc);
- uart_init(UART0, div, bwpc, UART_PARITY_NONE, UART_STOP_BIT_ONE);
- uart_tx_irq_trig_level(UART0, 0);
- uart_rx_irq_trig_level(UART0, 1);
- uart_set_irq_mask(UART0, UART_RX_IRQ_MASK|UART_ERR_IRQ_MASK);
- plic_interrupt_enable(IRQ19_UART0); //if you want to use UART1,the parameter is - IRQ18_UART1
复制代码 串口发送
- int stdout_putchar (int ch)
- {
- uart_clr_tx_done(UART0);
- uart_send_byte(UART0, ch&0xff);
- while(uart_tx_is_busy(UART0));
- return ch;
- }
复制代码 串口中断接收
- /**
- * @brief This function serves to handle the interrupt of MCU
- * @param[in] none
- * @return none
- */
- _attribute_ram_code_sec_ void uart0_irq_handler(void)// if you want to use UART1,the function is - uart1_irq_handler()
- {
- if(uart_get_irq_status(UART0, UART_RX_ERR))
- {
- gpio_toggle(LED4);
- uart_clr_irq_status(UART0,UART_CLR_RX);// it will clear rx_fifo and rx_err_irq ,rx_buff_irq,so it won't enter rx_buff_irq interrupt.
- uart_reset(UART0); //clear hardware pointer
- uart_clr_rx_index(UART0); //clear software pointer
- }
- if(uart_get_irq_status(UART0, UART_RXBUF_IRQ_STATUS))
- {
- fifo_push(&print_uart_rx,uart_read_byte(UART0));
- }
- }
复制代码
测试发送接收,即将接收的数据发送出去
- if(fifo_pop(&print_uart_rx,&ch) == 0)
- {
- stdout_putchar(ch);
- }
复制代码
硬件链接,通过USB转串口连接开发板的PB2,PB3脚。
下一步重定向printf输出。
首先关闭sdk中的printf功能。
实现如下函数
- __attribute__((used)) int _write(int fd, const unsigned char *buf, int size)
- {
- (void) fd;
- int i;
- for (i = 0; i < size; i++){
- stdout_putchar(buf[i]);
- }
- return i;
- }
复制代码
在需要printf打印输出的文件包含头文件stdio.h即可。
下面移植nr_micro_shell,下载源码,放入工程目录内,然后配置shell。
然后初始化shell,在循环中处理串口接收的字符。
- void main_loop (void)
- {
- uint8_t ch;
- gpio_toggle(LED1);
- delay_ms(50);
- if(fifo_pop(&print_uart_rx,&ch) == 0)
- {
- //stdout_putchar(ch);
- shell(ch);
- gpio_toggle(LED3);
- }
- }
复制代码
工程代码:
demo.zip
(4.7 MB, 下载次数: 3)
|
|