乐鑫技术交流
直播中

乐侨珂

8年用户 1010经验值
擅长:控制/MCU
私信 关注
[问答]

esp8266如何设置uart速度的环回测试?

由于 esp8266 uart 速度可以设置为 115200*40(即大约 4.5Mbps),因此我们可以设置这样的 uart 环回测试。

在 uart.c 中

本地空ICACHE_FLASH_ATTR
uart_config(uint8 uart_no)
{
    if (uart_no == UART1) {
        PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_U1TXD_BK);
    } else {
        /* rcv_buff size if 0x100 */
        ETS_UART_INTR_ATTACH(uart0_rx_intr_handler,  &(UartDev.rcv_buff));
        PIN_PULLUP_DIS(PERIPHS_IO_MUX_U0TXD_U);
        PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD);
    }

    uart_div_modify(uart_no, UART_CLK_FREQ / (UartDev.baut_rate));

    WRITE_PERI_REG(UART_CONF0(uart_no),    UartDev.exist_parity
                   | UartDev.parity
                   | (UartDev.stop_bits << UART_STOP_BIT_NUM_S)
                   | (UartDev.data_bits << UART_BIT_NUM_S));
    //clear rx and tx fifo,not ready
    SET_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST);//|UART_LOOPBACK);/*if set UART_LOOPBACK BIT,the tx rx will be connected inside the chip*/
    CLEAR_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST);
    //set rx fifo trigger  and rx tout en , rx tout thresh
    //WRITE_PERI_REG(UART_CONF1(uart_no), (UartDev.rcv_buff.TrigLvl & UART_RXFIFO_FULL_THRHD) << UART_RXFIFO_FULL_THRHD_S);
    WRITE_PERI_REG(UART_CONF1(uart_no), UART_RX_TOUT_EN |
                               (0x10 &UART_RX_TOUT_THRHD) << UART_RX_TOUT_THRHD_S   );
    //clear all interrupt
    WRITE_PERI_REG(UART_INT_CLR(uart_no), 0xffff);
    //enable rx_interrupt : rx fifo full and rx tout
    CLEAR_PERI_REG_MASK(UART_INT_ENA(uart_no), 0x1ff);//DISABLE FIFO_FULL INT
    SET_PERI_REG_MASK(UART_INT_ENA(uart_no),  UART_RXFIFO_TOUT_INT_ENA);// UART_RXFIFO_FULL_INT_ENA |

}

状态 ICACHE_FLASH_ATTR
uart0_tx_one_char(uint8 TxChar)  //add definition in uart.h
{
    while (true)
   {
      uint32 fifo_cnt = READ_PERI_REG(UART_STATUS(UART0)) & (UART_TXFIFO_CNT<> UART_TXFIFO_CNT_S & UART_TXFIFO_CNT) < 126) {
         break;
      }
   }
   WRITE_PERI_REG(UART_FIFO(UART0) , TxChar);
   return OK;
}

