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

Alios Things开发套件之点灯

[复制链接]
netlhx 发布时间:2018-7-6 09:26
点个灯是为了上手,了解一些最基础的东西,比如程序框架,外设的一般操作方式。# e- S. @. i' U+ N- \) C  Y) F

1 }, y4 t0 i; PAlios即然是一个OS,程序框架必然和裸机操作不同,先看个简单的hello-world,代码如下
. r+ a$ c& Z7 R/ T1 V
  1. #include <aos/aos.h>
    * T" e7 i$ m% ~* Q8 y5 r+ F  x
  2. # b8 y/ x& W/ e
  3. static void app_delayed_action(void *arg)6 |' @9 d9 L% Q& l* T3 r
  4. {
    . S1 e' V) w8 F
  5.     LOG("helloworld %s:%d %s\r\n", __func__, __LINE__, aos_task_name());
    * e) Z. E. q: B
  6.     aos_post_delayed_action(5000, app_delayed_action, NULL);
    , ~7 o8 t4 B/ T" G: q' K% [; W: M* }4 I
  7. }
    ! d0 p$ C' E" b7 d9 a2 w

  8. * r# g+ |! L& _) s% ^  u
  9. int application_start(int argc, char *argv[])
    ! a. b" Q' X4 Y2 R  {
  10. {
    * I6 w" L6 `/ @8 z- L1 [( T
  11.     LOG("application started.");  ^" G: W2 X- ]! D: G% A
  12.     aos_post_delayed_action(1000, app_delayed_action, NULL);
    ! x, a7 \+ w; x2 d4 {$ W1 h' e+ F9 c
  13.     aos_loop_run();
    3 U/ j+ i3 z! d
  14. 1 F+ N" ~/ o( A- c& |4 G3 W! b7 D8 w
  15.     return 0;
    5 \, O2 D; i- P2 U$ j# w! ^  @
  16. }
复制代码
头文件aos.h是alios动力的源头,先不管有多复杂,照抄就是了。
8 Q# v7 M% U. r7 o* _1 q: b  rapplication_start是程序的入口点,硬件上电初始化后,要跳到这里来执行。
( n' O2 F, C* P2 h# F5 v, `& K7 I" ^0 i
aos_post_delayed_action(1000, app_delayed_action, NULL)的作用是延迟执行指定的代码,在1秒钟后执行app_delayed_action函数,这个用法有点和Android中的Handler.postDelay方法类似。
) N0 L, M8 f) G7 Q' {
4 a) J2 h* a3 s. V2 Y' Y然后在app_delay_action函数中,反复延迟调用自身,从而达到反复执行的目的。
  D0 }' |1 |0 U" w$ ^
: c: g, n( _! O: y在入口函数中的aos_loop_run则是进入事件循环,该干啥就干啥。
; H' E) i5 A2 @+ P. v8 q, L: c. z) Z
, k5 m3 m9 z. w0 _8 t; |/ J点灯用到GPIO,alios要忽略硬件之间的差异,必然得提供一份统一的API及差异化的硬件配置,统一的API提供了GPIO的初始化、读写操作,而差异化的硬件配置则针对特定的硬件平台。5 C) q& _2 @4 N6 C" a) B: ^

9 j) L& J3 L1 G这个差异化的配置文件位于board目录下,针对Alios Things Development Kit来说,该文件为: u. k3 K, n) \3 O
  1. AliOS-Things\board\developerkit\hal\hal_gpio_stm32_l4.h
复制代码
中,部分代码摘录如下' v1 X$ M7 O  v) f7 I' d: O- F& K

