ESP8266串口初始化

/*
 * uart0.h
 */

#ifndef APP_INCLUDE_UART0_H_
#define APP_INCLUDE_UART0_H_

#include "ets_sys.h"
#include "osapi.h"
#include "uart0.h"
#include "uart_register.h"

#define UART0   0

typedef enum
{
	FIVE_BITS = 0x0,
	SIX_BITS = 0x1,
	SEVEN_BITS = 0x2,
	EIGHT_BITS = 0x3
} UartBitsNum; //数据位个数:5、6、7、8

typedef enum
{
	ONE_STOP_BIT             = 0x1,
	ONE_HALF_STOP_BIT        = 0x2,
	TWO_STOP_BIT             = 0x3
} UartStopBitsNum;  //停止位个数:1、1.5、2

typedef enum
{
	NONE_BITS = 0x2,
	ODD_BITS   = 1,
	EVEN_BITS = 0
} UartParityMode;   //校验方式:无、奇校验、偶校验

typedef enum
{
	STICK_PARITY_DIS   = 0,
	STICK_PARITY_EN    = 1
} UartParityEN;    //开启校验与否:开、 不开

typedef enum
{
	BIT_RATE_300 = 300,
	BIT_RATE_600 = 600,
	BIT_RATE_1200 = 1200,
	BIT_RATE_2400 = 2400,
	BIT_RATE_4800 = 4800,
	BIT_RATE_9600   = 9600,
	BIT_RATE_19200  = 19200,
	BIT_RATE_38400  = 38400,
	BIT_RATE_57600  = 57600,
	BIT_RATE_74880  = 74880,
	BIT_RATE_115200 = 115200,
	BIT_RATE_230400 = 230400,
	BIT_RATE_460800 = 460800,
	BIT_RATE_921600 = 921600,
	BIT_RATE_1843200 = 1843200,
	BIT_RATE_3686400 = 3686400,
} UartBautRate;         //波特率

typedef struct
{
	UartBautRate 	  baut_rate;      //波特率
	UartBitsNum       data_bits;      //数据位个数
	UartParityEN      en_parity;      //校验开启与否
	UartParityMode 	  parity;         //校验方式
	UartStopBitsNum   stop_bits;      //停止位个数
} UartControlblock;                   //串口控制单元,包含5项

void ICACHE_FLASH_ATTR uart0_init(UartControlblock *Ucb);
LOCAL void uart0_rx_intr_handler(void *para);
voiduart_tx_one_char(u8 data);

#endif /* APP_INCLUDE_UART0_H_ */

#include "uart0.h"

u8 UART0_RX_BUFF[256];        //串口0接收数据数组

/*-------------------------------------------------------------*/
/*函数功能:串口0接收中断函数                                                                           */
/*参       数:para :指向RcvMsgBuff的指针                                                      */
/*返       回:无                                                                                                     */
/*-------------------------------------------------------------*/
LOCAL void uart0_rx_intr_handler(void *para)
{
    u32 uart0_intr_sta;   //保存中断状态
    u8  data_len;         //FIFO内数据量
    u8  i;
    uart0_intr_sta=READ_PERI_REG(UART_INT_ST(UART0));    //读取串口0中断状态

	if(UART_RXFIFO_TOUT_INT_ST==(uart0_intr_sta&UART_RXFIFO_TOUT_INT_ST))    //如果是串口接收超时中断
	{
		data_len=(READ_PERI_REG(UART_STATUS(UART0))>>UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT; //获取FIFO内数据量
		for(i=0;i<data_len;i++)
			UART0_RX_BUFF[i]=READ_PERI_REG(UART_FIFO(UART0))&0xFF; //拷贝数据到UART0_RX_BUFF数组
		os_printf("%s\r\n",UART0_RX_BUFF);//收到的数据原样发回
		os_memset(UART0_RX_BUFF,0,256);   //发送完数据后,清空UART0_RX_BUFF
	}

	WRITE_PERI_REG(UART_INT_CLR(UART0), 0xffff);         //清除全部中断标志
}

/*-------------------------------------------------------------*/
/*函数功能:串口0初始化                                                                                     */
/*参       数:Ucb:串口控制块                                                                              */
/*返       回:无                                                                                                     */
/*-------------------------------------------------------------*/
void ICACHE_FLASH_ATTR uart0_init(UartControlblock *Ucb)
{
	ETS_UART_INTR_ATTACH(uart0_rx_intr_handler, NULL);         //设置串口中断函数
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD);       //设置功能是串口0TX
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_U0RXD);       //设置功能是串口0RX

	uart_div_modify(UART0, UART_CLK_FREQ / (Ucb->baut_rate));  //设置波特率
	SET_PERI_REG_MASK(UART_CONF0(UART0), ((Ucb->en_parity & UART_PARITY_EN_M)  <<  UART_PARITY_EN_S));   //设置校验使能与否
	SET_PERI_REG_MASK(UART_CONF0(UART0), ((Ucb->parity & UART_PARITY_M)  << UART_PARITY_S));             //设置校验方式
	SET_PERI_REG_MASK(UART_CONF0(UART0), ((Ucb->stop_bits & UART_STOP_BIT_NUM) << UART_STOP_BIT_NUM_S)); //设置停止位个数
	SET_PERI_REG_MASK(UART_CONF0(UART0), ((Ucb->data_bits & UART_BIT_NUM) << UART_BIT_NUM_S));           //设置数据位个数

	SET_PERI_REG_MASK(UART_CONF0(UART0), UART_RXFIFO_RST | UART_TXFIFO_RST);    //复位收发FIFO
	CLEAR_PERI_REG_MASK(UART_CONF0(UART0), UART_RXFIFO_RST | UART_TXFIFO_RST);  //停止复位收发FIFO

	SET_PERI_REG_MASK(UART_CONF1(UART0),((0x02 & UART_RX_TOUT_THRHD) << UART_RX_TOUT_THRHD_S)); //设置FIFO接收超时中断阈值2,  单位是接收1个字节的时间
	SET_PERI_REG_MASK(UART_CONF1(UART0),UART_RX_TOUT_EN);             //使能上述,超时中断功能
	SET_PERI_REG_MASK(UART_INT_ENA(UART0), UART_RXFIFO_TOUT_INT_ENA); //使能超时接收中断
	WRITE_PERI_REG(UART_INT_CLR(UART0), 0xffff);                      //清除全部中断标志
	ETS_UART_INTR_ENABLE();                                           //开串口总中断
}
UartControlblock Uart0CB=     //串口0的控制单元,初始参数
{
    BIT_RATE_115200,   //115200波特率
	EIGHT_BITS,        //8数据位
	STICK_PARITY_DIS,  //不开检验使能
	NONE_BITS,         //无校验
	ONE_STOP_BIT,      //1个停止位
};
void ICACHE_FLASH_ATTR
user_init(void)
{
	uart0_init(&Uart0CB);  //串口0初始化,注意串口0的收发FIFO是128字节,发送数据的时候,不要溢出
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值