请选择 进入手机版 | 继续访问电脑版

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

【经验分享】基于STM32F407标准库移植机智云代码(控制LED灯)

[复制链接]
STMCU小助手 发布时间:2022-5-16 11:03
1、机智云协议代码下载" a2 g% v0 q- R% x# t0 s
生成代码时选择其他平台生成,生成后代码并将其下载解压,如下:
9 w; y# S+ t$ v/ I/ E1 ?; a" c* O! l/ I, g- k$ G
20191017100225646.png : X  j: |' u- `2 @3 k

; ^/ e9 J& k6 P) z( N在我们移植之前,必须知道需移植的MCU是否具备以下条件
8 `  k3 b% o: b3 }" o! H" T/ z. l) X$ H6 l  R7 b
①平台支持两个串口接口(至少一个,两个方便调试),一个负责与 wifi 模组间的数据收发,一个用于调试信息打印,WIFI通讯串口波特率必须是 9600。+ J) V' ~8 g; k5 p9 e, W

- r5 n# \$ x1 j& k. I②平台支持定时器(1ms 精确定时)为系统运行提供时基。8 F: }# k  i) g) q3 Q

, C3 q- f0 m! o/ z③平台支持至少 2K 的 RAM 空间(可调整环形缓冲接收区大小,来解决数据协议的处理异常问题)。1 R& c# C6 W  o9 B- a3 B
  J0 ~' G* ^( h& f- C
2、工程模板准备! w" f7 \! E% E- l* M; d
因为要用到TIM、USART,所以我们直接使用原子的定时器工程进行移植,首先修改工程目录名字
  X6 @, ^: P' M) w& r  p8 `( M0 T0 P/ B
HS9ZU))EK2%SL`I(4(]B]TY.png 2 |) r: h: t  b1 T% H
3 B4 s: T- _9 m# b
3、协议及外设移植
( D* F: G( o" ~+ I通过机智云生成的其他平台代码内的Gizwits、Utils文件夹复制到我们的工程目录5 h  H( w  w6 M- x. V2 O' o  ~
7 |4 t' A7 v4 Q7 a8 Y0 C4 K: @+ w
MF9W)H}MR6~@W}LBWIUYPLG.png
- ^: w" t0 A% P: z6 H
  `2 h5 ^" l; C+ v- G$ Z移植到工程中7 H5 C1 G* Z$ L4 B. f/ k
