你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32F072 Nucleo的Wifi无线数据传输 精华  

[复制链接]
wenyangzeng 发布时间:2015-1-7 21:51
本帖最后由 wenyangzeng 于 2016-12-16 16:23 编辑 6 l. h! j  ^: @# K: c" p

4 y1 j9 e3 d7 _% h+ q9 m* L1 c
     1、简介
       随着互联网技术的飞速发展,Wifi无线数据传输技术也随之不断发展成熟。而采用意法半导体的STM32系列单片机应用在Wifi无线数据传输中,能发挥STM32单片机的优异性能、缩短开发周期、产生较好的经济效益。
2、主要功能
根据wifi信号传输的特点,由1台STM32单片机开发板工作在AP模式,作为服务器使用,其余STM32开发板工作在STA模式,做客户端使用。单片机之间的数据交换采用Wifi无线通讯来进行。可以应用在楼宇消防报警,也可以应用在无公害种植基地的温度、湿度的分散采集传输、集中监控等。优点是通讯无需敷设电缆,降低了项目投资成本,且作为数据采集的客户机,完全可以根据实际应用的要求将整个PCB板制作成mini结构,更方便现场安装。缺点是不适合较长距离通讯。
3、实施方案

! k4 K1 [) Z( x) H. E! U
(1)AP主机:
    用1块开发板配置服务器TCP SERVER,用多台开发板配置客户机 TCP CLIENT,原则上所有开发板硬件配置都相同,都可以选用STM32F072 Nucleo开发板或其他的STM系列机型,本方案中在作为服务器的开发板上还配置了320*240图形点阵的液晶模块,用来显示工作状态和传输信息内容。我在上一贴使用的STM32F072 Nucleo开发板实验用的320*240液晶屏未拆除,刚好利用成为临时终端显示使用。(图1)
5 }. x: R4 Q& S3 N$ G) @, I
服务器.jpg
                           图1  STM32F072 Nucleo开发板
# U) K0 q% Q& g
     (2)客户端机
      手头1块STM32F103C8-PKT用来配置成客户端使用,板上有一个电位器原设计连接STM32F103C8的ACD通道1,刚好用来采集数据。PA9和PA10经过跳线与232转换芯片连接,取下跳线刚好供ESP8266的URXD、UTXD连接。见图2。
       在实际应用设计中当然还应当添加按键、蜂鸣器报警等外设。

3 ~0 |. d& `- S% Z
客户机.jpg
                          图2 STM32F103C8-PKT开发板

. t% `$ g& B) k# _
     (3)无线Wifi模块:
    选用现成ESP8266模块,简单方便。  ESP8266的URXD、UTXD连接PA9、PA10,5V供电接U5V。
      (4)ESP8266的连接方法
      对ESP8266模块的操作控制使用串口通讯方式,连接方法见图3,ESP8266的URXD分别接STM32F072RB和STM32F103C8的PA9(TXD), UTXD分别接STM32F072RB和STM32F103C8的PA10(RXD),
  (5)供电:
      由于ESP8266工作电流较大,直接从开发板+3.3V引出无法正常工作,所以要分别用1只AMS1117从USB5V提供3.3V稳压来供电。
接线图.JPG
    图3 两片ESP8266接法相同
) R' l: S# A8 z& Q/ G/ _) {0 b+ y
    (6)对ESP8266的编程和通讯协议
          对ESP8266的 编程操作是使用发送AT指令来实现的,在KEIL5环境下的串口发送用printf()函数很方便。每次对ESP8266发送1条指令后ESP8266都要返回一段数据以供用户判断发送成功与否及命令执行情况如何。这里串口接收数据采用中断方式接收,减少数据接收的错误率。由于接收的数据不定长,采用数据指针累加、延时判断接收标志位等方法来确定一次通讯过程的结束。USART与ESP8266通讯协议为波特率9600,8位数据位,1位停止位,无奇偶校验。有的ESP8266通讯波特率是115200,只要修改一下即可。

