找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2|回复: 0
打印 上一主题 下一主题
收起左侧

GD32F470的usart不能通过中断接收信息,但可以正常发送信息

[复制链接]
跳转到指定楼层
楼主
ID:1157678 发表于 2025-8-12 10:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <string.h>
#include "systick.h"
#include <stdbool.h>

//宏定义
#define ESP_USART_PORT_RCU        RCU_GPIOC
#define ESP_USART_PORT            GPIOC
#define ESP_USART_TX_PIN          GPIO_PIN_10
#define ESP_USART_RX_PIN          GPIO_PIN_11
#define ESP_USART                 USART2
#define ESP_USART_RCU             RCU_USART2
#define ESP_USART_RX_BUF_SIZE     128

//wifi串口初始化
void wifi_usart_config(void);

//AT指令发送函数
void wifi_usart_transmit_cmd(const char *cmd,const char *expected);

//发送字节
void wifi_usart_transmit_byte(uint8_t ucch);

//发送字符串
void wifi_usart_transmit_string(uint8_t *ucstr);

//接收函数
void USART2_IRQHandler(void);

//配置wifi为热点模式
void esp8266_server_init(void);

#endif





#include "WIFI.h"
#include <stdio.h>
uint8_t  wifi_usart_recv_buf[ESP_USART_RX_BUF_SIZE] = {};
uint16_t wifi_usart_recv_index = 0;
uint8_t  wifi_usart_complete_flag = 0;
        
//wifi串口初始化
void wifi_usart_config(void)
{
//禁用usart2
        usart_disable(ESP_USART);
        
//给usart2和pc10、pc11使能
        rcu_periph_clock_enable(ESP_USART_RCU);
        rcu_periph_clock_enable(ESP_USART_PORT_RCU);
        
//配置pc10 tx为推挽输出,pc11 rx为浮空输入
        gpio_mode_set(ESP_USART_PORT,GPIO_MODE_AF,GPIO_PUPD_PULLUP,ESP_USART_TX_PIN);
  gpio_output_options_set(ESP_USART_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,ESP_USART_TX_PIN);
  gpio_mode_set(ESP_USART_PORT,GPIO_MODE_AF,GPIO_PUPD_PULLUP,ESP_USART_RX_PIN);
  gpio_output_options_set(ESP_USART_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,ESP_USART_RX_PIN);
        
//配置引脚复用
        gpio_af_set(ESP_USART_PORT, GPIO_AF_7, ESP_USART_TX_PIN);
  gpio_af_set(ESP_USART_PORT, GPIO_AF_7, ESP_USART_RX_PIN);

//usart2配置
        usart_deinit(ESP_USART);
  usart_baudrate_set(ESP_USART, 115200);
  usart_word_length_set(ESP_USART, USART_WL_8BIT);
  usart_stop_bit_set(ESP_USART, USART_STB_1BIT);
  usart_parity_config(ESP_USART, USART_PM_NONE);
  usart_receive_config(ESP_USART, USART_RECEIVE_ENABLE);
  usart_transmit_config(ESP_USART, USART_TRANSMIT_ENABLE);
        
//使能usart2
  usart_enable(ESP_USART);
        
//配置usart2中断
  nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
        nvic_irq_enable(USART2_IRQn, 2, 2);            
  usart_interrupt_enable(ESP_USART,USART_INT_RBNE);
  usart_interrupt_enable(ESP_USART,USART_INT_IDLE);
}

//AT指令发送响应函数
void wifi_usart_transmit_cmd(const char *cmd,const char *expected)
{
//发送指令
          wifi_usart_transmit_string((uint8_t *)cmd);

//等待接收到期待响应
    while((strcmp((const char *)wifi_usart_recv_buf, expected) != 0)||(wifi_usart_complete_flag==0))
                {
                        wifi_usart_transmit_string("error");
                        delay_1ms(10000);
          }

//清零存放响应的数组,便于下一次接收信息
                memset(wifi_usart_recv_buf, '\0', sizeof(wifi_usart_recv_buf));
    wifi_usart_recv_index = 0;
                wifi_usart_complete_flag = 0;
}

//发送字节
void wifi_usart_transmit_byte(uint8_t ucch)
{
// 发送数据
        usart_data_transmit(ESP_USART,(uint8_t)ucch);                                                         

// 等待发送数据缓冲区标志置位
        while(usart_flag_get(ESP_USART,USART_FLAG_TBE)==RESET);  
}

//发送字符串
void wifi_usart_transmit_string(uint8_t *string)
{
// 当字符串指针不为空且当前字符不为空时循环
        while(string && *string)        // 地址为空或者值为空跳出
        {
          wifi_usart_transmit_byte(*string++);  
        }
                wifi_usart_transmit_byte('\r');
    wifi_usart_transmit_byte('\n');
}

void USART2_IRQHandler(void)
{
    if(usart_interrupt_flag_get(ESP_USART,USART_INT_FLAG_RBNE) == SET)   // 接收缓冲区不为空
        {
                usart_flag_clear(ESP_USART,USART_FLAG_RBNE);
                wifi_usart_recv_buf[wifi_usart_recv_index++] = usart_data_receive(ESP_USART);      // 把收到的数据放在缓冲区中
        }
        
        if(usart_interrupt_flag_get(ESP_USART,USART_INT_FLAG_IDLE) == SET)   // 检测到帧中断
        {
                usart_data_receive(ESP_USART);                                     // 必须读,读出来的值不能要
                wifi_usart_recv_buf[wifi_usart_recv_index] = '\0';                                                           // 数据接收完毕,数组结束标志
                wifi_usart_complete_flag = 1;                                      // 接收完成
        }
}


//配置wifi为热点模式
void esp8266_server_init(void)
{        
//建立多连接模式
        wifi_usart_transmit_cmd("AT+CIPMUX=1","OK");

//开启wifi服务器并设置端口
        wifi_usart_transmit_cmd("AT+CIPSERVER=1,8080","OK");
}




















分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表