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

Alios Things开发套件之点灯

[复制链接]
netlhx 发布时间:2018-7-6 09:26
点个灯是为了上手,了解一些最基础的东西,比如程序框架,外设的一般操作方式。
# h, K* F* g/ I) ]/ O" M% D) A2 H# z' }' a0 R, V) k
Alios即然是一个OS,程序框架必然和裸机操作不同,先看个简单的hello-world,代码如下$ c* U+ j' p7 S8 r% a0 B! }% r
  1. #include <aos/aos.h>$ _% c( U  {" v" \

  2.   M: r; D& A  Q1 [: |4 b
  3. static void app_delayed_action(void *arg)) {) C% K& k+ d9 }6 F
  4. {
      Y/ H+ W2 g1 ?' E3 i
  5.     LOG("helloworld %s:%d %s\r\n", __func__, __LINE__, aos_task_name());! k; k! {+ {1 e5 n' h
  6.     aos_post_delayed_action(5000, app_delayed_action, NULL);
    / ]  @" G7 S, p8 }% Z/ S
  7. }: f* C5 Y  u  b# q+ Q

  8. # n4 d: U: Q7 @
  9. int application_start(int argc, char *argv[])
    8 r2 |; o4 C* u: V1 V  n( A- q2 z
  10. {9 }+ [( D/ Y) p7 k
  11.     LOG("application started.");
    ) h# O  x! J" i$ a' V7 d7 H
  12.     aos_post_delayed_action(1000, app_delayed_action, NULL);4 p7 W3 E6 z7 r$ Y0 p5 H
  13.     aos_loop_run();
    ; m1 S/ `% l* a. a' K: K
  14. + X; l7 z# \) z! H1 _
  15.     return 0;( k& F1 Y' J$ S, Z. V7 o
  16. }
复制代码
头文件aos.h是alios动力的源头,先不管有多复杂,照抄就是了。
6 k) |' S: i; g& c% k5 iapplication_start是程序的入口点,硬件上电初始化后,要跳到这里来执行。
' ]# \- g: b# J1 c* R) ~5 ~
, O; @2 T) I7 e# z  R4 ]* ^aos_post_delayed_action(1000, app_delayed_action, NULL)的作用是延迟执行指定的代码,在1秒钟后执行app_delayed_action函数,这个用法有点和Android中的Handler.postDelay方法类似。
" {, @3 [2 z; y0 P( ~& j% z1 q4 O5 i3 A* X- w
然后在app_delay_action函数中,反复延迟调用自身,从而达到反复执行的目的。( c# n! x2 q0 F: R4 ~
$ f# M" t# v* Y! _/ Y! v/ n; S
在入口函数中的aos_loop_run则是进入事件循环,该干啥就干啥。
+ w# r! }5 C/ w3 g4 o- v3 T0 s/ ]9 v0 V4 N3 O  G( N1 r
点灯用到GPIO,alios要忽略硬件之间的差异,必然得提供一份统一的API及差异化的硬件配置,统一的API提供了GPIO的初始化、读写操作,而差异化的硬件配置则针对特定的硬件平台。
8 J( ]* M& ?7 E9 X, r/ S; D
) n' S) E, `4 O+ Q: t& \这个差异化的配置文件位于board目录下,针对Alios Things Development Kit来说,该文件为/ p  D* \1 ~( C  C% A
  1. AliOS-Things\board\developerkit\hal\hal_gpio_stm32_l4.h
复制代码
中,部分代码摘录如下
$ ~6 X& n) N, J' b. S/ X& a
9 y3 S5 _' j: Y! Z
  1. #include "stm32l4xx_hal.h"4 v6 U6 {! I# g  ^8 u
  2. #include <string.h>
    ) E* u: Z. ~8 j
  3. #include <stdlib.h>
    $ I- U4 f9 s2 M& a" r, a
  4. #include <stdio.h>' v7 X$ f: U- Z( S4 V% i0 k
  5. #include <stdbool.h>  W1 U. v6 H) M" W
  6. #include "aos/kernel.h"
    2 J. F" n" t3 J! n, p/ @7 v" T4 i
  7. / k8 Y: S' y% N6 v3 {
  8. #define PINS_IN_GROUP  16
    3 L/ K$ Q; ^# T6 f- I0 J  S& U$ M
  9. #define GROUP_GPIOA    03 P! O! j5 D, N7 S0 H& \* ?
  10. #define GROUP_GPIOB    1         
    ; n6 Z3 n8 Z) t+ }% |# `8 J4 @
  11. #define GROUP_GPIOC    2
    6 P8 N& Y: d; s! d  A- s8 g
  12. #define GROUP_GPIOD    3         
      O4 Q7 J6 j# s4 U: Y* X: N
  13. #define GROUP_GPIOE    4
    " Y% |0 k. v) }/ O/ w( g( m
  14. #define GROUP_GPIOF    5
    9 j$ K4 K5 g1 S" Y+ r( F
  15. #define GROUP_GPIOG    60 ^, U# d& x, Y8 A& M
  16. #define GROUP_GPIOH    7
    * p+ }5 Z: _' V7 r
  17.          # R) U3 k) V) R
  18. #define HAL_GPIO_0                 ((uint8_t)0)        /* represent GPIOA pin 0 */9 h7 `' n- i; C9 P" ?9 o
  19. #define HAL_GPIO_1                 ((uint8_t)1)        /* represent GPIOA pin 1 */
    % v7 v/ X) [# c
  20. #define HAL_GPIO_2                 ((uint8_t)2)        /* represent GPIOA pin 2 */
    8 \: P7 @3 p$ D& f% R
  21. #define HAL_GPIO_3                 ((uint8_t)3)        /* represent GPIOA pin 3 */
    # B" S1 i9 P9 K
  22. #define HAL_GPIO_4                 ((uint8_t)4)        /* represent GPIOA pin 4 */
    . e/ n4 H: s8 P9 r5 a3 ^9 X
  23. #define HAL_GPIO_5                 ((uint8_t)5)        /* represent GPIOA pin 5 */
    1 q5 T4 [$ J$ D5 \
  24. #define HAL_GPIO_6                 ((uint8_t)6)        /* represent GPIOA pin 6 */+ l6 }9 a2 ^& A
  25. #define HAL_GPIO_7                 ((uint8_t)7)        /* represent GPIOA pin 7 */5 s5 G% i5 |9 v8 a1 [
  26. #define HAL_GPIO_8                 ((uint8_t)8)        /* represent GPIOA pin 8 */) b2 G6 A" U4 ?
  27. #define HAL_GPIO_9                 ((uint8_t)9)        /* represent GPIOA pin 9 */2 o4 @  N1 ]6 ]  f
  28. #define HAL_GPIO_10                ((uint8_t)10)       /* represent GPIOA pin 10 */
    6 e. e9 _. |( {( k& z: z
  29. #define HAL_GPIO_11                ((uint8_t)11)       /* represent GPIOA pin 11 */1 `) m1 a3 h; Y0 O
  30. #define HAL_GPIO_12                ((uint8_t)12)       /* represent GPIOA pin 12 */- Z$ R! \! w! R5 \9 N; j
  31. #define HAL_GPIO_13                ((uint8_t)13)       /* represent GPIOA pin 13 */& G9 ~; N9 R: r/ B4 r
  32. #define HAL_GPIO_14                ((uint8_t)14)       /* represent GPIOA pin 14 */
    % T% [" C) ]! q+ G2 j
  33. #define HAL_GPIO_15                ((uint8_t)15)       /* represent GPIOA pin 15 */
    3 J( T3 n) \+ Y( X
  34.          
    0 y; @- L& H! a8 X2 N& k8 h
  35. #define HAL_GPIO_16                ((uint8_t)16)       /* represent GPIOB pin 0 */  f0 v, v1 B. `. x+ z
  36. #define HAL_GPIO_17                ((uint8_t)17)       /* represent GPIOB pin 1 */! m) I% h* U, t9 C/ y
  37. #define HAL_GPIO_18                ((uint8_t)18)       /* represent GPIOB pin 2 */1 x. e5 i. |* F7 `7 Z& ~; T5 k
  38. #define HAL_GPIO_19                ((uint8_t)19)       /* represent GPIOB pin 3 */
    * `2 D7 s# P$ m2 N. l
  39. #define HAL_GPIO_20                ((uint8_t)20)       /* represent GPIOB pin 4 */
    9 ~, t3 i6 R; C
  40. #define HAL_GPIO_21                ((uint8_t)21)       /* represent GPIOB pin 5 */" _( y2 H: `2 P% [
  41. #define HAL_GPIO_22                ((uint8_t)22)       /* represent GPIOB pin 6 */; K8 H1 e; O) p( V# L0 s3 Q  C
  42. #define HAL_GPIO_23                ((uint8_t)23)       /* represent GPIOB pin 7 */
    7 J  N8 Y" U+ s/ n) ]8 v3 v
  43. #define HAL_GPIO_24                ((uint8_t)24)       /* represent GPIOB pin 8 */$ ]! @. E, A4 P/ K  p( B, e
  44. #define HAL_GPIO_25                ((uint8_t)25)       /* represent GPIOB pin 9 */
复制代码
这个倒是非常清楚,不过在官方的文档里却没有提到,需要用户自己去找,找了很久才找到!+ W( l# {1 l. K, `' K( U! X

$ q3 |: l+ s( ^GPIO通用的API列表如下6 ^4 w  J7 u1 b' }, k" C
  1. 1 hal_gpio_init% p; Z3 z2 @0 O  M
  2. 2 hal_gpio_output_high/ J! |8 ^( M7 H% t
  3. 3 hal_gpio_output_low/ j3 K8 Q; j) b4 E4 d0 [
  4. 4 hal_gpio_output_toggle; f4 b' s! |3 }# T8 F6 h
  5. 5 hal_gpio_input_get
    0 u' t5 Y/ i+ J9 w3 g! u6 A; }, M4 A
  6. 6 hal_gpio_enable_irq
    ) _/ o6 z( l/ G* G) x- `
  7. 7 hal_gpio_disable_irq
    2 s; W2 ^2 P% a$ @% x3 |
  8. 8 hal_gpio_clear_irq3 L( K3 N5 L5 P' q9 A+ Y
  9. 9 hal_gpio_finalize
复制代码
有了这些基础,接下来就可以点灯了。
, B$ B! h; `% @% k7 m! Z) L" ?3 p& H2 d* D0 l  D
开发板上提供了LED1, LED2,LED3,对应的硬件连接如图
3 V' {; T% Q0 @" E. o
2 `6 S9 ]6 g$ z4 P' q% ^ 2018-07-06_091207.png * {6 u- a; v% S" r3 T& G
5 t7 g: A+ v4 t
对应前面的GPIO映射得知在ALIOS中其编号为22,接下来修改代码如下
8 p; j6 P/ P* A' P( g" L9 P7 ]( y7 r) r; O
  1. #include <aos/aos.h>
    ) ~; T0 w" h4 \1 `; b# H4 {6 R
  2. #include <hal/soc/soc.h>
    7 i1 U% X8 F. W# ~/ Q
  3. " A/ g1 |! e/ D6 o
  4. #define LED1 22
    ! F+ u. i8 m( R9 ], v
  5. gpio_dev_t led;- a. h6 t  e, k3 x8 x  f

  6. 3 q2 ]: w& w& Z1 l" x
  7. $ _4 C/ Y! {) d) Q3 D, B$ C
  8. static void app_delayed_action(void *arg)
    ; z! r3 G2 G9 s. o: x3 D
  9. {- w# k0 K9 D" ?, D- K
  10.     //LOG("helloworld %s:%d %s\r\n", __func__, __LINE__, aos_task_name());
    - B( \/ c, D2 O0 Z0 k$ V2 V
  11.     hal_gpio_output_toggle(&led);
    1 h% ?+ t1 ]- |& M1 c& f' \1 T( ~/ f
  12.     aos_post_delayed_action(500, app_delayed_action, NULL);
    8 {7 z8 Z0 n3 ]2 V! F. Q* a, E
  13. }% q6 N' N0 z$ }. d: ]
  14. 4 ~" b! [: f0 a! {' `0 T( Y  v  r. S
  15. int application_start(int argc, char *argv[])
    7 ]0 \! j5 Z8 x- j4 \' [
  16. {9 l5 N) Z. f, E) _# x  D
  17.     LOG("application started.");
    , L! F. q6 U0 h% [* N( J
  18.     /* gpio port config */
    ) O" S* U' m2 O" K" Y* i) i
  19.     led.port = LED1;; H$ l' T* C: V
  20.     /* set as output mode */
    ; B) B. I4 _: k
  21.     led.config = OUTPUT_PUSH_PULL;9 u7 |1 Z; x! {* W
  22.     /* configure GPIO with the given settings */& f+ z  q4 T  p. f' Y1 {$ y
  23.     hal_gpio_init(&led);5 [( [7 q+ U  q5 b5 ~. s: e; N

  24. / v2 Q% m9 @& Z
  25.     aos_post_delayed_action(1000, app_delayed_action, NULL);
    2 o- q* m" ~  S3 k4 Z2 l2 X
  26.     aos_loop_run();
    0 N7 g" i+ y" |6 u

  27. ! a$ H% P& j5 N' s/ j. ~% d' `
  28.     return 0;% B0 O3 [( v. S! h1 m. ?
  29. }
    4 f( m+ l7 Q0 L4 x6 u6 Y
  30. 6 m! N6 J, b' y9 v) w6 g1 N! I
复制代码

+ m* f% r1 K0 X+ I$ c1 ?1 n6 T  R8 ]% V0 T6 H% o# L1 l, s. ~
非常简单的代码,然后编译,上传到开发板,LED1开始闪烁。
  Z& r! E, Q, v' ?4 [5 C7 `+ ~  f  n: z6 t+ J0 O# l
关于开发环境,使用的是VSCode,使用之前记得先安装相关的组件,如下
! H. q+ K5 Y/ O/ y$ I5 A3 f% I- W( y8 Q5 ?! o
2018-07-06_092454.png
% B+ N0 \/ l% j& z9 s, `2 G7 y+ C% [  {# H: }5 q
然后就可以在VSCode里打开Github上拉下来的代码文件夹,开始体验。* _0 D2 y: P) X7 u0 P

. c: c) {1 }8 T% O: b
3 v3 q5 d2 L1 v: E) t' r
# q" O- b3 h& O1 P6 F+ `9 \$ B0 S: n+ x7 H
9 Z) W2 h, P! [+ l6 k# t

评分

参与人数 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神点灯大法好。。# q  s! c; {( [$ Q9 ~$ o# c
七哥 回答时间: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?+ L& K5 _4 L  ?  h8 k3 X
AI++ 回答时间: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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版