% q6 n( I6 p2 P9 l7 [6 A
    STM32F072 Nucleo开发板配置成服务器端,工作模式为AP模式(模式2)。具体过程如下:
1、 重启模块:           发送 AT+RST
2、 设置工作模式:  发送 AT+CWMODE=2
3、 再次重启模块:     发送 AT+RST
4、 设置服务器参数:发送 AT+CWSAP="NUCLEO072","0123456789",11,0
5、 开启多连接:      发送 AT+CIPMUX=1
6、 开启服务器模式:发送 AT+CIPSERVER=1,8080
7、 返回模块地址:   发送 AT+CIFSR

& W1 v4 Q* h. I: x  R$ U& `+ J+ W
    在STM32F072 Nucleo开发板的液晶屏幕上我将上述指令返回信息显示在屏幕上,当第7条指令返回信息:“192.168.4.1   OK”则表示服务器端已经配置成功。
  F& f# E. w9 U' `# j4 d; q: r
   STM32F103C8-PKT开发板配置成客户端:STA(模式1)
1、 重启模块:           发送 AT+RST
2、 设置工作模式:   发送 AT+CWMODE=1
3、 再次重启模块:     发送  AT+RST
4、 连接网络:         发送  AT+CWSAP="NUCLEO072","0123456789"(这个参数就是服务器端设置的参数)
5、 开启多连接:      发送  AT+CIPMUX=1
6、 建立连接:         发送:AT+CIPSTART=0,"TCP","192.168.4.1",8080 (这个参数就是服务器端第6和第7条指令的参数)
   连接成功后,就可以从客户端发送数据到服务器了:AT+CIPSEND=0,10后随10个数据在TempSensor[]数组中。
这10个数据是客户端ADC转换结果换算成电压值并转换成ASCII码,因为定长10位,不足部分补上空格。此处ACD转换采用DMA传输,省却了涉及对ADC转换操作的过程。
    调试工作应该先调好服务器端,再调试客户端。由于每次代码修改都要重新启动AT指令,因此本例程的调试是一个痛苦漫长的等待过程,您就慢慢去体会吧!
   在随后视频中你可以看到接收端的Wifi板上的蓝色LED响应了发送端Wifi板上蓝色LED发送时的闪烁。

6 [: V+ c/ B0 L& x( J* d* ]0 m
: j2 [* w: C) r9 N8 \  g4 T
) @# u5 _6 @: N6 S- q8 i0 B

评分

参与人数 1 ST金币 +20 收起 理由
zero99 + 20

查看全部评分

收藏 1 评论49 发布时间:2015-1-7 21:51

举报

49个回答
wenyangzeng 最优答案 回答时间:2015-1-8 13:42:35
本帖最后由 wenyangzeng 于 2015-7-31 22:31 编辑 " k+ G% a! H! `$ X$ a
6 i. v. g0 l/ D$ d- r+ I
上个视频
+ M; g( |3 L0 {: g$ g一手操作一手摄像,图像摇晃,对不起。
: b4 ^9 J# z' T; H- @: O0 h6 W+ V0 l6 m
https://v.youku.com/v_show/id_XODY3MDkwODMy.html
2 W$ c+ w+ Z! [9 i+ p3 t- i3 C( _5 x) H5 I

0 g/ a7 o  ~7 [- p# y5 Q( N* M
wenyangzeng 回答时间:2015-1-7 21:51:32
本帖最后由 wenyangzeng 于 2015-1-19 11:54 编辑
6 q' ^0 B7 ^- E& g" ]
: j, y/ W0 L9 O0 @. t. u  因为我使用的液晶模块估计与大家使用的不兼容,代码就不全部放上,只放关键代码了。: W8 _! w. M7 f0 k) Z5 b
客户端:
# z2 z( N) G- f' W! L/ L#define ADC1_DR_Address    ((uint32_t)0x4001244C). V9 ^( n& |! ^9 z9 d$ k( N7 @
ADC_InitTypeDef ADC_InitStructure;# @+ F2 O& q" f% p( K
DMA_InitTypeDef DMA_InitStructure;
" z! N. }2 p% O: ]7 B& V__IO uint16_t ADCConvertedValue;
9 X1 T# O: \. B7 j  f__IO uint16_t Rx_count=0;6 }" T6 ?' t2 P# }! p
__IO uint8_t Uart_buf[100];
7 Q0 S* w! w7 J& b5 o4 I$ r+ F& }uint32_t tmp;8 [( S+ C: L* r0 U
char TempSensor[10];$ z' U% I; {$ E. ?, Y2 a  F
char const *ptr             ;
  V/ o3 f5 w' W: ~7 a5 nuint8_t Flag = 0x00;
: S$ t) i0 ^* u6 B4 h2 C7 R# k! zvoid echo(uint8_t Number);
+ O0 }4 f" w! R  Y' i. \0 nvoid RCC_Configuration(void);
0 x, Q+ W. w7 M6 Evoid GPIO_Configuration(void);$ V7 A: K' _2 L! ^4 @

. H1 e8 i$ D2 m0 Y3 u5 vvoid DMA_Configuration(void)
5 G, i" U8 h+ {6 q% F& K( P{    ) @+ v" q/ R; I. w
  DMA_DeInit(DMA1_Channel1);) O* X" [# L7 P- |: [: e
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
2 C) a9 j' }5 @/ `  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;
# M  j7 r! z: g$ E1 o# k9 e  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;# V; J6 y+ q; A6 i1 x2 o6 Y
  DMA_InitStructure.DMA_BufferSize = 1;
8 Q& s9 u" v3 g/ A( ]5 ~1 ?5 q: L% B  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;3 a" i* r# U- O+ o
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;" p5 g7 F( t% A
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
- W2 j/ [, H$ G  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
! T$ v; I, }* T# K+ W# j  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;+ d- S5 y5 B1 M, f9 b) @: z7 X
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;" P1 I/ i  Q! V1 H! \: f- }; A" J
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
! S3 `4 I/ w/ _- h8 q1 T5 [  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
: S% Z# I* _, Z8 K. A( `" `' G  DMA_Cmd(DMA1_Channel1, ENABLE);
, J) L& ^9 x# N# A; g% H}
9 Q: p2 A  }. m% X. k 6 O" {+ }9 P5 s
void ADC_Configuration(void)
# X2 E. R- b6 V+ a1 U% u: R{
; y" b- ]! B/ i$ Q: \3 k+ C( q  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;# A- E/ T4 y, P( D* _% h: b
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
8 Y+ y+ w8 _6 {& L- l- ~  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;4 D1 H9 R# @6 O  j! e/ O/ i
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
" a  o: \4 |% L8 k  {  t7 H  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
* J- ^( C: X+ J3 a- S9 }  ADC_InitStructure.ADC_NbrOfChannel = 1;" z5 K; r! d: S! q  H6 {- ]* {; l
  ADC_Init(ADC1, &ADC_InitStructure);
2 D' x! v7 p$ ?) Z6 O% {3 T' f  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);4 f9 a6 }# y, I
  ADC_TempSensorVrefintCmd(ENABLE);
