woodwang 发表于 2023-11-4 17:59:25

【Telink-泰凌微电子 B91通用开发套件】+串口nr_micro_shell移植

下面测试学习串口操作。参考例子,实现串口的发送接收,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         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);
    }
    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);

        }
}

工程代码:









页: [1]
查看完整版本: 【Telink-泰凌微电子 B91通用开发套件】+串口nr_micro_shell移植