初级会员
积分 69
金钱 69
注册时间 2022-3-8
在线时间 24 小时
6 金钱
#include "delay.h"
#include "esp8266.h"
#include "led.h"
#include "key.h"
#include "stdio.h"
#include "sys.h"
u8 at_cwmode[] = {0x41, 0x54, 0x2B, 0x43, 0x57, 0x4D, 0x4F, 0x44, 0x45, 0x3D,
0x33, 0x0D, 0x0A};//AT+CWMODE=3(回车)
u8 at_rst[] = {0x41, 0x54, 0x2B, 0x52, 0x53, 0x54, 0x0D, 0x0A};//AT+RST(回车)
u8 at_cwsap[] = {0x41, 0x54, 0x2B, 0x43, 0x57, 0x53, 0x41, 0x50, 0x3D, 0x22,
0x45, 0x53, 0x50, 0x38, 0x32, 0x36, 0x36, 0x5F, 0x54, 0x45,
0x53, 0x54, 0x22, 0x2C, 0x22, 0x31, 0x32, 0x33, 0x34, 0x35,
0x36, 0x37, 0x38, 0x39, 0x30, 0x22, 0x2C, 0x31, 0x2C, 0x33,
0x0D, 0x0A};//AT+CWSAP="ESP8266_TEST","1234567890",1,3(回车)
u8 at_cipmux[] = {0x41, 0x54, 0x2B, 0x43, 0x49, 0x50, 0x4D, 0x55, 0x58,
0x3D, 0x31, 0x0D, 0x0A};//AT+CIPMUX=1(回车)
u8 at_sipserver[] = {0x41, 0x54, 0x2B, 0x43, 0x49, 0x50, 0x53, 0x45, 0x52, 0x56,
0x45, 0x52, 0x3D, 0x31, 0x2C, 0x38, 0x30, 0x38, 0x30, 0x0D,
0x0A};//AT+CIPSERVER=1,8080(回车)
int main(void)
{
u8 key;
u16 t;
u16 len;
u16 times=0;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart3_init(36,115200);
uart1_init(72,115200);
int i = 0;
for(i = 0; i < 13; i++){
USART3->DR = at_cwmode[i];//送出AT+CWMODE=3(回车)
while((USART3->SR & 0x80) == 0);//直到发送成功
}
delay_ms(1000);
for(i = 0; i < 8; i++){
USART3->DR = at_rst[i];//送出AT+RST(回车)
while((USART3->SR & 0x80) == 0);//直到发送成功
}
delay_ms(2000);
for(i = 0; i < 42; i++){
USART3->DR = at_cwsap[i];//送出AT+CWSAP="ESP8266_TEST","1234567890",1,3(回车)
while((USART3->SR & 0x80) == 0);//直到发送成功
}
delay_ms(1000);
for(i = 0; i < 13; i++){
USART3->DR = at_cipmux[i];//送出AT+CIPMUX=1(回车)
while((USART3->SR & 0x80) == 0);//直到发送成功
}
delay_ms(1000);
for(i = 0; i < 21; i++){
USART3->DR = at_sipserver[i];//送出AT+CIPSERVER=1,8080(回车)
while((USART3->SR & 0x80) == 0);//直到发送成功
}
while(1)
{
if(USART3_RX_STA&0x8000)
{
len=USART3_RX_STA&0x3FFF;//得到此次接收到的数据长度
printf("\r\n您发送的消息为:\r\n\r\n");
for(t=0;t<len;t++)
{
USART1->DR=USART3_RX_BUF[t];
while((USART1->SR&0X40)==0);//等待发送结束
}
printf("\r\n\r\n");//插入换行
USART3_RX_STA=0;
}else
{
times++;
if(times%5000==0)
{
printf("\r\n精英STM32F103开发板 串口实验\r\n");
printf("正点原子@ALIENTEK\r\n\r\n");
}
if(times%200==0)printf("请输入数据,以回车键结束\r\n");
if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
delay_ms(10);
}
}
}
---------------------------------------------------------------------
#include "esp8266.h"
#include "sys.h"
#include "stdio.h"
#if SYSTEM_SUPPORT_OS
#include "includes.h" //ucos 使用
#endif
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定向fputc函数
//printf的输出,指向fputc,由fputc输出到串口
//这里使用串口1(USART1)输出printf信息
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//等待上一次串口数据发送完成
USART1->DR = (u8) ch; //写DR,串口1将发送数据
return ch;
}
#endif
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字节数目
u16 USART3_RX_STA=0; //接收状态标记
u8 USART3_RX_BUF[USART3_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
void USART3_IRQHandler(void)
{
u8 res,t;
u16 len;
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntEnter();
#endif
if(USART3->SR&(1<<5)) //接收到数据
{
res=USART3->DR;
if((USART3_RX_STA&0x8000)==0)//接收未完成
{
if(USART3_RX_STA&0x4000)//接收到了0x0d
{
USART3_RX_BUF[USART3_RX_STA&0X3FFF]=res;
USART3_RX_STA++;
if(res!=0x0a)
USART3_RX_STA=0;//接收错误,重新开始
else
{
USART3_RX_STA|=0x8000; //接收完成了
USART3_RX_BUF[USART3_RX_STA&0X3FFF]=res;
USART3_RX_STA++;
}
}else //还没收到0X0D
{
if(res==0x0d)USART3_RX_STA|=0x4000;
else
{
USART3_RX_BUF[USART3_RX_STA&0X3FFF]=res;
USART3_RX_STA++;
if(USART3_RX_STA>(USART3_REC_LEN-1))USART3_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntExit();
#endif
}
u8 USART1_RX_BUF[USART3_REC_LEN];
u16 USART1_RX_STA;
void USART1_IRQHandler(void)
{
u8 res;
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntEnter();
#endif
if(USART1->SR&(1<<5)) //接收到数据
{
res=USART1->DR;
if((USART1_RX_STA&0x8000)==0)//接收未完成
{
if(USART1_RX_STA&0x4000)//接收到了0x0d
{
if(res!=0x0a)USART1_RX_STA=0;//接收错误,重新开始
else USART1_RX_STA|=0x8000; //接收完成了
}else //还没收到0X0D
{
if(res==0x0d)USART1_RX_STA|=0x4000;
else
{
USART1_RX_BUF[USART1_RX_STA&0X3FFF]=res;
USART1_RX_STA++;
if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntExit();
#endif
}
//初始化IO 串口3
//pclk2 CLK2时钟频率(Mhz)
//bound:波特率
void uart3_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV(分频值)
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<3; //使能PORTB口时钟
RCC->APB1ENR|=1<<18; //使能串口时钟
GPIOB->CRH&=0XFFFF00FF;//IO状态设置
GPIOB->CRH|=0X00008B00;//IO状态设置
RCC->APB1RSTR|=1<<18; //复位串口1
RCC->APB1RSTR&=~(1<<18);//停止复位
//波特率设置
USART3->BRR=mantissa; // 波特率设置
USART3->CR1|=0X200C; //1位停止,无校验位.
#if EN_USART3_RX //如果使能了接收
//使能接收中断
USART3->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART3_IRQn,2);//组2,最低优先级
#endif
}
void uart1_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV(分频值)
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能PORTA口时钟
RCC->APB2ENR|=1<<14; //使能串口时钟
GPIOB->CRH&=0XFFFFF00F;//IO状态设置
GPIOB->CRH|=0X000008B0;//IO状态设置
RCC->APB2RSTR|=1<<14; //复位串口1
RCC->APB2RSTR&=~(1<<14);//停止复位
//波特率设置
USART1->BRR=mantissa; // 波特率设置
USART1->CR1|=0X200C; //1位停止,无校验位.
#if EN_USART1_RX //如果使能了接收
//使能接收中断
USART1->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级
#endif
}
--------------------------------------------------------------------------
#ifndef __ESP8266_H
#define __ESP8266_H
#include "sys.h"
#include "stm32f10x.h"
#define USART3_REC_LEN 200 //定义最大接收字节数 2000
#define USART1_REC_LEN 200 //定义最大接收字节数 200
#define EN_USART3_RX 1 //使能(1)/禁止(0)串口1接收
#define EN_USART1_RX 1
extern u8 USART3_RX_BUF[USART3_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
extern u16 USART3_RX_STA; //接收状态标记
extern u8 USART1_RX_BUF[USART3_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
extern u16 USART1_RX_STA; //接收状态标记
void uart3_init(u32 pclk2,u32 bound);
void uart1_init(u32 pclk2,u32 bound);
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
#endif
我来回答