STM32F10xx(高容量)WiFi模块的初始化和使用

本次实验是使用每次传输不超过200B的ESP8266芯片的WiFi模块,WiFi模块内部自有驱动,我们初始化它,只需要发送指定的指令给他就可以了,指定的指令其实是使用USART3的复用的PB10和PB11进行通信,

  • 首先看原理图管脚连接
  • 下载文档,阅读大概的WiFi指令有哪些,并且返回什么

    ESP8266_用户手册_V0.3.pdf

  • 下载APP,用于测试连接是否成功

    测试.apk

程序编写和讲解

  • 1.明确我要实现app连接并控制LED,同时串口通信要及时输出信息到电脑上,
  • 2.明确我们需要初始化那些外设时钟,LED使用PB0,1,5管脚,串口USART1复用管脚PA9,10,WiFi模块串口USART3复用管脚PB10,PB11,WiFi模块片选CH和复位管脚PA0,PA1,。WiFi模块CH-PD和RST使用管脚PG13和PG14
  • 3.主函数:

  • 4.时钟配置代码,SYSTICK不是由NVIC来控制的

void RCC_Configuration()
{
    //打开系统时钟
    SystemInit();
    //打开usart1时钟,而串口1使用GPIOA9和GPIOA10复用的, 和LED
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    
    //打开控制WiFi使能与复位的GPIOG和AFIO复用的GPIOB和LED灯
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    //打开控制beep的时钟GPIOC--pc0
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
    //打开控制WiFiCH-PD和RST的GPIOG
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE);
    //WiFi使用usart3
       RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
}
  • 5.使用系统时钟滴答systick实现精准延时
void SysTick_Init()
{
     if(SysTick_Config(SystemCoreClock /1000000))
     {
        //capture error
         while(1);
     } 
     
     //关闭计数器
     //SysTick_CounterCmd(SysTick_Counter_Disable);固件库3.5没有改功能,需要自己操做寄存器
     SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}
  • 6.初始化串口PA9,10
void USARTx_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    //configure usart1 tx (PA9) 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    //configure usart1 rx (PA10)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    //configure gpio_mode of rx  need to configure mode_in floating
    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    //usart1 mode config
    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_InitStructure.USART_Parity = 0x0000;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_Init(USART1,&USART_InitStructure);
    
    //enable usart1
    USART_Cmd(USART1,ENABLE);
}
  • 7.GPIO_Config初始化,WiFi模块的片选CH引脚使能,和复位重启(RST)引脚
void GPIO_Config( void )
{       
        /*定义一个GPIO_InitTypeDef类型的结构体*/
        GPIO_InitTypeDef GPIO_InitStructure;

    
        /*开启GPIOA的外设时钟*/
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); 
    
        /* 配置WiFi模块的片选(CH)引脚    复位重启(RST)引脚*/
        /*选择要控制的GPIOA0(CH)引脚和GPIOA1(RST)引脚*/                                                               
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;  
        /*设置引脚模式为通用推挽输出*/
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
        GPIO_Init( GPIOA, &GPIO_InitStructure );     
    
        /* 拉低WiFi模块的片选引脚    */
        GPIO_ResetBits( GPIOA, GPIO_Pin_0 );        
        
        /* 拉高WiFi模块的复位重启引脚  */
        GPIO_SetBits( GPIOA, GPIO_Pin_1 );
        
}
    1. 控制LED管脚的初始化,这里就不写了
  • 9.WiFi的初始化(只提重点)
    • 9.1 WiFi的CH-PD和RST管脚(PG13,14)初始化
    • 9.2 ESP8266(WiFi)串口初始化ESP8266_USART_Config -- Tx(GPIO_Mode_AF_PP),Rx(GPIO_Mode_IN_FLOATING)
    • 9.3 ESP8266_USART_Config中需要进行使能串口接收中断和串口总线空闲中断,两者是一起的,不懂的,点击:https://blog.csdn.net/qq_29413829/article/details/63262321
    • 9.4 既然设置的了usart3 的接收中断和空闲中断,就需要配置NVIC中断,从而使能IQR某中断通道,每个中断,不管哪个外设软中断还是外部中断,都对应有对应的中断通道,外部中断还多一个EXIT需要配置呢。https://blog.csdn.net/chaoshui7758/article/details/50504319
    • 9.5 配置任何的NVIC对应的通道中断,都需要设定好优先组,其实就是设定好抢占级与优先级位数
    • 9.6 前期初始化
    • 9.7

猜你喜欢

转载自www.cnblogs.com/guguobao/p/10147130.html
今日推荐