: B# u- v  ~% @1 S; G4 r
  1. #include "stm32l4xx_hal.h"
    - h5 n7 I1 u" G# }7 {
  2. #include <string.h>
    ! U) L& N1 G! d; ^+ l3 u
  3. #include <stdlib.h>; q9 z7 n7 {+ s5 ?
  4. #include <stdio.h>0 L1 O5 P/ |4 s. i
  5. #include <stdbool.h>
    + q0 ?) T- _* p4 y
  6. #include "aos/kernel.h"7 w+ t; a  C1 d3 R9 y$ p! s
  7. 2 h/ H; J! @7 A* B; |1 j" Y
  8. #define PINS_IN_GROUP  16
      }$ M/ U5 v- o( P1 G/ r
  9. #define GROUP_GPIOA    0
    7 T8 J5 x# D7 ]% Y2 D3 Y4 f
  10. #define GROUP_GPIOB    1         9 t/ I6 r: I7 w/ f& Q( C* d2 t
  11. #define GROUP_GPIOC    2
    ! w3 b% I& r- K/ }, v
  12. #define GROUP_GPIOD    3         
    9 s3 r7 H& c6 |6 O+ Z5 x* S
  13. #define GROUP_GPIOE    4
    * A+ V% }1 r* T5 N
  14. #define GROUP_GPIOF    5
    8 k* F6 N" C! O7 P% z' S# [2 ]) Y
  15. #define GROUP_GPIOG    6
    ! s3 {! t( O+ ~; W$ \3 N
  16. #define GROUP_GPIOH    7
    - z% R) T& u7 f9 g- m
  17.          
    4 t9 \% f. U8 o4 U' ~; P0 q# B' Z( ~
  18. #define HAL_GPIO_0                 ((uint8_t)0)        /* represent GPIOA pin 0 */
    % B# }8 C0 z  }0 c* I6 K) }* b* G
  19. #define HAL_GPIO_1                 ((uint8_t)1)        /* represent GPIOA pin 1 */! b+ u9 {" X  T& H8 w2 @& u
  20. #define HAL_GPIO_2                 ((uint8_t)2)        /* represent GPIOA pin 2 */: m5 j0 ~. o' y2 a& R
  21. #define HAL_GPIO_3                 ((uint8_t)3)        /* represent GPIOA pin 3 */3 H/ n+ H3 c& N% @
  22. #define HAL_GPIO_4                 ((uint8_t)4)        /* represent GPIOA pin 4 */
    1 o6 e! S- R5 e5 x5 H
  23. #define HAL_GPIO_5                 ((uint8_t)5)        /* represent GPIOA pin 5 */$ d/ ?8 ?" A5 O( F) N
  24. #define HAL_GPIO_6                 ((uint8_t)6)        /* represent GPIOA pin 6 */, @0 M  v# U, k
  25. #define HAL_GPIO_7                 ((uint8_t)7)        /* represent GPIOA pin 7 */
    9 j5 c" {- ^* M0 }9 e' c/ Q, ]
  26. #define HAL_GPIO_8                 ((uint8_t)8)        /* represent GPIOA pin 8 */
    / l, I( o" }, t/ T+ t5 w, |
  27. #define HAL_GPIO_9                 ((uint8_t)9)        /* represent GPIOA pin 9 */
    ! K; r& u& c* ], L
  28. #define HAL_GPIO_10                ((uint8_t)10)       /* represent GPIOA pin 10 */1 C; f; L/ {" k' r
  29. #define HAL_GPIO_11                ((uint8_t)11)       /* represent GPIOA pin 11 */
    3 [6 `& \5 h' k+ M8 e
  30. #define HAL_GPIO_12                ((uint8_t)12)       /* represent GPIOA pin 12 */
    , T0 O0 L# r' ^8 N: @8 r1 m$ t4 H
  31. #define HAL_GPIO_13                ((uint8_t)13)       /* represent GPIOA pin 13 */" X% z5 x6 v. f, K: W/ [) B. ]. D
  32. #define HAL_GPIO_14                ((uint8_t)14)       /* represent GPIOA pin 14 */3 C* E. A; w3 j- E& ]" O. l
  33. #define HAL_GPIO_15                ((uint8_t)15)       /* represent GPIOA pin 15 */" a/ U! b3 D: T9 Y8 y) ~) T
  34.          
    $ E0 e6 d; w4 G' D% g+ m, W
  35. #define HAL_GPIO_16                ((uint8_t)16)       /* represent GPIOB pin 0 */0 E7 D# t- q$ D3 a: a% Z
  36. #define HAL_GPIO_17                ((uint8_t)17)       /* represent GPIOB pin 1 */
    , B8 C  g+ J* t3 _
  37. #define HAL_GPIO_18                ((uint8_t)18)       /* represent GPIOB pin 2 */7 z; U* Y4 p, d- g/ Y) b' O
  38. #define HAL_GPIO_19                ((uint8_t)19)       /* represent GPIOB pin 3 */! a1 w9 J6 w3 b. H& X
  39. #define HAL_GPIO_20                ((uint8_t)20)       /* represent GPIOB pin 4 */0 D3 l: X* C8 d1 g' {# y
  40. #define HAL_GPIO_21                ((uint8_t)21)       /* represent GPIOB pin 5 */
    $ O. V; y; b4 |; X" S
  41. #define HAL_GPIO_22                ((uint8_t)22)       /* represent GPIOB pin 6 */: {  L: f8 w4 ^8 ~
  42. #define HAL_GPIO_23                ((uint8_t)23)       /* represent GPIOB pin 7 */
    0 c( U- T9 G5 ?- S& E
  43. #define HAL_GPIO_24                ((uint8_t)24)       /* represent GPIOB pin 8 */( s1 T' ?" I3 B
  44. #define HAL_GPIO_25                ((uint8_t)25)       /* represent GPIOB pin 9 */
复制代码
这个倒是非常清楚,不过在官方的文档里却没有提到,需要用户自己去找,找了很久才找到!
% i2 h1 E. J4 h
6 E: @; j+ d/ c9 ]3 K6 ]GPIO通用的API列表如下2 _3 u" h  R; R( W
  1. 1 hal_gpio_init4 r4 W$ v+ v7 s$ P9 N- h
  2. 2 hal_gpio_output_high
    , t, |0 Y- V7 u5 z# r# _
  3. 3 hal_gpio_output_low* }7 f3 o3 C6 F( \/ p& ]# c
  4. 4 hal_gpio_output_toggle
    ! Y$ x) o7 V1 L7 r& Y
  5. 5 hal_gpio_input_get4 D9 Q' K1 I3 q! @- J; t2 Q' ^
  6. 6 hal_gpio_enable_irq
    1 c6 o- t. l2 A/ ^1 }
  7. 7 hal_gpio_disable_irq
    # m; k: D1 z9 Z1 n9 w
  8. 8 hal_gpio_clear_irq6 T- {, v4 J! k
  9. 9 hal_gpio_finalize
复制代码
有了这些基础,接下来就可以点灯了。
5 u0 y7 I# C9 j, t, C) [9 {
: [, I. {% b% T1 [开发板上提供了LED1, LED2,LED3,对应的硬件连接如图0 O) w: }1 V, i6 D

! t) s- b3 a" {$ B4 K 2018-07-06_091207.png 0 [6 k. l# d0 X: \- K. q, J
) n" [: K& I! K0 x. u: b) X
对应前面的GPIO映射得知在ALIOS中其编号为22,接下来修改代码如下
) p# X9 K! J" U9 z: H, w
3 e. R' ?3 V# K
  1. #include <aos/aos.h>6 n/ E% E% C: k5 u  L
  2. #include <hal/soc/soc.h>- Q6 E, m4 |; Z; O

  3. " }( L4 P' @. a* P, ^
  4. #define LED1 22
    - U- v2 ]  H+ k4 m
  5. gpio_dev_t led;
    , [0 S: l) }' y7 W7 J

  6. 7 K: ^+ k" ^" V  j( h1 R* r

  7. , a$ X6 I" D, {7 _$ K
  8. static void app_delayed_action(void *arg). D8 m% u+ ]9 q/ Y: _2 \' c
  9. {
    ; w: f! L8 T3 ^6 Y( i
  10.     //LOG("helloworld %s:%d %s\r\n", __func__, __LINE__, aos_task_name());9 s$ R$ F9 Y8 y, C/ l
  11.     hal_gpio_output_toggle(&led);
    1 }" D" T  p  D4 W4 a5 [. y
  12.     aos_post_delayed_action(500, app_delayed_action, NULL);
    ' Z# {. n  R9 v3 R+ _6 l! l
  13. }1 o* @# d# [/ T$ E

  14. ! _2 B9 D# c% k5 F: U
  15. int application_start(int argc, char *argv[])' ~4 [( {3 t. {: ]& g- |
  16. {: L- o. O/ E0 T/ f
  17.     LOG("application started.");- G  |$ Z  |4 D
  18.     /* gpio port config */3 R1 h. p) F: n6 ?; W7 H% G
  19.     led.port = LED1;" W" v5 F0 E3 I" L4 }3 F$ c: v
  20.     /* set as output mode */
    : O- S& B' K2 O
  21.     led.config = OUTPUT_PUSH_PULL;
    4 _5 p1 v! T0 Q; \7 U3 r+ b
  22.     /* configure GPIO with the given settings */& M. T  S& t/ m1 i# D
  23.     hal_gpio_init(&led);
    ; V- I- q' O# l2 N7 V
  24. - M8 i  O! W9 H' M- g
  25.     aos_post_delayed_action(1000, app_delayed_action, NULL);( {+ ^& r: B$ r! u8 y2 v
  26.     aos_loop_run();2 W- _2 U# r1 O/ V' d  L$ n
  27. ( v& M( x; f9 u
  28.     return 0;
    7 n( F+ F5 {) c- N
  29. }; p5 t. D( _- M0 w, C8 d7 }0 b

  30. ) p% e% E) U9 |2 ~5 L- z1 F
复制代码
0 `4 O7 ^. j/ M+ t3 i
# p, ?0 L- [$ ~9 H+ Y
非常简单的代码,然后编译,上传到开发板,LED1开始闪烁。
% Z/ {, S- b6 B) Z" n# d3 \: c) y+ u' q4 q
关于开发环境,使用的是VSCode,使用之前记得先安装相关的组件,如下4 I2 n  j1 x$ d, o4 y

- z) N" e. K, t9 Q  [/ p 2018-07-06_092454.png
7 j9 L8 H9 V( q. R4 ^
7 F# j3 M  ~: l7 X" I* G( U然后就可以在VSCode里打开Github上拉下来的代码文件夹,开始体验。: v0 H( \( [8 k  E- n% ?

; H* h# K1 h9 b- @- s, t! c/ n: n' i/ [, n

1 O* a* e( p4 I7 C4 m* K  ^
" B0 S& ^" M/ e; M

评分

参与人数 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神点灯大法好。。
% p' x8 _: \  T% e, ]
七哥 回答时间: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?# G2 ^& N+ I. Y4 |
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 手机版