3 Y3 A' A0 Z: @; R4 a5 D2 o  ADC_DMACmd(ADC1, ENABLE);
" L& N+ k8 K$ H/ E  ADC_Cmd(ADC1, ENABLE);5 F% G$ T5 I: [& Z
  ADC_ResetCalibration(ADC1);
3 R! J& |% r1 M! s  while(ADC_GetResetCalibrationStatus(ADC1));
8 [7 Y  R$ I: S3 ^2 I. Y  ADC_StartCalibration(ADC1);  u6 _& A# [! C/ n+ a
  while(ADC_GetCalibrationStatus(ADC1));& s% q0 U- u1 \' ^& g
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);4 s2 k1 U' j) m
}
# ?, a+ U+ p, q/ v+ zint main(void)
. u4 A* W0 t/ U0 R' r+ w{uint8_t i=0;
! g/ V0 @- g5 ]: U/ y" w  ADC_Config();& r: b4 Z: ]* {1 Y; U. z
   DMA_Config();8 Z5 e9 U; ~! K6 J* m: B2 L
Uart_Init();+ S0 J9 z* E* V9 R3 h) o$ ~
   Nvic_Init();5 i5 U1 y; F$ c0 p# V5 b9 M
       for(i=0;i<100;i++)Uart_buf='\0';6 s& ]: F) P5 C, c2 C) S8 H% [
       USART_ClearFlag(USART1, USART_FLAG_RXNE);5 l, v! U! T- J- t9 x6 S
        Rx_count=0;( X  Y8 r5 w  E% @6 U
        printf("AT+RST\r\n");           //重新启动
4 v+ W" m' z- G1 ]# {         echo(0);
/ D) n8 n0 A) }5 o7 k! Z       delay_ms(200);8 f! E0 C$ v  X# z
        printf("AT+CWMODE=1\r\n");     //模式1