! ?3 x, z$ G; J: P/ z2 f& t
T14BLO%I@5)6}G}IKA0)GKC.png 1 n! F  k! M) d! t7 @( [
9 ~) O7 x( C+ g/ S
在HARDWARE里面创建KEY和USART对应的文件夹,并将写好相关代码
$ A/ ]/ Y2 U" o/ K! V
# _* m& ^+ {0 F 2019101710112525.png 3 o* O: v4 e* ?( a7 R

2 @3 R" x: u: d) F+ Z. ]将串口、按键以及Gizwits的代码全部添加到工程中(对于怎么添加创建文件,指定头文件路径这些这里就不再赘述)
1 _1 g. X8 e5 i# h9 N7 K$ h
  I: t% s/ x! q- a( K RRE8B8{8SELVGW[6G`6D)IX.png ) X& T' q8 @. }5 A; E$ _3 Z$ Y
" v  E& ?' U3 @1 I1 b' i
4、代码修改; P' s# S" _  {" M9 f, X- h% ~5 L/ d! V
4.1、修改usart3.c文件0 ?; N0 H7 r" r, U2 T9 `
在usart3.c文件中编写串口3的初始化和中断服务函数,将中断接收的数据写入到gizPutData()函数,代码如下:0 a( n$ z7 s1 U: @0 o
+ _+ }4 g- r2 h8 d  @* K( [/ W
6KB)OMEN8SU6{[2V`~S6~7R.png
( Z" V2 P+ R+ W# ?) I
2 k: x9 x: h) a3 q4.2、修改timer.c文件
' p. }; w$ t1 [+ ~$ f/ \* {在定时器 3 中断服务函数中添加 gizTimerMs()函数,并且添加 gizwits_product.h 头文件,代码如下:
+ c1 F  D; I; `+ b; U+ g6 H# N6 T  D& c4 y: D3 v
6Y)`QLDUD}0N83U7YL]2NVB.png
0 y! z% E$ |$ C2 z# ~0 F! }) I$ i9 y- m/ ]
(注意:gizwits_product.h 文件中没有对 gizTimerMs()函数做声明,需自己添加,否则编译会出现警报)
+ U+ {% n2 y3 k0 z. I$ V8 s2 {$ k5 d8 M4 O6 x/ D! z1 X" g1 L
FLAOG7{RGT64A9TX%RB4PCJ.png
  o% |: ~* w% ^0 h/ t+ i1 Y* z- A8 x$ S
4.3、修改 gizwits_product.c 文件

6 R& r( y4 L/ \; m因为我们修改gizwits_product.c文件用到 LED和串口发送,所以要添加头文件 led.h 和usart3.h。
3 e1 q2 H5 [$ C
2 H4 h# i- d1 I2 _+ y6 J+ A+ S- z在uartWrite函数中添加串口3发送函数,而GIZWITS_LOG用到printf定义在工程SYSTEM分组下 usart.c 文件已经有添加了,我们不需要再添加,需要添加代码如下:; c8 Z! L$ f, M" f
$ y$ R6 l9 [% M7 l. b. ~
FAT[1{LQN$%M8C6V[AGFF)K.png
; l) E& i1 R( w1 t1 ~) G% V7 @$ A& V1 u
添加完串口发送函数后,回到 gizwitsEventProcess()用户处理事件函数中添加我们的用户事件逻辑,这里我们是控制 LED 的亮灭, 在 EVENT_LEDONOFF 事件中根据返回的开关量添加其 LED1的开关控制,代码如下
: |# M) `+ X& L) u$ x6 t
- \7 K9 }* [( i6 y( B SCN1ZDX}I9K2Z5FJ$KD}R_C.png 5 `0 c/ Z  C# v* G; Z; a6 @" C

. |' x/ ?" ~" W  H在mcuRestart()函数中添加软复位函数,代码如下:
) _2 l; u) M0 {7 z
# M5 w1 F/ V( E# D: A- Z 20191017101652231.png ! R( w/ V+ E- w: c0 r% i* E

( V' I3 S  H+ L7 e3 I1 |4.4、修改usart.c文件" b4 I7 e) r, @8 s* n! g

" ~5 p! {" v3 i7 ?# _0 e, G 20191017101738986.png
' f* b4 s2 i4 _/ x) F' z1 R: F1 S6 F: [
, u: m  @) C, l4 L4.5、添加main.c代码
6 f; G0 D5 J2 x/ f7 {1 \3 L) j
  1. #include "led.h"
    - B' Z1 L4 ]0 L9 n6 }  A
  2. #include "delay.h"
    6 z" t% D) C1 n
  3. #include "key.h"4 k) F6 Z3 \5 s- O
  4. #include "sys.h"% [8 L7 @' k# q2 j
  5. #include "usart.h", m  G) u9 d6 u) E5 b3 z
  6. #include "timer.h"
    2 \1 T! x9 \0 U3 k! R
  7. #include "usart3.h"
    7 V5 P. h5 }+ V& ~$ F3 k
  8. #include "gizwits_product.h"   G) v. [" r6 \3 j- w
  9. ) M9 o% h% @" l6 C/ M( Z
  10. //dataPoint_t currentDataPoint;; Z. C( _- w4 i' U0 w9 J5 @

  11.   p- Z5 n/ I! ~  y
  12. void Gizwits_Init(void)( Q8 K  }% }& t* E6 G0 j( I
  13. {
    ; V9 V: d8 @7 P
  14.         TIM3_Int_Init(10-1,8400-1); //1MS" P, o% W* U4 U% b# e
  15.         usart3_init(9600);//WIFI
    0 Q1 `. N' I& B
  16.         memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));! ]% B! o: ~, l9 [( B4 J
  17.         gizwitsInit();//
    0 Y* r/ K9 r3 S. N% h0 R8 l! R
  18. }" g& C( f( M; X+ D- q

  19. 9 W0 [; P$ ~. y' D' W. \
  20. //void userHandle(void)/ Z1 j' O2 `  d# `* I. U3 C& F
  21. //{: M3 l  c# y) W$ }
  22. LED11 U8 g" _8 t# S3 U1 X
  23.         if(LED1==0)
    ! X( N) y9 p: o. N5 o; n: r
  24.                 currentDataPoint. valueLED_OnOff= 1;
    4 l4 h: S* d- N8 W5 F' i% A
  25.         else if(LED1==1)+ |! d' f1 Z7 ^" {0 G
  26.                 currentDataPoint. valueLED_OnOff= 0;/ w. _& P# s- h  `7 Y
  27. //}
    1 _- p6 i6 e3 T4 l- ~

  28. 2 S) `( K% p  ]& A
  29. int main(void)
    ) f! |4 J! w* q% u% _1 ?
  30. {1 d; A% U- f6 S* m
  31.         int key;3 R% R% g- G8 Y% x9 Y
  32.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    ) F  G  c- v0 |7 s- Q. q/ g3 @1 w
  33.         delay_init(168);
    # R3 o( \: J& K/ D; h! z( L
  34.         uart_init(115200); 9 y, \( j4 y* P* _6 \" C0 u8 z4 N5 `1 J
  35.         LED_Init();
    3 J( T) \1 H8 T- r( W
  36.         KEY_Init(); - H' _0 C# K! D
  37.         Gizwits_Init();" w5 Q. O+ O5 W1 @6 [( N& h
  38.         
    % W* ?1 q) g+ l3 b
  39.         while(1)7 I& o$ N. v; Y! I2 W/ O
  40.         {9 h# ?& n7 S- E& ?7 q
  41.                 userHandle();//Óû§²É¼¯
    7 F; F2 T2 ~$ V1 g
  42. 8 }: p" G8 H8 ^+ V" ]0 ]0 Z2 Y; t
  43.                 gizwitsHandle((dataPoint_t *)¤tDataPoint);  \5 P1 i6 Q, u9 g
  44.                 key = KEY_Scan(0);0 I" j4 v* `5 z! V  _+ ^; c
  45.                 if(key==KEY1_PRES)//KEY1 0 t0 _8 a  X1 ^. c# e
  46.                 {
    $ j: I+ U6 _7 p+ s; s6 \% Z1 d) X2 ^
  47.                         printf("WIFI  ½øÈë AirLink ģʽ\r\n");
    6 \0 _  _( ]+ K
  48.                         gizwitsSetMode(WIFI_AIRLINK_MODE);//Air-link
    ( F5 [: A6 ]9 P' y
  49.                 }
    + ?4 A/ q) k  Z& E: V3 c7 K( E' c
  50.                 if(key==WKUP_PRES)//KEY_UP + W, Z8 i% U. u  I1 s' t! s! ]
  51.                 {
    ( l! A0 u% i) B: H5 ]7 I- A
  52.                         printf("WIFI¸´Î»,ÇëÖØÐÂÅäÖÃ\r\n");
    ' n$ b! W) a0 t8 v/ v0 B
  53.                         gizwitsSetMode(WIFI_RESET_MODE);//WIFI  j9 R5 k; [4 F& N. D" m
  54.                 }
    % R8 N  P# j+ n$ x
  55.                 delay_ms(200);
    1 F$ M- {% C0 [6 o
  56.                 LED0=!LED0;! ?8 E6 ]$ i8 r
  57.         }
    " I: F/ f4 x& V/ D
  58. }
