完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
由于 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个回答
|
|
首先,我们需要了解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速度设置和环回测试。需要注意的是,这里的代码只是一个示例,实际应用中可能需要根据具体需求进行调整。 |
|
|
|
只有小组成员才能发言,加入小组>>
961 浏览 1 评论
552浏览 6评论
461浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
446浏览 5评论
447浏览 4评论
417浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 00:23 , Processed in 0.782006 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号