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

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

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

[复制链接]
STMCU小助手 发布时间:2022-5-16 11:03
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
20191017100225646.png
" [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( | HS9ZU))EK2%SL`I(4(]B]TY.png
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 MF9W)H}MR6~@W}LBWIUYPLG.png
$ 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 T14BLO%I@5)6}G}IKA0)GKC.png
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
2019101710112525.png / 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 RRE8B8{8SELVGW[6G`6D)IX.png
  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 6KB)OMEN8SU6{[2V`~S6~7R.png
) 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 6Y)`QLDUD}0N83U7YL]2NVB.png ( _" 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
FLAOG7{RGT64A9TX%RB4PCJ.png
$ 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( ?
FAT[1{LQN$%M8C6V[AGFF)K.png
* 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
SCN1ZDX}I9K2Z5FJ$KD}R_C.png ! 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 20191017101652231.png - 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
20191017101738986.png
- 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* }
  1. #include "led.h"! q9 v9 [: V* }4 V2 ~
  2. #include "delay.h"
    3 [( x  }5 w# u- S
  3. #include "key.h"
    ' u; J, J- T# L' Q
  4. #include "sys.h"
    . ?- i" r7 w% E8 O5 O  @
  5. #include "usart.h"
    / @! I/ w3 o0 E
  6. #include "timer.h"9 g9 x: y! f" j& \7 s) d( B
  7. #include "usart3.h"
    4 G, W) h( X; E3 A2 D; r
  8. #include "gizwits_product.h" 6 @8 ?! H, P/ w+ p

  9.   q! `; _: w2 K! P" u: h. M
  10. //dataPoint_t currentDataPoint;. A5 G3 t  X  p; U6 S  J8 z) h  ]
  11. ) o' @$ [; A6 Z& o7 F  E0 V
  12. void Gizwits_Init(void)* a, q0 w  a! K: V
  13. {. n  ]' i8 w9 [4 ~* A
  14.         TIM3_Int_Init(10-1,8400-1); //1MS
    6 R5 ~, J. f2 C$ l( O/ j& Q) H' ~
  15.         usart3_init(9600);//WIFI
    8 W  D6 P- J7 T  _' B
  16.         memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));0 h& [) T- s% C& S9 S' V) }" X
  17.         gizwitsInit();//) k; c0 d# ^: r+ R  m
  18. }$ o( L: b% J% \8 \- D& T7 Z/ x

  19. : x3 o/ \9 d' p2 s4 ^7 e! Q
  20. //void userHandle(void)
    ' Y8 ?! }" ]4 t7 J5 A/ c
  21. //{% o7 N6 H6 ?1 z  \2 M# g
  22. LED1+ P; L5 P; P  a; J$ g7 A1 d
  23.         if(LED1==0)
    % @, t3 G& n) x" H8 b/ J4 E& S
  24.                 currentDataPoint. valueLED_OnOff= 1;4 ]4 |# ^4 s( J9 G1 N
  25.         else if(LED1==1)5 A1 g0 X1 L0 c  t2 O" i
  26.                 currentDataPoint. valueLED_OnOff= 0;
    # |1 r0 T" @3 E; ~; L1 f6 E' G
  27. //}
    5 g4 S; K2 {! s& |) `

  28. / L& D8 s0 V1 _; `. z7 x
  29. int main(void)1 x3 _3 q+ }" ^' i& @# J
  30. {
    6 j0 q# t3 k' ?4 ^) N
  31.         int key;
    9 ~* Q* H) E  `- y
  32.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    / U2 x( y: Z4 r# K
  33.         delay_init(168); & A  f  o( d: P  \% m
  34.         uart_init(115200);
    3 F1 [& D$ Z  B2 Q; ^
  35.         LED_Init();
    ; D$ w: H" u+ T/ S4 _
  36.         KEY_Init();
    : ^  c) y' Q) v2 w/ v( F
  37.         Gizwits_Init();
    $ @4 u& K2 W5 b3 y8 a, j( w/ c( g
  38.         8 g. |% g: R% l5 L8 Q( n
  39.         while(1)2 Z( Z) M! J- y3 F% H" F6 J, u. o( C
  40.         {
    / H+ v4 ^/ Z* V6 E
  41.                 userHandle();//Óû§²É¼¯
      C: g7 y; F4 M# X1 g; }7 {  }: ]

  42. 2 X# R" u+ x* T. S, a5 M
  43.                 gizwitsHandle((dataPoint_t *)¤tDataPoint);' ]$ C" ?* d7 ^* Z8 W
  44.                 key = KEY_Scan(0);6 |3 h, P; M! _. w: i$ @% T* e
  45.                 if(key==KEY1_PRES)//KEY1
    , O  y" H/ V5 c* I0 h
  46.                 {
      m2 s1 \- P6 T: d; I+ R/ H
  47.                         printf("WIFI  ½øÈë AirLink ģʽ\r\n");  [2 b5 m1 R: s, C' L# N
  48.                         gizwitsSetMode(WIFI_AIRLINK_MODE);//Air-link
    + s0 F- {- p  Y8 Y
  49.                 }& d0 a0 k( G9 v. d) F8 l
  50.                 if(key==WKUP_PRES)//KEY_UP 6 N! v! S: A( d) w
  51.                 {
    - Y, v# r* X4 Z9 ~+ y: ^6 J
  52.                         printf("WIFI¸´Î»,ÇëÖØÐÂÅäÖÃ\r\n");
    , P4 t5 d) R' ?( V2 ~
  53.                         gizwitsSetMode(WIFI_RESET_MODE);//WIFI' J- {! |2 {2 }
  54.                 }, V6 O0 t- p. f9 O3 X! o
  55.                 delay_ms(200);
    ' P  s9 b* _' Y8 N
  56.                 LED0=!LED0;2 S& a7 Z# b$ F2 s$ a7 g+ V
  57.         }
    , u+ Z2 s' ]+ |- a. I! H$ R
  58. }
复制代码
# 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 20191017102731387.png # \( {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 _@T1(92FY784QXD@3)II25W.png 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 201910171028167.png
% ?; 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
@{8%KC7XX1QW_@WA6EJ)W5Q.png + _+ 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 G]`T)WKMOIVT4ARVXE%[O99.png
! 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
@97]19X@%VK6N6N71NRqE.png
5 g4 }! {$ J  N" C9 a8 h7 Y2 S6 Q! E& }9 ~# i
`17L(LHH4MC]8KBP9XX%3`C.png 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 _F%C`GMP4U%YEY]UM9]Y5NF.png ; 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
收藏 评论0 发布时间:2022-5-16 11:03

举报

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