+ }8 ^  A/ Q& m8 d0 e! u* ^) [2 q        echo(1);4 _+ @' h9 O* g/ i- u9 B
       delay_ms(200);
7 T# m) s# K" l0 o% r* g9 K        printf("AT+RST\r\n");           //重新启动8 a! W' W) N/ U9 s7 d3 k
        echo(0);
. F4 y" t0 P6 l9 t" U# s        delay_ms(500);
9 i9 w( O' D! ?- H' V         ptr = ( char const *)&(CWJAP);//AT+CWSAP="NUCLEO072","0123456789"
( g) ~0 N: `4 ~. Y# t# j3 Z/ R              printf(ptr);
. Y! z6 \  n7 H% ?# J9 w5 y         delay_ms(500);* ]) P8 g7 V- |* {# }
              echo(2);
. ?& [6 k; U( E# x2 R8 y8 u) D       printf("AT+CIPMUX=1\r\n");                                   //开启多连接" H9 n1 t7 O( n0 ]/ A6 y
       delay_ms(500);     
" J. W/ p) D# \1 j  h+ }: M' J8 e       echo(3);
- Z0 n: O  o- F! t5 D" o  g       delay_ms(200);
8 w$ R' E$ C! C( A! T- S; e       ptr = ( char const *)&(CIPSTART);* X4 z, H& ~# I1 ^9 j
       printf(ptr);. \! A0 W5 M" {/ Q0 ]/ r
       delay_ms(500);+ d# r; E3 A% r
       echo(4);
0 D3 s# o3 j- o8 O# a  q       TempSensor_BCD();1 {7 ]* }/ ^3 I! ]* ?  h# H7 R
        ptr=( char  *)&(TempSensor);         
- x! P+ y. ?! R4 `+ _; [0 Y5 N        printf("AT+CIPSEND=0,10\r\n");0 l' F# w, Y  ?# i2 a2 H
        printf(ptr);+ A2 X3 f9 M% L* o, o6 b5 h
         echo(5);
4 }& O* z: v$ V- d  while (1)7 t. `( `% t# E  h: R
       {. g+ v5 n1 z( t9 @& _6 j( I& W) {% @
    while((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET );
6 m* [5 _4 n  B6 ~    DMA_ClearFlag(DMA1_FLAG_TC1);/ i" D# r: o# D
     delay_ms(100);. A) P0 w+ z% r2 X) G
     TempSensor_BCD();. E6 ?( i* s0 H  K( U0 ^+ P* V
      ptr=( char  *)&(TempSensor);         
- @. n! X  e% N       printf("AT+CIPSEND=0,10\r\n");% C) @" y8 h/ S/ W2 C$ P$ V
       printf(ptr);% Y% O7 C9 w& n: Z9 m  Y% u
        echo(5);) N. s3 f/ e, m& P; Q
  }
3 \2 B' c1 E& V' ]4 Y0 [$ n$ [5 T}) b1 y0 r! C/ h! J
服务器端8 Y8 X- p" J. `( t# i0 l; P/ G
void Uart_Init(void)
" b+ M4 y6 y9 U7 U3 F{! ~& t( k1 |" w3 ^9 G& h- ?" ^
        GPIO_InitTypeDef  GPIO_InitStructure;" C/ g0 c3 X& ^5 E' H
        USART_InitTypeDef USART_InitStructure;
/ n( @3 l* @  p0 B                   8 B! C. x- |$ y5 k; N7 n0 z# p
        RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA   , ENABLE);   // 使能GPIOA端口) N% x& {1 s$ P+ m! E. p
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);             // 使能串口1时钟2 C- a, J& n7 S' J% I0 z$ r
          . o+ L4 ?" l" W% c+ {
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9, GPIO_AF_1);- H, F7 R8 k; y4 F! @: z
        GPIO_PinAFConfig(GPIOA ,GPIO_PinSource10, GPIO_AF_1);                          & n# z+ H2 c8 Y/ [7 ~1 h
% x) E: _4 l. V6 a
        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9 ;                 
) F  _/ G. x! Y- F, P        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;. `3 W+ X) y2 ~( t* o
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
6 u6 \, g  |% F: C6 h        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
. a! H; u+ {$ ^        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;7 p4 m4 t4 G+ j. N# Q* o! k) H6 m
        GPIO_Init(GPIOA, &GPIO_InitStructure);
, t0 k! k6 |2 S; B  H6 [: k( y: `
$ g6 [2 _7 O4 N# o# B' |2 B        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;4 Q0 s3 \! w# e3 D: r
             GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;! E+ U4 B/ F+ X
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;      / `, w8 Y- G% M
        GPIO_Init(GPIOA , &GPIO_InitStructure);* t4 E3 X* O; G  o# e9 B( `$ P' g
) `) X2 `2 G9 c' C2 `
        USART_InitStructure.USART_BaudRate = 9600;                                    4 ?* N% D0 B" m' E9 X- Z8 ~
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;              1 r5 f+ k+ A6 z1 S7 O* V& Z6 F! p
        USART_InitStructure.USART_StopBits = USART_StopBits_1;                        