本地空ICACHE_FLASH_ATTR
uart0_rx_intr_handler(void *para)
{
    /* uart0 and uart1 intr combine togther, when interrupt occur, see reg 0x3ff20020, bit2, bit0 represents
     * uart1 and uart0 respectively
     */
   RcvMsgBuff *pRxBuff = (RcvMsgBuff *)para;
   uint8 RcvChar;
   static uint32 t1=0,t2=0;
   uint32 fifo_cnt=0;
   if (UART_RXFIFO_FULL_INT_ST == (READ_PERI_REG(UART_INT_ST(UART0)) & UART_RXFIFO_FULL_INT_ST)) {
      os_printf("full intrnr");
      WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR);
   }else if(UART_RXFIFO_TOUT_INT_ST == (READ_PERI_REG(UART_INT_ST(UART0)) & UART_RXFIFO_TOUT_INT_ST)) {
      //os_printf("uart rx time out nr");
      WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_TOUT_INT_CLR);
      while (READ_PERI_REG(UART_STATUS(UART0)) & (UART_RXFIFO_CNT << UART_RXFIFO_CNT_S)) {
      RcvChar = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;
      if(RcvChar=='U'){
         uart0_tx_one_char(RcvChar);
      }else{
         uart0_tx_one_char('T');
         uart0_tx_one_char(RcvChar);
         uart0_tx_one_char('T');
         while(1){}
      }
      }
      WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_TOUT_INT_CLR);
       }
   else{
      //clear all interrupt
      os_printf("other intr occurednr");
      WRITE_PERI_REG(UART_INT_CLR(UART0), 0xffff);
   }

}
无效ICACHE_FLASH_ATTR
uart_init(UartBautRate uart0_br, UartBautRate uart1_br)
{
    // rom use 74880 baut_rate, here reinitialize
    UartDev.baut_rate = uart0_br;
    uart_config(UART0);
    UartDev.baut_rate = uart1_br;
    uart_config(UART1);
    ETS_UART_INTR_ENABLE();
    // install uart1 putc callback
    os_install_putc1((void *)uart1_write_char);

}

在 user_main.c 中:

#include "osapi.h"
//#include "driver/uart.h"
os_timer_t uart_init_timer;
无效 loop_test_init()
{
   uart_init(115200*40, 74880);
   int i = 0;
   while( (READ_PERI_REG(UART_STATUS(0)) & (UART_TXFIFO_CNT<

回帖(1)

刘敏

2024-7-15 16:55:13
首先,我们需要了解ESP8266的UART(通用异步接收/发送器)功能。UART是一种串行通信协议,用于在设备之间传输数据。ESP8266具有两个UART接口,UART0和UART1。

要设置ESP8266的UART速度并进行环回测试,可以按照以下步骤操作:

1. 配置UART参数:在ESP8266的固件中,首先需要配置UART的参数,包括波特率、数据位、停止位和奇偶校验位。这里我们以115200波特率为例。

```c
#include "c_types.h"
#include "osapi.h"
#include "uart.h"

LOCAL void ICACHE_FLASH_ATTR uart_config(uint8 uart_no) {
    if (uart_no == UART1) {
        PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_U1TXD_BK);
    } else {
        // 配置UART0的参数
        uart_div_modify(0, UART_CLK_FREQ / 115200); // 设置波特率为115200
        WRITE_PERI_REG(UART_CONF0(0), (STICK_PARITY_DIS)); // 8位数据位,无奇偶校验,1位停止位
    }
}
```

2. 初始化UART:在配置好UART参数后,需要初始化UART。

```c
LOCAL void ICACHE_FLASH_ATTR uart_init(uint8 uart_no) {
    if (uart_no == UART1) {
        // 初始化UART1
    } else {
        // 初始化UART0
        uart_config(0); // 调用上面定义的uart_config函数
        ETS_UART_INTR_ENABLE(); // 使能UART中断
    }
}
```

3. 编写环回测试代码:接下来,编写一个函数来发送数据并接收数据,以测试UART的环回性能。

```c
LOCAL void ICACHE_FLASH_ATTR uart_loopback_test(uint8 uart_no) {
    if (uart_no == UART1) {
        // 测试UART1的环回
    } else {
        // 测试UART0的环回
        char data[64];
        int len = os_sprintf(data, "Hello, ESP8266!");
        uart_tx_buffer(0, data, len); // 发送数据

        // 接收数据
        while (uart_rx_one_char(0, (uint8*)&data, sizeof(data)) == 0);
        os_printf("Received: %sn", data);
    }
}
```

4. 在主函数中调用初始化和测试函数:

```c
void ICACHE_FLASH_ATTR user_init(void) {
    uart_init(0); // 初始化UART0
    uart_loopback_test(0); // 执行UART0的环回测试
}
```

这样,我们就完成了ESP8266的UART速度设置和环回测试。需要注意的是,这里的代码只是一个示例,实际应用中可能需要根据具体需求进行调整。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分