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

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

[复制链接]
wenyangzeng 发布时间:2015-1-7 21:51
本帖最后由 wenyangzeng 于 2016-12-16 16:23 编辑
1 z$ R) ?2 U  g) E, k+ ?+ I% Z3 |. }( d( Q9 n' w) K. F# H
     1、简介
       随着互联网技术的飞速发展,Wifi无线数据传输技术也随之不断发展成熟。而采用意法半导体的STM32系列单片机应用在Wifi无线数据传输中,能发挥STM32单片机的优异性能、缩短开发周期、产生较好的经济效益。
2、主要功能
根据wifi信号传输的特点,由1台STM32单片机开发板工作在AP模式,作为服务器使用,其余STM32开发板工作在STA模式,做客户端使用。单片机之间的数据交换采用Wifi无线通讯来进行。可以应用在楼宇消防报警,也可以应用在无公害种植基地的温度、湿度的分散采集传输、集中监控等。优点是通讯无需敷设电缆,降低了项目投资成本,且作为数据采集的客户机,完全可以根据实际应用的要求将整个PCB板制作成mini结构,更方便现场安装。缺点是不适合较长距离通讯。
3、实施方案

, C. P! D8 v3 O& n
(1)AP主机:
    用1块开发板配置服务器TCP SERVER,用多台开发板配置客户机 TCP CLIENT,原则上所有开发板硬件配置都相同,都可以选用STM32F072 Nucleo开发板或其他的STM系列机型,本方案中在作为服务器的开发板上还配置了320*240图形点阵的液晶模块,用来显示工作状态和传输信息内容。我在上一贴使用的STM32F072 Nucleo开发板实验用的320*240液晶屏未拆除,刚好利用成为临时终端显示使用。(图1)

3 C; l' o& w7 p" D
服务器.jpg
                           图1  STM32F072 Nucleo开发板
* ~* k& ]3 x6 R6 s4 q: `+ _# l
     (2)客户端机
      手头1块STM32F103C8-PKT用来配置成客户端使用,板上有一个电位器原设计连接STM32F103C8的ACD通道1,刚好用来采集数据。PA9和PA10经过跳线与232转换芯片连接,取下跳线刚好供ESP8266的URXD、UTXD连接。见图2。
       在实际应用设计中当然还应当添加按键、蜂鸣器报警等外设。
$ l6 p+ W* }/ ^. ]/ B
客户机.jpg
                          图2 STM32F103C8-PKT开发板
7 c- N, |$ W$ g
     (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接法相同

( U* t; B; ?# d0 e- |- G2 ^
    (6)对ESP8266的编程和通讯协议
          对ESP8266的 编程操作是使用发送AT指令来实现的,在KEIL5环境下的串口发送用printf()函数很方便。每次对ESP8266发送1条指令后ESP8266都要返回一段数据以供用户判断发送成功与否及命令执行情况如何。这里串口接收数据采用中断方式接收,减少数据接收的错误率。由于接收的数据不定长,采用数据指针累加、延时判断接收标志位等方法来确定一次通讯过程的结束。USART与ESP8266通讯协议为波特率9600,8位数据位,1位停止位,无奇偶校验。有的ESP8266通讯波特率是115200,只要修改一下即可。

3 x: U7 O+ r& q
    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
; N4 B2 t# l) K% ~* \5 T7 Z
    在STM32F072 Nucleo开发板的液晶屏幕上我将上述指令返回信息显示在屏幕上,当第7条指令返回信息:“192.168.4.1   OK”则表示服务器端已经配置成功。

" O$ O8 X/ v; l: I' L0 r! Z6 k2 O6 J
   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发送时的闪烁。
! Q7 s8 [* X- w3 S2 ?( O% ]0 h

- m/ C8 S# [$ j0 h# E
* c" h# C$ C& _( j

评分

参与人数 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 编辑 . j3 {, u% k; j9 U; r
. d/ T! g/ m  h
上个视频/ g- c) a4 V( |1 ]$ ~  L
一手操作一手摄像,图像摇晃,对不起。: Q, l  o: x, Q$ Q) S
9 \6 e! n$ s$ H* N! X
https://v.youku.com/v_show/id_XODY3MDkwODMy.html* r. ~* t7 I) M: u

* [: ?& w8 j3 W
8 |  q4 J0 Z+ h5 [4 Y1 ^
wenyangzeng 回答时间:2015-1-7 21:51:32
本帖最后由 wenyangzeng 于 2015-1-19 11:54 编辑
. x9 ~3 W$ f0 G& }. U- t9 U9 g& q7 ?
  N& n( N! M1 c2 @  因为我使用的液晶模块估计与大家使用的不兼容,代码就不全部放上,只放关键代码了。
+ U# Z- M# A, y7 Z* n客户端:
* E$ J; {- V# e#define ADC1_DR_Address    ((uint32_t)0x4001244C)
2 R- ~5 p  G2 Q8 ?ADC_InitTypeDef ADC_InitStructure;* f0 T7 R, x/ E' p( z- J- c
DMA_InitTypeDef DMA_InitStructure;/ [8 F, I( V. q0 z" C
__IO uint16_t ADCConvertedValue;6 z( L2 n( M3 N- L" r
__IO uint16_t Rx_count=0;
3 T5 j) J! q  y" w# {1 e" s__IO uint8_t Uart_buf[100];8 W6 ]$ v/ r7 D; Z$ ?- Q. L
uint32_t tmp;  p- B* o+ ~- v5 H; C1 V2 ]
char TempSensor[10];
: v' m. J: Z- t' gchar const *ptr             ;3 c& |9 s8 d/ G  `& d- ~: C( a% n
uint8_t Flag = 0x00;
* I4 @+ C# z6 u  L! yvoid echo(uint8_t Number);% F, A% K( B- x" O& q" x% j
void RCC_Configuration(void);( F  C# m; M% ~5 V9 f0 h- W
void GPIO_Configuration(void);' g/ N2 G. t& C0 Z( @/ l# i
/ |' v$ m3 }; ~4 [
void DMA_Configuration(void)
/ R8 L4 ?  h! z0 V9 e{   
. c8 ~  a8 u, D2 Q  DMA_DeInit(DMA1_Channel1);- A  \% g1 m) R' n
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;% n. W1 S* F! q
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;
( o5 x7 z. w2 A7 n' A0 q! s  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
. d& G3 J% r# f, L4 o9 e6 H  DMA_InitStructure.DMA_BufferSize = 1;
, @- j! P) |# j7 R4 J7 E  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;/ a3 ^8 W' T, }# E3 G, i
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
9 ^) v- ^8 C3 R5 Z0 z8 [9 Z  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;0 o) O1 A' i# ^, c
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;+ w8 S- Y4 I4 ]
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
# ^* h  O' P* v( Z" ]  DMA_InitStructure.DMA_Priority = DMA_Priority_High;' S! ]" x" `. v) M. x* ^
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
5 g0 D# V4 U2 }  DMA_Init(DMA1_Channel1, &DMA_InitStructure);' V& [& F7 F* H# d2 S
  DMA_Cmd(DMA1_Channel1, ENABLE);- G% L0 j8 {5 T3 W
}& s9 ]& |3 @' `- |6 G