, ]' w+ y; U6 L  y0 p$ h        USART_InitStructure.USART_Parity = USART_Parity_No;                           - ~% V- r2 X& d9 s
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;# U# U0 S, h; W: _  E
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;              
& ^' ?8 H$ ^/ W7 s* u( u        USART_Init(USART1, &USART_InitStructure);        //串口配置/ T( m# C" L4 {" [
      
7 \' c# T: ]1 k8 ^4 n) ~        USART_ITConfig(USART1, USART_IT_RXNE,ENABLE);//打开中断    " ~* l8 ^9 b& ?- H
        USART_Cmd(USART1, ENABLE);//使能串口1
' t+ [& s" @" V- ^1 J        USART_ClearFlag(USART1, USART_FLAG_TC);
) `. f: b; l( O, K( I      ) x8 `' s1 a( q
}
/ Y' V5 E' T3 v2 f! D4 Yvoid Uart_Put_Char(unsigned char c): _% Z- P( `5 @* R9 A2 I9 L# f9 e% q
{   - U/ ^0 @; a4 {  v: \1 `
  while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  
  D' X% P7 r4 O# e; C USART_SendData(USART1,c);  ; }4 d9 s1 r6 K9 I
}
$ k; l! Z1 c+ v( P ; @, ^  X/ Q/ a" c1 Q  A, i
unsigned char Uart_Get_Char(void)4 V; R8 L3 h( }* k3 m
{   - f# Q+ x) J6 c# @6 A+ V
     unsigned char temp;
$ o/ m+ ]1 a5 s! ~& i     while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
0 j& P9 ^+ W3 i% \     temp = (unsigned char)(USART_ReceiveData(USART1));% }2 H7 X8 l% w" O1 j
     return(temp);   
  B3 J& j& I) `6 Y}
9 c+ N8 b- X' J' c# vint fputc(int ch, FILE *f)
. e; a( n" W' u' x5 `$ J& Q6 @" E{
% Q8 ~" U" D/ A' Z& [  while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);, t1 L) `; [' T; v
  USART_SendData(USART1,(uint8_t)ch);
