1. 程式人生 > >STM32F10xx(高容量)WiFi模組的初始化和使用

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

本次實驗是使用每次傳輸不超過200B的ESP8266晶片的WiFi模組,WiFi模組內部自有驅動,我們初始化它,只需要傳送指定的指令給他就可以了,指定的指令其實是使用USART3的複用的PB10和PB11進行通訊,

程式編寫和講解

  • 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