* Y1 ]! ]" O2 {4 ~% Z1 N9 `void ADC_Configuration(void)7 f+ g+ Z# M2 C* ], F0 x
{
6 B( w! `1 x" J( Z  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
4 Y3 M9 X5 M3 x+ e  k8 K$ [, X  ADC_InitStructure.ADC_ScanConvMode = ENABLE;9 h* W0 m/ ~+ `6 b; c7 u
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;* C5 ?. W1 }* T0 ~1 s3 l
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;- u5 Y7 e8 U, ~- b
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;1 O% {$ \- y0 Q! }  E- C2 U
  ADC_InitStructure.ADC_NbrOfChannel = 1;
: t/ n% k; [5 }' [  ADC_Init(ADC1, &ADC_InitStructure);
: ^/ `3 ~# ]. q" L+ S6 _  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);
( W1 o+ x* V# q% F6 d( p0 u3 I  ADC_TempSensorVrefintCmd(ENABLE);
  r- ]/ }0 u9 ?4 l3 e$ V  ADC_DMACmd(ADC1, ENABLE);1 M! A2 a- K4 M- [. H; L
  ADC_Cmd(ADC1, ENABLE);
0 a( ^- `* r+ E5 c* I- @  ADC_ResetCalibration(ADC1);
! w8 f. p9 [* a5 w3 l7 c2 S  while(ADC_GetResetCalibrationStatus(ADC1));
: b7 t8 w- \) {; N  ADC_StartCalibration(ADC1);
: K% L- V/ p& j( D  while(ADC_GetCalibrationStatus(ADC1));# T0 b- L- C( `8 f0 `- B$ t
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);
6 _% w" d/ }2 T}; K, ~; P7 ^3 q: b( c
int main(void)
9 q0 P( O3 X0 d{uint8_t i=0;
+ |5 x" B, I) e0 \5 p, @  ADC_Config();
# ~3 k4 v/ J6 {) n( D! T   DMA_Config();
. r8 s% r3 N/ C5 G6 L( L( o& uUart_Init();
, U1 v' P# N' Z   Nvic_Init();! L4 S8 a7 B; x
       for(i=0;i<100;i++)Uart_buf='\0';$ S1 r, ?) `; ^" ?8 j- Y
       USART_ClearFlag(USART1, USART_FLAG_RXNE);# C# W$ |5 m: v: z' Y$ ?6 J
        Rx_count=0;  @9 F( B4 T1 I# F
        printf("AT+RST\r\n");           //重新启动# E% I" D1 A+ j# f3 l. q  J
         echo(0);
2 g  d- X. Y  z4 l- I: E( D9 ~       delay_ms(200);) @; G8 Y5 n) i) O& ?+ k
        printf("AT+CWMODE=1\r\n");     //模式12 r/ D4 S5 ?& r
        echo(1);
/ m7 C0 d6 X4 Q5 j! t8 c* }2 w' u       delay_ms(200);
2 K: {! `3 f0 L        printf("AT+RST\r\n");           //重新启动
% w) R* z+ o& r/ ?! H3 @" Q        echo(0);! i& p/ o% Q1 b# p; W( ?
        delay_ms(500);
/ f: v# |4 [+ n         ptr = ( char const *)&(CWJAP);//AT+CWSAP="NUCLEO072","0123456789"
" Z/ ~' \  c: a' B. c; h  f9 @              printf(ptr);* @1 a. m+ R5 a" F' c+ ]# R
         delay_ms(500);
# Z3 J) Y, O. p  T) F              echo(2);
, x# n+ D! y3 V7 ~( j2 G       printf("AT+CIPMUX=1\r\n");                                   //开启多连接; Z$ D. s8 j& _3 g
       delay_ms(500);     6 E# l) `# z; I# P, f
       echo(3);
$ W1 o* \; C# o1 i7 u6 I9 R+ L       delay_ms(200);
) s) R8 A! }; F, B1 ~       ptr = ( char const *)&(CIPSTART);2 a( o7 J- \5 Z" S  Q
       printf(ptr);; x% P. ]# r' A& P- k
       delay_ms(500);- ~9 c* Z! z2 N* Y& s$ z9 e# X5 f
       echo(4);
$ e  u* G' h( v" }       TempSensor_BCD();
8 T5 d( E* d4 D0 h( }        ptr=( char  *)&(TempSensor);         
0 o4 y. l2 N2 d3 N' e6 F- q        printf("AT+CIPSEND=0,10\r\n");
1 Y/ O% A+ v9 ?# a3 k        printf(ptr);3 X' b* `) @2 B0 T) L
         echo(5);
/ y" N2 k# \; ?# ~7 d  while (1)0 d( c/ A! m: I/ p, ~6 m
       {+ T$ |% U' I" c) R* ~
    while((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET );
( I9 M( M1 x. W" d    DMA_ClearFlag(DMA1_FLAG_TC1);
: s% m8 E1 f/ Q, ^. Z6 M     delay_ms(100);
( v" i! S9 l6 M7 Z     TempSensor_BCD();
/ O, p/ t) v0 M8 f! `% s- h+ D3 k      ptr=( char  *)&(TempSensor);         
: P+ A8 M, l0 g. |/ F       printf("AT+CIPSEND=0,10\r\n");
, T! X5 V9 I  W1 i       printf(ptr);, B& z) q! t" J& _' `5 ~. X& W
        echo(5);
. N5 _& c" t. w3 ?, |4 _  }
9 J4 s4 A5 o9 e2 p1 f}
/ I- _, p8 Y+ v. q服务器端0 W. |3 i* {  c
void Uart_Init(void)
* E( E8 {" h' l' r8 G7 I, v2 D{
/ u; s3 Y) v+ D2 T        GPIO_InitTypeDef  GPIO_InitStructure;- j1 ?$ Q) U* R, J  n
        USART_InitTypeDef USART_InitStructure;
# z( q( \2 I% d# V' V/ o& w                  
9 S1 c: ^  C' W7 b' k  I3 q        RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA   , ENABLE);   // 使能GPIOA端口; {& }: s+ W' \( @6 B$ u. S
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);             // 使能串口1时钟
1 a* C4 c, c* k9 }  U' D          . C0 t( _5 Y- [
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9, GPIO_AF_1);3 n9 Y5 [, ?* h9 F! V
        GPIO_PinAFConfig(GPIOA ,GPIO_PinSource10, GPIO_AF_1);                          
4 O4 V4 }( _' i/ v, S. Q3 }0 a/ u9 {
( L1 l" b& {+ n2 ]% F  F+ \9 K        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9 ;                 3 `+ q( ]0 ]" @/ h
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;- Q0 Q8 @' e4 b3 E% v9 _
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;* c5 S$ n, B8 s( N6 g7 R. g) U; l( o
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;) U% B6 N9 b/ n$ L2 b
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;" E" o. D- R9 p8 ?& S5 P
        GPIO_Init(GPIOA, &GPIO_InitStructure);. f( ~( m2 O6 B' Z+ c" W4 `9 b
6 d8 ^+ ^* M5 X6 ^; f5 ]
        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;) ]4 U6 g3 m( y1 c2 I% T, F
             GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
6 b4 [6 w8 d" `7 h% d        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;      - Z1 Z8 |; }8 F9 B
        GPIO_Init(GPIOA , &GPIO_InitStructure);
3 Q% o7 x3 N8 Q8 e ; y1 }$ }/ s( x( }& G! F
        USART_InitStructure.USART_BaudRate = 9600;                                    
* z0 s9 e% g+ b% C1 b+ k        USART_InitStructure.USART_WordLength = USART_WordLength_8b;              
4 R* ^2 ~" |& Q; ^6 \% A( Q* a        USART_InitStructure.USART_StopBits = USART_StopBits_1;                        
9 S$ }; I. h* [" a4 ]$ L. }        USART_InitStructure.USART_Parity = USART_Parity_No;                           
, @7 g% `2 }- c+ _        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
+ U% ~  Y( W1 ?$ ~3 n        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;              6 w& n/ A. O  C' [
        USART_Init(USART1, &USART_InitStructure);        //串口配置
# l; _2 `$ }& j9 I/ m5 o- L      
4 r3 Q( _0 V  h8 q3 P" H; T7 E9 B        USART_ITConfig(USART1, USART_IT_RXNE,ENABLE);//打开中断   
( ^4 C, i* O, {9 z* b        USART_Cmd(USART1, ENABLE);//使能串口1
7 M1 O. y  O/ S. T; F0 ^        USART_ClearFlag(USART1, USART_FLAG_TC);
# ^! Y: E% u  G" o' a' @% Z1 N/ D      + G( w  N9 L; P, {
}# ]8 S+ Q: F! J! @$ ]+ |$ ^' b
void Uart_Put_Char(unsigned char c)5 D6 g" y5 v- @1 z% w
{   
2 [; n* L8 ]) e3 N" d& b  while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  
+ k8 J4 D) E2 D/ N; u: M USART_SendData(USART1,c);  - V$ y: i4 F' j2 }, D0 `) @
}( i$ z" P' o8 \! p& Z& m! ]8 p# u" Q) h
2 G* X$ L; A& H% K$ r+ O& U
unsigned char Uart_Get_Char(void)
1 B# P! C3 `5 _. l6 x' I  a8 E. h) X: ]{   / B! [  v. X8 Z. x. _7 M( J9 D
     unsigned char temp;% S3 S' H% ^  O, N: b
     while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
# L3 U$ l0 ]8 M5 M6 S6 X     temp = (unsigned char)(USART_ReceiveData(USART1));: D: _2 |: u/ Z0 H  R
     return(temp);   
2 Q% i3 \( M* V0 `. ?& y1 {}
% q3 U& }9 q4 i+ G; m/ `- }int fputc(int ch, FILE *f)3 y6 A1 Z* D/ y& ^5 g7 M  W8 c
{
# d* p- U9 ~- {5 _% C6 H) ]0 Y  while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);! Z+ ^8 G% W3 k# u, f: V) d
  USART_SendData(USART1,(uint8_t)ch);
4 p9 O/ i& h! q2 u/ L/ X+ j& U  return (ch);4 @# `! t2 q: v! [
}
4 A; h7 S; \) s3 p2 s5 B8 Wvoid Nvic_Init(void)- h" j8 |! C: \7 j: Z
{
$ e+ r8 w0 A8 n: W$ T* {4 c  NVIC_InitTypeDef  NVIC_InitStructure;- R' {9 H  Z+ ~; B- ]
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
- j' H" r+ o+ F) F  NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;
6 W* A+ u7 H& g& V$ w" z+ ?  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
5 C( o, q3 I- o2 O$ }  z  NVIC_Init(&NVIC_InitStructure);* M. @+ ?+ q+ O$ B6 V$ U9 B
}( X. o9 t" d  {+ M

" C7 Y& E0 N( m) p5 EGPIO_InitTypeDef GPIO_InitStructure;     % [, I3 z6 a9 l4 c
void GPIO_Configuration(void)% R* |% D: w, C& a: s
{
2 A% Q( b8 o2 D7 N3 K
; W( |" _& v' lRCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOC, ENABLE);
( p# t. Q; p& i# R. g2 s* f       GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3
/ J) h" c- |  C5 a; i                          |GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
8 q' F3 k! ^( ?: G% e0 j      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;5 Z( k4 C8 N# ?3 ?
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;& }  ~% z& ?& M9 Z1 k' h
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
; z. O! g' q7 |, |) u- ?5 x      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  R# G, o7 h$ E- B& ^
       GPIO_Init(GPIOC, &GPIO_InitStructure);
/ q) J7 k5 J( `! e; P       GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_5;
0 p. D5 ]8 Z3 \2 A    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
( B& y& B5 P% j  t7 h& W& V  R      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
( P/ o" e  E) \5 G" q! I7 g      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;6 _0 Z  r& D6 @' }' e2 m9 ~
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
/ S# i2 ?! u% }& F$ @! ?% ^& v1 u, c       GPIO_Init(GPIOA, &GPIO_InitStructure);+ D1 {- i; `5 M# O/ F  X  ?3 A
     GPIO_InitStructure.GPIO_Pin =        GPIO_Pin_3|GPIO_Pin_5;! O; g4 N) @: k& A
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
+ V& i  @+ b( b9 |# ]" U      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
! I& Z' h0 [8 I6 ?1 Z1 b4 }+ i      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;9 |9 ~- M; N" {6 K, Y
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
/ |/ e4 |  u9 ~     GPIO_Init(GPIOB, &GPIO_InitStructure);
# O6 r  c# {9 @- C0 ]+ a       GPIOB->BSRR = GPIO_Pin_5;2 _) e/ S  W* c& C( H2 Y
}+ Y) q, H$ a; n& S) Z6 _1 Z; j
int main(void)
1 E2 i+ L% H: ~{ uint8_t i;       ! {( X  G, u' K
  char const *ch;0 G4 [8 j7 N2 f4 \! u5 U
  SystemInit();
* C  |4 _+ a$ N; C, H/ u. Q  Nvic_Init();
  t, v+ F  V% t* o% m; O) K  GPIO_Configuration();
# f7 T& V  b) q  n* Z% w1 s  LED_Init();) [0 A6 K/ H( Y6 S
  Uart_Init();1 [2 y2 C/ ]; p" I! j' b* C$ g
  lcd_init();  o$ v7 u# v& H, X
  lcd_clr();1 Y. L" A* I/ V
   Screen();& K& u( ]9 z* o) N+ Z& q
       for(i=0;i<100;i++)Uart_buf='\0';& n7 Q" L' x$ Q2 j; L
        USART_ClearFlag(USART1, USART_FLAG_RXNE);8 O. A$ T3 H1 J8 ?5 B
    Rx_count=0;
! K) v. l" R8 V+ w    printf("AT+RST\r\n");           //重新启动. V+ ?: k5 K8 V+ n8 O
    echo(0);1 v# y( j  a9 s+ i
     printf("AT+CWMODE=2\r\n");     //AP模式% k: v8 Q; @) I& I! K1 j
     echo(0);' s6 c% U- t5 W" g6 z- L
       ch = ( char const *)&(CWSAP);//AT+CWSAP="NUCLEO072","0123456789",11,0  ,通道号11
% q9 A. o: Q* f: @       printf(ch);. k3 ^6 t: C1 Q7 K( h' J
       echo(0);
0 }# m: H6 e9 `! w       printf("AT+CIPMUX=1\r\n");                                   //开启多连接
; d& Y$ J0 ^! |( X8 v2 U% P       echo(0);& {$ f: F' c  q, a
       printf("AT+CIPSERVER=1,8080\r\n"); //开启服务器模式
% p# T- f7 x+ l( V8 p       echo(0);% {0 S1 Q% c4 L( z2 r3 e
       printf("AT+CIFSR\r\n");        //返回模块地址
& W8 @4 o" w; ?3 v7 Q( q7 I* ^       echo(0);
' j) x6 ]& y$ V) K: j  while(1)" i( x6 m0 {- V  i; G
       {
. l8 r) |& R$ p3 t              if(Flag==1)   
# e( J/ o' h, O5 \6 N            echo(1);
; d  ~! d# H( L2 b5 o  }' Z0 B9 s; A0 ]' ~4 H
}
* G; ~8 c  C4 @( K* ^
4 B! T+ M/ N6 k3 @; z- _& ]8 b

4 g! c* Y4 G) p( X2 G6 k9 |7 q1 L& r2 I& t7 L: `' a, x
wenyangzeng 回答时间:2015-1-21 13:51:20
wu1169668869 发表于 2015-1-21 12:09
0 o  A/ P( }) i不知道那个串口wifi功耗怎样?
1 r0 ~) R6 V/ b( e而且速率那么低的情况可以考虑zigbee做,传输距离更远 ...
/ }$ o& v4 X" t" F0 x% _& b
耗电不小,发射时要几百毫安的。
沐紫 回答时间: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
3 g9 |/ Q# G+ _: {0 J) L在楼主这里,新认识了Wifi模块ESP8266。学习~
$ x/ q& C# f4 Z" i
我也觉得是,呵呵
沐紫 回答时间: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功耗怎样?3 D. F; }& [4 u1 |6 Z
而且速率那么低的情况可以考虑zigbee做,传输距离更远
1234下一页

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版