新手入门
- 积分
- 7
- 金钱
- 7
- 注册时间
- 2019-7-27
- 在线时间
- 2 小时
|
1金钱
本帖最后由 花都拔得鸟 于 2019-7-27 10:58 编辑
整个事情是这样的。我有一个STM32F103zet6的板子,一个ESP8266的WIFI模块。一个USB转TTL的转接器。做了一个简单的实验。
步骤1:STM32F103zet6 的PA9,PA10->接USB转TTL的转接器的RXD和TXD,程序逻辑很简单,收到电脑发送给STM32板的一个数据,STM32板的LED0就闪一下。测试成功没有问题。说明程序是好的,STM32板也是好的。
步骤2:ESP8266的WIFI的RXD和TXD->接接USB转TTL的转接器的TXD和RXD,程序逻辑很简单,ESP8266使用AP模式TCP服务器,手机作为客户端连上以后发送数据,电脑显示手机发送过来的数据,测试成功没有问题。说明程序是好的,SP8266的WIFI模块也是好的。
问题来了:将ESP8266的WIFI的RXD和TXD接到STM32F103zet6 的PA9,PA10,同理,ESP8266使用AP模式TCP服务器,手机作为客户端连上以后发送数据,STM32板收到数据LED0就闪一下。不成功,其实也不是完全不成功。情况如下:
1、每次手机发送数据,平均发送20-30次,LED0闪一下。
2、偶尔出现某次主板重新加电后,程序正常,手机发一个数据,LED0闪一下。几率不到5%;
3、这两天的各种实验,已排除硬件自身原因,硬件没有问题的。
以下是关键代码:
- int main(void)
- {
- vu8 key=0;
- u8 Res;
- delay_init();
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- uart_init(115200); // 看了有些帖子,说波特率降低些,就试过,同时把STM32的板子和ESP8266都降低,无效。
- LED_Init();
- while (1)
- {
- if(zj==1)
- {
- LED0=0;
- delay_ms(500);
- zj=0;
- LED0=1;
- }
- }
- }
复制代码- #if EN_USART1_RX //如果使能了接收
- //串口1中断服务程序
- //注意,读取USARTx->SR能避免莫名其妙的错误
- u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
- //接收状态
- //bit15, 接收完成标志
- //bit14, 接收到0x0d
- //bit13~0, 接收到的有效字节数目
- u16 USART_RX_STA=0; //接收状态标记
- u8 zj=0;
-
- void uart_init(u32 bound){
- //GPIO端口设置
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟
- USART_DeInit(USART1); //复位串口1
- //USART1_TX GPIOA.9
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
-
- //USART1_RX GPIOA.10初始化
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
- GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10
- //Usart1 NVIC 配置
- NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
- NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
-
- //USART 初始化设置
- USART_InitStructure.USART_BaudRate = bound;//串口波特率
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
- USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
- USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
- USART_Init(USART1, &USART_InitStructure); //初始化串口1
- USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
- USART_Cmd(USART1, ENABLE); //使能串口1
- }
- void USART1_IRQHandler(void) //串口1中断服务程序
- {
- u8 Res;
- #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
- OSIntEnter();
- #endif
- zj=1;//这里设置点灯,用ESP8266传入数据,这个中断偶尔进入一次,手机平均发送20-30次,LED0才闪一下。
- if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
- {
- Res =USART_ReceiveData(USART1); //读取接收到的数据
- // zj=1;
- // if(Res==0x31) zj=1;
- // else zj=0;
-
- if((USART_RX_STA&0x8000)==0)//接收未完成
- {
- if(USART_RX_STA&0x4000)//接收到了0x0d
- {
- if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
- else USART_RX_STA|=0x8000; //接收完成了
- }
- else //还没收到0X0D
- {
- if(Res==0x0d)USART_RX_STA|=0x4000;
- else
- {
- USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
- USART_RX_STA++;
- if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
- }
- }
- }
- }
- #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
- OSIntExit();
- #endif
- }
- #endif
复制代码
|
|