( ~9 l, u* `$ N- \+ b/ e  return (ch);
5 J7 H3 K! P: d7 n1 C: v}
* K2 l6 v) s; k. D9 @  Pvoid Nvic_Init(void)) D7 a. l; K: ^9 X- a' x) v' _5 M
{4 G$ z/ D; L  N& q9 E
  NVIC_InitTypeDef  NVIC_InitStructure;& M. `* ~) ]! d' X" W+ ]: z
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
4 C+ A# b7 F) A4 t$ G  NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;" F4 E. b6 y8 R$ Q8 X
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
5 J! h$ ~/ K% U( |  NVIC_Init(&NVIC_InitStructure);$ D- a! S, s  D, e5 d" u
}
4 C- Y/ R5 {9 N: T4 V
7 f3 Z  i6 f* ?! t) cGPIO_InitTypeDef GPIO_InitStructure;     ; l! `3 V& [2 S, ?' x* ]1 r
void GPIO_Configuration(void)! V3 K7 w3 N  l' x
{
5 P8 W& c0 z9 e" W) W
2 ]2 W4 K! T, {( P* \" F2 C) MRCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOC, ENABLE);
* r! l1 l/ L3 y; O       GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3
8 R0 r3 ]7 r& N7 C, o                          |GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
& U- @8 R" P" R      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;2 i) a* R" d  N2 j' V
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;+ v5 }8 k0 Z0 _* Z
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
. I: ?, D) z6 ~+ [4 h/ Q      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;9 W. z' c9 e& G9 Z8 Z
       GPIO_Init(GPIOC, &GPIO_InitStructure);) t1 p) ?* F4 O# K; ?2 f- }
       GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_5;
$ o) L- h! t. O  _/ e, E" m    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;$ V$ G1 I* e# e6 C+ K
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;, [6 G" H' _3 J% k0 @7 K
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
9 W* S" X& |  ]      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
3 P3 D( ?& E/ }) G; a) u2 J       GPIO_Init(GPIOA, &GPIO_InitStructure);( X* D( w9 r- |2 t% A
     GPIO_InitStructure.GPIO_Pin =        GPIO_Pin_3|GPIO_Pin_5;
* H' @6 Q  t( z1 g/ [    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;( \" d7 r# I' G! [; V3 [& W: \$ e5 \
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
" x4 v9 l. ?( M6 z; `      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;. s. E" a. ^4 n1 M: C
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;! p; f7 W9 N( Z/ s0 }
     GPIO_Init(GPIOB, &GPIO_InitStructure);
