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

Alios Things开发套件之点灯

[复制链接]
netlhx 发布时间:2018-7-6 09:26
点个灯是为了上手,了解一些最基础的东西,比如程序框架,外设的一般操作方式。
3 M4 s1 W$ R1 E3 F! R* _9 I# \: d; l0 }
Alios即然是一个OS,程序框架必然和裸机操作不同,先看个简单的hello-world,代码如下2 {6 n; J' T. u) Y4 X5 w% w
  1. #include <aos/aos.h>) a: ?  d% t! X, i6 [2 v
  2.   B+ x7 l9 K' x; y9 a8 x4 R( l
  3. static void app_delayed_action(void *arg)) x# m. g$ y( }
  4. {2 a9 S; W+ f% r! T) V4 L
  5.     LOG("helloworld %s:%d %s\r\n", __func__, __LINE__, aos_task_name());2 A) I7 j  o- ?5 L6 O9 {
  6.     aos_post_delayed_action(5000, app_delayed_action, NULL);
    7 b  N6 v7 c; g
  7. }4 S7 [: j# D2 e. Z/ j) y

  8. 7 H" G; n# q) O$ G0 v
  9. int application_start(int argc, char *argv[])
    / l* `% G8 P: l0 C) x3 K
  10. {
    / U2 O0 B# A, [6 m; }2 T7 r3 a
  11.     LOG("application started.");
    9 s3 B; P- w) \+ @3 R) ~! t6 |1 B
  12.     aos_post_delayed_action(1000, app_delayed_action, NULL);
    & T( E% k1 E- D. k4 K
  13.     aos_loop_run();6 J6 {; j) z9 ?

  14. & I  j( l7 @2 q. j' n
  15.     return 0;! P2 {( J1 P9 A  E$ E1 J( P
  16. }
复制代码
头文件aos.h是alios动力的源头,先不管有多复杂,照抄就是了。# I0 g  a! `+ \! x$ a
application_start是程序的入口点,硬件上电初始化后,要跳到这里来执行。7 N" ^, _& G2 q, R- ~& ]

' H+ x  t) [- g  xaos_post_delayed_action(1000, app_delayed_action, NULL)的作用是延迟执行指定的代码,在1秒钟后执行app_delayed_action函数,这个用法有点和Android中的Handler.postDelay方法类似。
; X+ b, N3 H9 [, W' K
3 h/ {+ u5 l( d% K* Y0 T% Y; x然后在app_delay_action函数中,反复延迟调用自身,从而达到反复执行的目的。/ ?& X% j0 y, t3 N0 R/ @
, j: C' `3 P' F1 L" a' O! B; \6 ^
在入口函数中的aos_loop_run则是进入事件循环,该干啥就干啥。
8 j: R% m) T5 V) i' \, P0 m/ X- O7 X* f/ \& j  u( {  ~
点灯用到GPIO,alios要忽略硬件之间的差异,必然得提供一份统一的API及差异化的硬件配置,统一的API提供了GPIO的初始化、读写操作,而差异化的硬件配置则针对特定的硬件平台。
8 n( C/ K* x( c7 `( c4 y5 f5 C+ L* f2 k
这个差异化的配置文件位于board目录下,针对Alios Things Development Kit来说,该文件为$ e- p# S: Z1 R1 S2 F( d1 D4 E
  1. AliOS-Things\board\developerkit\hal\hal_gpio_stm32_l4.h
复制代码
中,部分代码摘录如下2 F  I7 X, |- a; ]' x; ?4 K  d

- Y2 [2 {6 I* `
  1. #include "stm32l4xx_hal.h"
    , q& X. q1 c5 o. x5 e, O
  2. #include <string.h>6 i4 f* F5 {7 S8 H
  3. #include <stdlib.h>
    ( E1 o5 _6 Y" [; M* f- t* I+ |
  4. #include <stdio.h>
    ( p% }& t$ r- V
  5. #include <stdbool.h>
    ' R: `# s) V" s$ k6 E$ C
  6. #include "aos/kernel.h"
    " v; J% w$ V2 \' P
  7. / Y, Y( g; l7 _* E& |. J( G
  8. #define PINS_IN_GROUP  16
    4 ~+ L( B& r8 B( O+ L2 _0 i& K
  9. #define GROUP_GPIOA    0
    & W! d+ A  c6 N7 K/ i/ P. s
  10. #define GROUP_GPIOB    1         8 c: |6 G# u2 m2 P2 j
  11. #define GROUP_GPIOC    2
    3 I9 d0 t- V/ L8 N6 e- x
  12. #define GROUP_GPIOD    3         + V) Z' ]7 p& I2 r7 _( L( U* [
  13. #define GROUP_GPIOE    4
    . G7 s/ [5 E' O; s* E. s6 E- x6 n
  14. #define GROUP_GPIOF    5: r  f$ j$ F5 W) p9 d2 }" ?: S" H* H
  15. #define GROUP_GPIOG    6- X2 [2 B1 ~& u; J( s4 i7 ]
  16. #define GROUP_GPIOH    7
    / D8 S4 X9 ?. a4 v* B2 O$ n
  17.          
    % {4 s8 |9 b' w
  18. #define HAL_GPIO_0                 ((uint8_t)0)        /* represent GPIOA pin 0 */  L3 e) Z3 a, Y, `
  19. #define HAL_GPIO_1                 ((uint8_t)1)        /* represent GPIOA pin 1 */2 u% H7 P" U) F( j8 z# y# u
  20. #define HAL_GPIO_2                 ((uint8_t)2)        /* represent GPIOA pin 2 */
    3 ^0 l9 e# Z+ Z6 {2 N
  21. #define HAL_GPIO_3                 ((uint8_t)3)        /* represent GPIOA pin 3 */
    0 a- E. B7 m* U2 G# h" c+ x
  22. #define HAL_GPIO_4                 ((uint8_t)4)        /* represent GPIOA pin 4 */
    * X% m, w  \4 F4 _! ?" c  j
  23. #define HAL_GPIO_5                 ((uint8_t)5)        /* represent GPIOA pin 5 */
    % ]: \9 C; m$ F
  24. #define HAL_GPIO_6                 ((uint8_t)6)        /* represent GPIOA pin 6 */
    ( R( l, c- I/ G/ l* S6 U
  25. #define HAL_GPIO_7                 ((uint8_t)7)        /* represent GPIOA pin 7 */' |0 t* H& i" f2 @6 C7 K' ^
  26. #define HAL_GPIO_8                 ((uint8_t)8)        /* represent GPIOA pin 8 */
    0 v1 m9 I0 H- b0 q5 m
  27. #define HAL_GPIO_9                 ((uint8_t)9)        /* represent GPIOA pin 9 */
    . L- M! }& u$ O- n4 F# Z# v
  28. #define HAL_GPIO_10                ((uint8_t)10)       /* represent GPIOA pin 10 */( G2 b! h( n& z. ~
  29. #define HAL_GPIO_11                ((uint8_t)11)       /* represent GPIOA pin 11 */% X# [6 @/ I+ R0 ^/ F, i
  30. #define HAL_GPIO_12                ((uint8_t)12)       /* represent GPIOA pin 12 */: u5 P* S! E" w0 m6 r* i& j; @
  31. #define HAL_GPIO_13                ((uint8_t)13)       /* represent GPIOA pin 13 */
    " L& [" H  O8 z8 u- a
  32. #define HAL_GPIO_14                ((uint8_t)14)       /* represent GPIOA pin 14 */5 U& J0 b1 Y2 D' J  ~  b
  33. #define HAL_GPIO_15                ((uint8_t)15)       /* represent GPIOA pin 15 */
    7 o& k' g8 s% n- G5 @
  34.          7 r1 A) e- `% X3 h# V
  35. #define HAL_GPIO_16                ((uint8_t)16)       /* represent GPIOB pin 0 */
    " O: ^0 `6 E4 y% B
  36. #define HAL_GPIO_17                ((uint8_t)17)       /* represent GPIOB pin 1 */& V' b- g4 Z* @2 D% M7 {
  37. #define HAL_GPIO_18                ((uint8_t)18)       /* represent GPIOB pin 2 */
    5 p  L/ |/ ^! {
  38. #define HAL_GPIO_19                ((uint8_t)19)       /* represent GPIOB pin 3 */
    8 {8 e2 H9 ^: h; G
  39. #define HAL_GPIO_20                ((uint8_t)20)       /* represent GPIOB pin 4 */
    + w# i0 }& h# E0 i2 _1 i
  40. #define HAL_GPIO_21                ((uint8_t)21)       /* represent GPIOB pin 5 */, K( S$ {  a. U8 y" w( }2 }0 z
  41. #define HAL_GPIO_22                ((uint8_t)22)       /* represent GPIOB pin 6 */0 s) ]2 M- e5 u  k! q
  42. #define HAL_GPIO_23                ((uint8_t)23)       /* represent GPIOB pin 7 */
    , j9 w' W5 m- n, g& ^: `$ `
  43. #define HAL_GPIO_24                ((uint8_t)24)       /* represent GPIOB pin 8 */0 C$ l& c. t2 D9 t6 |  b1 G8 K
  44. #define HAL_GPIO_25                ((uint8_t)25)       /* represent GPIOB pin 9 */
复制代码
这个倒是非常清楚,不过在官方的文档里却没有提到,需要用户自己去找,找了很久才找到!
; f! j6 D+ P* @! ]3 o3 o( ]
9 ^3 A/ t) t1 ~; X5 iGPIO通用的API列表如下7 Z0 C# |" I0 [  z5 A5 @3 l2 c
  1. 1 hal_gpio_init- f, {5 x; H% _1 |2 _6 f" w
  2. 2 hal_gpio_output_high
    * w) Z  @/ r0 C
  3. 3 hal_gpio_output_low/ F7 T1 v1 N  C* ]- ^5 i, I! s
  4. 4 hal_gpio_output_toggle
    3 A  ]+ ?; ~! `1 {
  5. 5 hal_gpio_input_get6 T) I- t0 J) l: V
  6. 6 hal_gpio_enable_irq! r. H! p) D9 U1 m3 f2 k9 V9 p
  7. 7 hal_gpio_disable_irq% C% P: @) V8 C4 w" v+ L4 h; k
  8. 8 hal_gpio_clear_irq
    / v3 Y0 ~/ r, D* v& y8 A+ ]6 s
  9. 9 hal_gpio_finalize
复制代码
有了这些基础,接下来就可以点灯了。$ }/ \# g, D* D7 ]+ s, T( x
: ~; n) ]( z. l4 q. w2 u
开发板上提供了LED1, LED2,LED3,对应的硬件连接如图. m4 J$ C% n5 i- `- C; I
/ X* B) B! v4 q7 s& q/ x2 Q- g8 L
2018-07-06_091207.png   }7 X0 p; m2 \  L. k0 O+ I

% f8 L" p- h+ ~6 M+ w2 r对应前面的GPIO映射得知在ALIOS中其编号为22,接下来修改代码如下# C6 R3 |( m# j5 p/ V
3 h% a  j' z" ~: U, ^8 x
  1. #include <aos/aos.h>
    ; S  b: d+ J9 q" D! T3 S  \
  2. #include <hal/soc/soc.h>
    . d% i4 x/ w$ K4 P( t3 _/ R  ~
  3. 0 |: h: h5 z, [2 ]
  4. #define LED1 22
    ' h7 x( _; b$ |* x
  5. gpio_dev_t led;
    7 z6 Q1 t9 l  Y, @

  6. ' D6 q7 H4 A2 B5 U  g

  7. # w: I3 \, g1 R2 w7 F
  8. static void app_delayed_action(void *arg)# Q2 ~  z( v0 B8 S" w
  9. {
    - I2 X# v1 ?4 |) u( q& x! ]1 w
  10.     //LOG("helloworld %s:%d %s\r\n", __func__, __LINE__, aos_task_name());. c  ]# L( D" N4 g+ M
  11.     hal_gpio_output_toggle(&led);
    , Z3 p6 M. P2 \
  12.     aos_post_delayed_action(500, app_delayed_action, NULL);  T7 Q; k) [7 i) i$ g+ Q
  13. }
    % Q- @0 g% T& q  s% P$ X/ u

  14. 4 d+ O+ W' f) U" \" R
  15. int application_start(int argc, char *argv[])
    1 {( D) k/ q6 i9 S  Y1 j3 s+ w, Y
  16. {! F, V" o9 f  k- t9 k/ e
  17.     LOG("application started.");+ _. U& h6 ?" u
  18.     /* gpio port config */
    * r2 }4 j/ |  D- L8 Y
  19.     led.port = LED1;
    9 }% p1 t% p* _5 Y# |# T
  20.     /* set as output mode */
    ( Y8 l) [. `" t3 s0 ^
  21.     led.config = OUTPUT_PUSH_PULL;
    ! S7 I- E* n, e2 r, J6 V+ e! \
  22.     /* configure GPIO with the given settings */
    % u% _" s. v% h! _8 Z% e
  23.     hal_gpio_init(&led);" r6 }" s$ l7 ^/ w/ m5 t

  24. % [$ s" X2 y+ @/ g8 L0 h& ^
  25.     aos_post_delayed_action(1000, app_delayed_action, NULL);
    & U: @" G8 L: }+ k4 `; k# n
  26.     aos_loop_run();5 f- R- r+ U7 Z: O  x$ ]

  27. % Y  f1 U0 ?8 p# u6 x
  28.     return 0;4 O3 D) P" X; l. E) Y
  29. }
    9 z6 D1 j% e3 b/ }+ I, r( K; k1 ~

  30. # n7 ?9 Z5 F, \7 V% Y
复制代码

4 n& R! T+ q3 U+ c* _1 [6 j9 }6 S* M
* j/ \. _. c+ h/ P# l- H( F非常简单的代码,然后编译,上传到开发板,LED1开始闪烁。
* C5 e- a  z3 ]8 s6 z/ Y7 U- V& C- s1 C9 j
关于开发环境,使用的是VSCode,使用之前记得先安装相关的组件,如下! {( S, {' Y5 d9 i& ?

5 n2 f  H# g4 T1 N 2018-07-06_092454.png
) M8 Q! P$ n! B* Q! b* y5 r  M( _& K! |+ t1 D- r0 P1 e
然后就可以在VSCode里打开Github上拉下来的代码文件夹,开始体验。( ?1 K9 ?" Y% L

. P* i( @4 l) F$ q
( ]2 C# M) ]/ V% T; Z/ |8 b/ `# ]+ R4 A2 o) `4 X

% `7 t5 C& _' p9 z1 U) A* q

评分

参与人数 4 ST金币 +12 收起 理由
damiaa + 5 赞一个!
toofree + 5 好高大上
斜阳__ + 1 赞一个!
creep + 1 赞一个!

查看全部评分

收藏 评论13 发布时间:2018-7-6 09:26

举报

13个回答
电子星辰 回答时间:2018-7-6 10:33:00
学习学习
mrtalentnan 回答时间:2018-7-6 10:47:18
感谢,学习了,回复ST
斜阳 回答时间:2018-7-6 12:16:24
alios的文档怎么样?
Paderboy 回答时间:2018-7-6 12:21:43
赞赞赞,N神点灯大法好。。
' e- t1 N2 X$ P3 U' n2 V9 p5 N
七哥 回答时间:2018-7-6 12:26:59
好高大上,VSCode是什么东西我都不知道
damiaa 回答时间:2018-7-6 14:23:57
好,我也玩去。
anobodykey 回答时间:2018-7-6 20:54:53
这个开发套件免费吗
奏奏奏 回答时间:2018-7-7 04:22:18
感觉一个点灯比mbed都要复杂
STM1024 回答时间:2018-7-7 09:18:39
alios用到了HAL?" c% Q! K2 L9 b4 ^# m
KEY1 回答时间:2018-7-11 18:24:02
有没有相关 教程 或者说明, Alios 的
爱电子辉辉 回答时间:2018-9-30 10:50:22
楼主可以出个详细的VSCode 开发STM32的教程吗?其中包含哪些插件,代码补全之类的,我现在遇到补全结构体的时候出来一大堆的东西。。之前用过ATOM.补全比VSCode好点
z258121131 回答时间:2018-9-30 11:27:28
哪里有这种套件?
我爱下载 回答时间:2018-9-30 13:23:16
非常好的介绍

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版