复制代码

0 h6 h% E6 C; w/ d6 f" n9 j5、编译及改错& H' k, \7 {( {: J
修改完成后编译下整个工程,应该会提示如下2个重复定义的错,保留其中一个,只需要去gizwits_product.c或者main.c删除或屏蔽掉即可:
* G4 W, G, |9 D# ]: ^( i6 K4 [1 y  u
20191017102731387.png ( e* l6 f4 ]! O- l$ Z2 n5 ~
9 a* ^$ P' P! B% ?
解决办法:
; i/ B, A6 ?# P4 M/ j: y5 u$ t# y5 l- a! x1 [, g) T5 a
删除或屏蔽gizwits_product.c里的userHandle
& o; h! J& ]/ Y/ p9 x6 y
& {, P+ @8 l' h8 Y _@T1(92FY784QXD@3)II25W.png , X# R: _, w) E) n% n
  ^9 G5 A2 j. g( C) j+ n/ `; A
删除或屏蔽gizwits_product.c里的dataPoint_t currentDataPoint;0 g! x3 ~0 e6 O' [1 X4 \
6 Y; v% _- x7 ^' o! h4 V! i# O
201910171028167.png
- c+ m- [+ e+ b* ^! v/ D) R% q
" X: l, A9 g) E" M2 M  @3 R6、功能测试' `7 X2 S1 {0 M* N
6.1、ESP8266接线方法0 e* `5 z3 }5 s( i- m" Q
将ESP8266对应的引脚接在开发板上的串口3上就可以了,接线方法如下图:
( o+ c( i5 g  N1 U  E2 ?3 o
% k9 A! U$ o7 ] @{8%KC7XX1QW_@WA6EJ)W5Q.png
( X  x+ I, Q5 i* Z- `4 _( k1 O/ Y( A
6.2、ESP8266配网1 w! q2 ]* ?, P  J
按下KEY1按键,ESP8266进入AieLink模式(具体怎么配网我下一篇博客会聚集讲解),配网成功后会反馈一下信息,如下图所示:
& I) C! _+ j5 \! V$ H8 X% |% u( X  s. z. U
G]`T)WKMOIVT4ARVXE%[O99.png 2 l; U9 B! K8 J/ B

9 e9 c: w5 J: Z3 H$ l5 R6.3、APP控制
" y# O1 K* s5 Z! {  Q
成功后就可以通过Demo APP进行控制,控制灯和控制继电器原理都一样,都是高低电平导通!% h: M$ ~$ o: V, z- Q% ~

( |5 {- x2 e8 _* { @97]19X@%VK6N6N71NRqE.png , D! ]2 s5 n& j" C# s( z
6 }  _1 J9 k& @: @: u1 U0 r
`17L(LHH4MC]8KBP9XX%3`C.png
, U- f+ z. g; e* y  U9 \0 M# X0 P$ Q9 c6 s' ^8 M/ E
控制时串口助手上也会反馈相关数据,方便我们调试,如下图所示:9 e6 {: x8 i. t' z7 p+ s

9 I, W. C9 e! O- D# V _F%C`GMP4U%YEY]UM9]Y5NF.png
; \0 S1 x' I1 w! z4 k! X/ m
! X* @% k* s2 S9 s2 K, S( y% V那么我们就算是大功告成,此时,手机端把WIFI关掉,就可以直接用数据流量进行控制。配网成功后,只要硬件端不断电,那么我们就能随时随地的用手机去进行远程控制,这就是物联网应用。
& [( p6 x$ t! k+ b- |) Z% k$ D7 l3 @* Q
0 E7 ^$ W9 M$ n3 E7 d! R$ f
收藏 评论0 发布时间:2022-5-16 11:03

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版