查看: 1291|回复: 0

[评测分享] 【Telink-泰凌微电子 B91通用开发套件】+串口nr_micro_shell移植

[复制链接]
  • TA的每日心情
    奋斗
    昨天 11:10
  • 签到天数: 592 天

    连续签到: 5 天

    [LV.9]以坛为家II

    发表于 2023-11-4 17:59:25 | 显示全部楼层 |阅读模式
    分享到:
    下面测试学习串口操作。参考例子,实现串口的发送接收,printf的重定向和nr_micro_shell移植。首先对串口初始化
    1. //uart
    2. #define UART0_RTX_PIN        UART0_RX_PB3        //SINGLE
    3. #define UART0_TX_PIN    UART0_TX_PB2
    4. #define UART0_RX_PIN    UART0_RX_PB3
    5. #define UART0_CTS_PIN   UART0_CTS_PA1
    6. #define UART0_RTS_PIN   UART0_RTS_PA2
    复制代码
    1. //UART
    2.         uart_reset(UART0);
    3.         uart_rtx_en(UART0);

    4.         uart_set_pin(UART0_TX_PIN,UART0_RX_PIN);

    5.         uart_cal_div_and_bwpc(115200, sys_clk.pclk*1000*1000, &div, &bwpc);
    6.         uart_init(UART0, div, bwpc, UART_PARITY_NONE, UART_STOP_BIT_ONE);
    7.         uart_tx_irq_trig_level(UART0, 0);
    8.         uart_rx_irq_trig_level(UART0, 1);
    9.         uart_set_irq_mask(UART0, UART_RX_IRQ_MASK|UART_ERR_IRQ_MASK);
    10.         plic_interrupt_enable(IRQ19_UART0); //if you want to use UART1,the parameter is - IRQ18_UART1
    复制代码
    串口发送
    1. int stdout_putchar (int ch)
    2. {
    3.         uart_clr_tx_done(UART0);
    4.         uart_send_byte(UART0, ch&0xff);
    5.         while(uart_tx_is_busy(UART0));
    6.     return ch;
    7. }
    复制代码
    串口中断接收
    1. /**
    2. * @brief                This function serves to handle the interrupt of MCU
    3. * @param[in]         none
    4. * @return                 none
    5. */
    6. _attribute_ram_code_sec_ void uart0_irq_handler(void)// if you want to use UART1,the function is - uart1_irq_handler()
    7. {
    8.         if(uart_get_irq_status(UART0, UART_RX_ERR))
    9.         {
    10.                 gpio_toggle(LED4);
    11.                 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.
    12.                 uart_reset(UART0); //clear hardware pointer
    13.                 uart_clr_rx_index(UART0); //clear software pointer
    14.         }
    15.         if(uart_get_irq_status(UART0, UART_RXBUF_IRQ_STATUS))
    16.         {
    17.                 fifo_push(&print_uart_rx,uart_read_byte(UART0));
    18.         }
    19. }
    复制代码

    测试发送接收,即将接收的数据发送出去

    1. if(fifo_pop(&print_uart_rx,&ch) == 0)
    2.         {
    3.                 stdout_putchar(ch);
    4. }
    复制代码

    硬件链接,通过USB转串口连接开发板的PB2,PB3脚。
    1.jpg
    2.jpg

    下一步重定向printf输出。
    首先关闭sdk中的printf功能。
    3.jpg

    实现如下函数
    1. __attribute__((used)) int _write(int fd, const unsigned char *buf, int size)
    2. {
    3.     (void) fd;
    4.     int    i;
    5.     for (i = 0; i < size; i++){
    6.             stdout_putchar(buf[i]);
    7.     }
    8.     return i;
    9. }
    复制代码


    在需要printf打印输出的文件包含头文件stdio.h即可。

    下面移植nr_micro_shell,下载源码,放入工程目录内,然后配置shell。
    4.jpg

    然后初始化shell,在循环中处理串口接收的字符。
    1. void main_loop (void)
    2. {
    3.         uint8_t ch;
    4.         gpio_toggle(LED1);
    5.         delay_ms(50);
    6.         if(fifo_pop(&print_uart_rx,&ch) == 0)
    7.         {
    8.                 //stdout_putchar(ch);
    9.                 shell(ch);
    10.                 gpio_toggle(LED3);

    11.         }
    12. }
    复制代码


    工程代码:
    demo.zip (4.7 MB, 下载次数: 3)
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-22 06:11 , Processed in 0.111623 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.