! }4 C# N7 u# R" Y) |" a       GPIOB->BSRR = GPIO_Pin_5;% A8 N# r) d* J3 l" `, z! a
}
$ M2 d+ N9 O' Sint main(void)
+ o6 Z) j& h6 y8 a7 f{ uint8_t i;      
* Q2 V/ I$ p, h. f  }  char const *ch;
$ I5 \  m9 L1 e" K0 t" J  SystemInit();8 Q% P' q6 s( ~) w5 c
  Nvic_Init();( T" e' K/ P5 y. m& A/ ]& h+ {4 m
  GPIO_Configuration(); ) C0 C2 Z$ J  N; J. f% }( g
  LED_Init();6 W, W! @$ @$ M8 l5 ^( v1 X/ r
  Uart_Init();
; y4 R% V. w4 C! O  E! Z1 w3 s  lcd_init();
9 c) I* h. n# V. D7 @( y  lcd_clr();* }0 r6 l3 Y$ ?- c% N, H
   Screen();
2 o0 Q4 l, x2 ~0 a  S5 [       for(i=0;i<100;i++)Uart_buf='\0';
7 n0 d7 F# ~6 [        USART_ClearFlag(USART1, USART_FLAG_RXNE);( l1 {+ Q7 ]7 h5 T
    Rx_count=0;1 T8 L# ^& L, R: D; I  f- J
    printf("AT+RST\r\n");           //重新启动
5 F( \2 P& P, N0 N1 U; T    echo(0);
( G) \* j3 b  v1 E; e5 C     printf("AT+CWMODE=2\r\n");     //AP模式
0 v  m5 [- q8 T0 ?8 F( P- U5 x+ b     echo(0);
* R, M0 R2 g( f. y5 a       ch = ( char const *)&(CWSAP);//AT+CWSAP="NUCLEO072","0123456789",11,0  ,通道号11
' h) Z2 L7 Z: T1 H# E       printf(ch);
2 M- u% p/ e' w       echo(0);
# r, l  c9 K( r# o$ D5 b, B       printf("AT+CIPMUX=1\r\n");                                   //开启多连接
) A$ O6 `* j7 x7 f: |3 J       echo(0);) i. g! a  A( U+ F0 {4 a& W& K
       printf("AT+CIPSERVER=1,8080\r\n"); //开启服务器模式+ P' T# t9 F8 e. P) ^
       echo(0);
# R0 n/ l3 f7 ^       printf("AT+CIFSR\r\n");        //返回模块地址, v5 j3 [, x0 z6 G/ }
       echo(0);
" e  i% |' H' q0 Y; v' i+ _% R. o  while(1); y6 t9 u# Q1 J& R
       {
- N' q/ `- l) ^2 K8 y) N              if(Flag==1)    & N/ o: c  L, W$ h* ]
            echo(1);2 @2 d5 [3 M/ [: M/ V" B4 |
  }. ^7 r) q* y2 D' u
}3 {$ o$ y' Q" ~: q. o) a9 ~

; \* Q: f, K; _( p& L4 R
9 R# x) p; b: {2 K( O  ?" A9 G
2 C2 O$ @% j( ?2 y) B+ M2 y$ }
wenyangzeng 回答时间:2015-1-21 13:51:20
wu1169668869 发表于 2015-1-21 12:09% @6 |  L- m! [3 A  f% H+ d% x% P
不知道那个串口wifi功耗怎样?4 h8 q1 t$ G6 e! S, Q0 s; _
而且速率那么低的情况可以考虑zigbee做,传输距离更远 ...
: C( R3 C; s3 s6 U' l$ W" s& O
耗电不小,发射时要几百毫安的。
沐紫 回答时间:2015-1-7 22:09:07
不错哦,谢谢楼主
sacq12 回答时间:2015-1-7 23:02:56
在楼主这里,新认识了Wifi模块ESP8266。学习~
damiaa 回答时间:2015-1-8 15:55:57
好。支持
万里-363223 回答时间:2015-1-9 11:00:52
sacq12 发表于 2015-1-7 23:02
# D$ V) d4 d* P& y5 Z- J在楼主这里,新认识了Wifi模块ESP8266。学习~
4 e! v- g( l4 E4 Z7 g/ O
我也觉得是,呵呵
沐紫 回答时间:2015-1-13 17:21:17
不错哦,加油
mlxy123xy 回答时间:2015-1-13 23:29:14
这个不错,,等额拿到新板子,和原来的discovery也来试试无线互联
slotg 回答时间:2015-1-14 01:18:11
不错的分享,我还不晓得有 ESP8266 这个模块可以用,长知识了。
党国特派员 回答时间:2015-1-14 09:21:28
222.png
沐紫 回答时间:2015-1-14 17:20:34
很不错的方案
党国特派员 回答时间:2015-1-19 09:24:36
33.png
wu1169668869 回答时间:2015-1-21 12:09:09
不知道那个串口wifi功耗怎样?
' ~, D3 o/ A/ T5 d# T" v3 m而且速率那么低的情况可以考虑zigbee做,传输距离更远
1234下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版