文章目录[隐藏]
1.硬件电路:
其拥有两个异步传输串口
UART0
和
UART1
,其中
UART0 既有发送引脚(TXD)也有接收引脚(RXD)
,而
UART1 只有发送引脚(TXD)
,UART1
的
TXD
引脚为
GPIO2
。
UART0
用作我们模组程序运行状态信息 的输出,而当我们需要将 ESP8266
与其他设备进行串口通讯的时候,由于
UART1 没有接收引脚(RXD)
,因此我们
常常将 UART1 用作状态信息的打印,而 UART0 用 作与其他设备之间的通讯
。
ESP8266
的串口默认配置为
1
个起始 位,8
个数据位,无校验位,
1
个停止位,
波特率 74880
。
UART0
默认开启,
UART1默认关闭。
2.软件设计:
1.在使用串口前,我们先需要将uart的驱动拷贝到我们的工程目录下。uart的驱动在driver_lib下,将他们分别拷贝到app/driver和app/include/driver下,然后刷新工程。
2.需要用到的函数:
void uart_init(UART0 波特率, UART1 波特率)
:
波特率可设置为:9600,19200,38400,57600,74880,115200,230400,460800, 921600
uart_init(115200,115200);//设置uart0、uart1的波特率为115200
2.os_printf(“ ”) :串口输出数据函数,用法与我们 C 语言里面的 printf 相同。
os_printf("\r\n Hello Word! \r\n");
uart0_sendStr(“”):
串口 0 发送字符串函数
uart0_sendStr("\r\n Hello Word! \r\n");
uart1_sendStr_no_wait(“”);
串口 1 发送字符串函数
uart1_sendStr_no_wait("\r\n Hello Word! 1 \r\n");
UART_SetPrintPort(uint8 uart_no):
UART_SetPrintPort(UART1);//os_printf使用串口1进行输出数据
6.接收数据:
在uart.c中的uart_recvTask()进行修改。
uart_recvTask(os_event_t *events)
{
uint8_t buf[100]={0};//存放数据
LED_GPIO_Init(); //LED初始化
if(events->sig == 0){
#if UART_BUFF_EN
Uart_rx_buff_enq();
#else
uint8 fifo_len = (READ_PERI_REG(UART_STATUS(UART0))>>UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT;
uint8 d_tmp = 0;
uint8 idx=0;
/*
for(idx=0;idx<fifo_len;idx++) {
d_tmp = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;
uart_tx_one_char(UART0, d_tmp);
}
*/
//将数据存入buf数组中
for(idx=0;idx<fifo_len;idx++)
{
buf[idx]=READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;
}
buf[idx]='\0';
//判断数组中的数据,实现led的控制
if(os_strcmp("ledon",buf)==0)
{
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0);
os_printf("LED is OPEN!\n");
}
else if(os_strcmp("ledoff",buf)==0)
{
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);
os_printf("LED is OFF!\n");
}
WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR|UART_RXFIFO_TOUT_INT_CLR);
uart_rx_intr_enable(UART0);
#endif
}else if(events->sig == 1){
#if UART_BUFF_EN
//already move uart buffer output to uart empty interrupt
//tx_start_uart_buffer(UART0);
#else
#endif
}
}
3.程序的功能和源码:
程序的功能:实现串口点灯。
程序源码:
1.user_main.c:
#include "ets_sys.h"
#include "osapi.h"
#include "c_types.h" //变量类型
#include "eagle_soc.h"//GPIO函数,宏定义
#include "user_interface.h"
#include "driver/uart.h"
/******************************************************************************
* FunctionName : user_rf_cal_sector_set
* Description : SDK just reversed 4 sectors, used for rf init data and paramters.
* We add this function to force users to set rf cal sector, since
* we don't know which sector is free in user's application.
* sector map for last several sectors : ABCCC
* A : rf cal
* B : rf init data
* C : sdk parameters
* Parameters : none
* Returns : rf cal sector
*******************************************************************************/
uint32 ICACHE_FLASH_ATTR
user_rf_cal_sector_set(void)
{
enum flash_size_map size_map = system_get_flash_size_map();
uint32 rf_cal_sec = 0;
switch (size_map) {
case FLASH_SIZE_4M_MAP_256_256:
rf_cal_sec = 128 - 5;
break;
case FLASH_SIZE_8M_MAP_512_512:
rf_cal_sec = 256 - 5;
break;
case FLASH_SIZE_16M_MAP_512_512:
rf_cal_sec = 512 - 5;
break;
case FLASH_SIZE_16M_MAP_1024_1024:
rf_cal_sec = 512 - 5;
break;
case FLASH_SIZE_32M_MAP_512_512:
rf_cal_sec = 1024 - 5;
break;
case FLASH_SIZE_32M_MAP_1024_1024:
rf_cal_sec = 1024 - 5;
break;
case FLASH_SIZE_64M_MAP_1024_1024:
rf_cal_sec = 2048 - 5;
break;
case FLASH_SIZE_128M_MAP_1024_1024:
rf_cal_sec = 4096 - 5;
break;
default:
rf_cal_sec = 0;
break;
}
return rf_cal_sec;
}
void ICACHE_FLASH_ATTR
user_rf_pre_init(void)
{
}
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_init(void)
{
uart_init(9600,9600);//初始化串口0,1波特率
os_printf("-----------------------\r\n");
os_printf("SDK Version:%s\r\n",system_get_sdk_version());
}
2.uart.c中的修改(注意添加头文件)
//LED初始化
void LED_GPIO_Init(void)
{
//设置GPIO4引脚的功能为GPIO
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,FUNC_GPIO4);
//默认输出为高点平
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);
}
LOCAL void ICACHE_FLASH_ATTR ///
uart_recvTask(os_event_t *events)
{
uint8_t buf[100]={0};
LED_GPIO_Init();
if(events->sig == 0){
#if UART_BUFF_EN
Uart_rx_buff_enq();
#else
uint8 fifo_len = (READ_PERI_REG(UART_STATUS(UART0))>>UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT;
uint8 d_tmp = 0;
uint8 idx=0;
/*
for(idx=0;idx<fifo_len;idx++) {
d_tmp = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;
uart_tx_one_char(UART0, d_tmp);
}
*/
for(idx=0;idx<fifo_len;idx++)
{
buf[idx]=READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;
}
buf[idx]='\0';
if(os_strcmp("ledon",buf)==0)
{
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0);
os_printf("LED is OPEN!\n");
}
else if(os_strcmp("ledoff",buf)==0)
{
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);
os_printf("LED is OFF!\n");
}
WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR|UART_RXFIFO_TOUT_INT_CLR);
uart_rx_intr_enable(UART0);
#endif
}else if(events->sig == 1){
#if UART_BUFF_EN
//already move uart buffer output to uart empty interrupt
//tx_start_uart_buffer(UART0);
#else
#endif
}
}
4.运行结果:
版权声明:本文为CSDN博主「流年_cth」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_46364710/article/details/122554991
暂无评论