1、机智云协议代码下载; H/ v4 L9 {- M8 Y, s" i2 D' j, b
生成代码时选择其他平台生成,生成后代码并将其下载解压,如下:
0 m( ~0 H8 y: y5 I0 j1 l% ], S. P! O5 a% v
" [9 l. }& K4 c4 i0 p. P
2 T1 ^% s6 L& b# u5 R9 K在我们移植之前,必须知道需移植的MCU是否具备以下条件
6 Y+ s0 _: X3 J
/ g7 r3 K# B* B3 l①平台支持两个串口接口(至少一个,两个方便调试),一个负责与 wifi 模组间的数据收发,一个用于调试信息打印,WIFI通讯串口波特率必须是 9600。
7 K) ~7 |: G; o+ s/ C1 p4 y. F' t: O
6 F) Z \5 Q Z' A6 W②平台支持定时器(1ms 精确定时)为系统运行提供时基。
' `+ E6 Z: i K9 K
/ p {- w- r$ Z: H③平台支持至少 2K 的 RAM 空间(可调整环形缓冲接收区大小,来解决数据协议的处理异常问题)。
* E5 l, n2 N b0 p" i, s* i* x
2 ?' Y1 L+ i5 D3 \* k2、工程模板准备% {9 ?7 f% A% f! _4 ]8 i. P
因为要用到TIM、USART,所以我们直接使用原子的定时器工程进行移植,首先修改工程目录名字+ I& Z2 y3 y3 A0 V- |6 b
/ _! K2 z+ ~0 a$ K5 ]: r( |
6 l+ W8 _7 C1 n: V+ A7 f$ Z. \, q6 i( n' A+ U3 n
3、协议及外设移植, T: [+ _ C$ q. R" e
通过机智云生成的其他平台代码内的Gizwits、Utils文件夹复制到我们的工程目录
2 u% K$ q0 ]7 ~0 \; S
B! H7 E! M. w$ U G+ m
$ d' N/ y# ?& z/ \
! F+ m$ r; j j+ J移植到工程中
/ v! \8 m" U1 D6 K$ z" _
W; `& ~4 {* M2 ?7 p, v0 h6 e( N
3 M* o( r0 Q* t$ v7 }
3 S7 a q- v7 c4 G; P$ \, }在HARDWARE里面创建KEY和USART对应的文件夹,并将写好相关代码
' t( _( Y* h1 p5 I* N' S4 a; n6 ^3 `* H& h" F( \4 v/ j
/ S( c L$ w. g) Y0 j9 S" f+ T
; a% x1 z6 t2 O8 j. Q9 X& k' H
将串口、按键以及Gizwits的代码全部添加到工程中(对于怎么添加创建文件,指定头文件路径这些这里就不再赘述)
4 L+ F5 Y1 m; T1 w7 m7 u8 Z
P1 L+ B; u H8 b% ] L1 \$ n2 ~: z. O! h
i* M2 v) [& U; p1 _: A/ @
6 C3 T' L% e+ s5 [4、代码修改7 G7 I/ [) f1 N6 X% l
4.1、修改usart3.c文件
! q. J) q: y R, F' ^1 }4 }在usart3.c文件中编写串口3的初始化和中断服务函数,将中断接收的数据写入到gizPutData()函数,代码如下:" Y) ~/ L3 o& ]# |/ }* b
' `% M: y9 Y1 S0 y" k
) e8 V1 ~2 B+ d' C, ]5 D. ?, U1 z) }9 |, R
4.2、修改timer.c文件
& z& ` n6 N3 Z* D在定时器 3 中断服务函数中添加 gizTimerMs()函数,并且添加 gizwits_product.h 头文件,代码如下:
+ p/ K) ~* j# \0 {3 {: S; V
/ r3 B! N; L: @! E5 P: k J
( _" b0 O2 T- @+ j. X
/ T. Z/ g$ z+ V(注意:gizwits_product.h 文件中没有对 gizTimerMs()函数做声明,需自己添加,否则编译会出现警报)
2 d& g& G4 A, P' S6 D. B4 U& v5 O- b) z
$ d& M% Q$ Q3 U' h$ L% b, w( j+ j/ R
4.3、修改 gizwits_product.c 文件4 V4 @6 I- A+ \7 N3 W; r5 s7 Z( v# a
因为我们修改gizwits_product.c文件用到 LED和串口发送,所以要添加头文件 led.h 和usart3.h。
5 k! V/ A8 P4 Z+ r
% A/ M. L5 i% p9 e在uartWrite函数中添加串口3发送函数,而GIZWITS_LOG用到printf定义在工程SYSTEM分组下 usart.c 文件已经有添加了,我们不需要再添加,需要添加代码如下:
1 t! _) v" r. ~: O8 k/ e8 a5 G& q0 b M5 R" B, n5 n( ?
* P- q0 D( |- S8 ?4 i
. e: A, B/ v3 D* Z9 O2 W添加完串口发送函数后,回到 gizwitsEventProcess()用户处理事件函数中添加我们的用户事件逻辑,这里我们是控制 LED 的亮灭, 在 EVENT_LEDONOFF 事件中根据返回的开关量添加其 LED1的开关控制,代码如下
" c: a9 O+ P: \+ N9 {6 u/ h5 M, B3 c
! K2 c# u6 n- F6 ~6 b
8 j' O1 c M. h e2 }( T
在mcuRestart()函数中添加软复位函数,代码如下:: p' a$ H5 z [
3 \, D: v- ^7 l: U6 R
- d' E6 n+ `* T: `9 ]
3 |0 u6 n" @2 L2 a. u& J2 d3 T
4.4、修改usart.c文件
5 c) E, _0 K- ~" Z$ ]; u. @ l) M2 s; b e; U7 G
- p Z% L: f% t- ?9 h0 Q* U
3 J. `' h2 e2 m N l Y# k' S# n4.5、添加main.c代码
& r- ?7 v+ w8 e l P* }- #include "led.h"! q9 v9 [: V* }4 V2 ~
- #include "delay.h"
3 [( x }5 w# u- S - #include "key.h"
' u; J, J- T# L' Q - #include "sys.h"
. ?- i" r7 w% E8 O5 O @ - #include "usart.h"
/ @! I/ w3 o0 E - #include "timer.h"9 g9 x: y! f" j& \7 s) d( B
- #include "usart3.h"
4 G, W) h( X; E3 A2 D; r - #include "gizwits_product.h" 6 @8 ?! H, P/ w+ p
q! `; _: w2 K! P" u: h. M- //dataPoint_t currentDataPoint;. A5 G3 t X p; U6 S J8 z) h ]
- ) o' @$ [; A6 Z& o7 F E0 V
- void Gizwits_Init(void)* a, q0 w a! K: V
- {. n ]' i8 w9 [4 ~* A
- TIM3_Int_Init(10-1,8400-1); //1MS
6 R5 ~, J. f2 C$ l( O/ j& Q) H' ~ - usart3_init(9600);//WIFI
8 W D6 P- J7 T _' B - memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));0 h& [) T- s% C& S9 S' V) }" X
- gizwitsInit();//) k; c0 d# ^: r+ R m
- }$ o( L: b% J% \8 \- D& T7 Z/ x
: x3 o/ \9 d' p2 s4 ^7 e! Q- //void userHandle(void)
' Y8 ?! }" ]4 t7 J5 A/ c - //{% o7 N6 H6 ?1 z \2 M# g
- LED1+ P; L5 P; P a; J$ g7 A1 d
- if(LED1==0)
% @, t3 G& n) x" H8 b/ J4 E& S - currentDataPoint. valueLED_OnOff= 1;4 ]4 |# ^4 s( J9 G1 N
- else if(LED1==1)5 A1 g0 X1 L0 c t2 O" i
- currentDataPoint. valueLED_OnOff= 0;
# |1 r0 T" @3 E; ~; L1 f6 E' G - //}
5 g4 S; K2 {! s& |) `
/ L& D8 s0 V1 _; `. z7 x- int main(void)1 x3 _3 q+ }" ^' i& @# J
- {
6 j0 q# t3 k' ?4 ^) N - int key;
9 ~* Q* H) E `- y - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/ U2 x( y: Z4 r# K - delay_init(168); & A f o( d: P \% m
- uart_init(115200);
3 F1 [& D$ Z B2 Q; ^ - LED_Init();
; D$ w: H" u+ T/ S4 _ - KEY_Init();
: ^ c) y' Q) v2 w/ v( F - Gizwits_Init();
$ @4 u& K2 W5 b3 y8 a, j( w/ c( g - 8 g. |% g: R% l5 L8 Q( n
- while(1)2 Z( Z) M! J- y3 F% H" F6 J, u. o( C
- {
/ H+ v4 ^/ Z* V6 E - userHandle();//Óû§²É¼¯
C: g7 y; F4 M# X1 g; }7 { }: ]
2 X# R" u+ x* T. S, a5 M- gizwitsHandle((dataPoint_t *)¤tDataPoint);' ]$ C" ?* d7 ^* Z8 W
- key = KEY_Scan(0);6 |3 h, P; M! _. w: i$ @% T* e
- if(key==KEY1_PRES)//KEY1
, O y" H/ V5 c* I0 h - {
m2 s1 \- P6 T: d; I+ R/ H - printf("WIFI ½øÈë AirLink ģʽ\r\n"); [2 b5 m1 R: s, C' L# N
- gizwitsSetMode(WIFI_AIRLINK_MODE);//Air-link
+ s0 F- {- p Y8 Y - }& d0 a0 k( G9 v. d) F8 l
- if(key==WKUP_PRES)//KEY_UP 6 N! v! S: A( d) w
- {
- Y, v# r* X4 Z9 ~+ y: ^6 J - printf("WIFI¸´Î»,ÇëÖØÐÂÅäÖÃ\r\n");
, P4 t5 d) R' ?( V2 ~ - gizwitsSetMode(WIFI_RESET_MODE);//WIFI' J- {! |2 {2 }
- }, V6 O0 t- p. f9 O3 X! o
- delay_ms(200);
' P s9 b* _' Y8 N - LED0=!LED0;2 S& a7 Z# b$ F2 s$ a7 g+ V
- }
, u+ Z2 s' ]+ |- a. I! H$ R - }
复制代码 # e; O7 M* @; D$ q" K
5、编译及改错6 L- u# Q% g2 |$ r- I2 p
修改完成后编译下整个工程,应该会提示如下2个重复定义的错,保留其中一个,只需要去gizwits_product.c或者main.c删除或屏蔽掉即可:7 P) O y& e" w5 `
" K9 w7 E% `# A$ l
# \( {8 b. A1 X6 _& Z: f
( [2 ^5 N1 G2 G$ a+ K9 |解决办法:
5 s) q) G- B: r( t
' d3 {7 r+ v4 o4 r7 T3 \7 v删除或屏蔽gizwits_product.c里的userHandle. s d2 x: F% i0 f _/ H
* Z: m+ Y$ h: j' Y
3 G l# z8 L0 {* [& F- O# h+ {
9 ?$ u- B) E4 K9 ~
删除或屏蔽gizwits_product.c里的dataPoint_t currentDataPoint;& W( F! N5 n# F* z. t! q) P' @
, h4 \: G7 s0 L1 t% U. j- B" s( H
% ?; F4 L- L: T. y0 y0 x. K* e: K/ |" `0 j" d/ X7 C
6、功能测试/ V7 r' v$ E3 X% r, {$ u/ ^
6.1、ESP8266接线方法
( e! Q: _1 E1 T2 {# y将ESP8266对应的引脚接在开发板上的串口3上就可以了,接线方法如下图:4 h9 F" b) u9 x5 C# q, v
9 l* t0 M' Y. H) }" D! G
+ _+ e1 o/ B, N0 S
# F+ l& `: v2 A0 \& _7 N$ ?6.2、ESP8266配网
# u1 v l+ }* ?按下KEY1按键,ESP8266进入AieLink模式(具体怎么配网我下一篇博客会聚集讲解),配网成功后会反馈一下信息,如下图所示:$ I: u5 g6 ^* v* B+ T0 p
! ~3 k: y. V7 _" a( Q6 S
! S, \& v9 R6 w" f, i! d. J' k1 Y1 S9 J& [$ a
6.3、APP控制
' @' ?. `5 s% I3 r7 ?, @6 G成功后就可以通过Demo APP进行控制,控制灯和控制继电器原理都一样,都是高低电平导通!
- p. u3 T8 y* t1 l# N5 Y+ R0 w1 J; r: t+ W6 J' D/ W8 C6 H$ x+ i
5 g4 }! {$ J N" C9 a8 h7 Y2 S6 Q! E& }9 ~# i
5 X) s; Y8 C3 U# w: `, r
) l) P2 a. q# }; |
控制时串口助手上也会反馈相关数据,方便我们调试,如下图所示:
; w! [4 W1 v H3 s
8 E" Z8 h7 U `1 P
; C6 d9 j% `6 U: t% Q
4 ^3 p3 E! z- R E! @$ ~; k那么我们就算是大功告成,此时,手机端把WIFI关掉,就可以直接用数据流量进行控制。配网成功后,只要硬件端不断电,那么我们就能随时随地的用手机去进行远程控制,这就是物联网应用。
8 ]& ], U% Y; w7 w8 F. }/ {$ {3 G% L7 I M
; G( L- I3 y9 |8 y3 C' h6 H |