点个灯是为了上手,了解一些最基础的东西,比如程序框架,外设的一般操作方式。# e- S. @. i' U+ N- \) C Y) F
1 }, y4 t0 i; PAlios即然是一个OS,程序框架必然和裸机操作不同,先看个简单的hello-world,代码如下
. r+ a$ c& Z7 R/ T1 V- #include <aos/aos.h>
* T" e7 i$ m% ~* Q8 y5 r+ F x - # b8 y/ x& W/ e
- static void app_delayed_action(void *arg)6 |' @9 d9 L% Q& l* T3 r
- {
. S1 e' V) w8 F - LOG("helloworld %s:%d %s\r\n", __func__, __LINE__, aos_task_name());
* e) Z. E. q: B - aos_post_delayed_action(5000, app_delayed_action, NULL);
, ~7 o8 t4 B/ T" G: q' K% [; W: M* }4 I - }
! d0 p$ C' E" b7 d9 a2 w
* r# g+ |! L& _) s% ^ u- int application_start(int argc, char *argv[])
! a. b" Q' X4 Y2 R { - {
* I6 w" L6 `/ @8 z- L1 [( T - LOG("application started."); ^" G: W2 X- ]! D: G% A
- aos_post_delayed_action(1000, app_delayed_action, NULL);
! x, a7 \+ w; x2 d4 {$ W1 h' e+ F9 c - aos_loop_run();
3 U/ j+ i3 z! d - 1 F+ N" ~/ o( A- c& |4 G3 W! b7 D8 w
- return 0;
5 \, O2 D; i- P2 U$ j# w! ^ @ - }
复制代码 头文件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
- 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- #include "stm32l4xx_hal.h"
- h5 n7 I1 u" G# }7 { - #include <string.h>
! U) L& N1 G! d; ^+ l3 u - #include <stdlib.h>; q9 z7 n7 {+ s5 ?
- #include <stdio.h>0 L1 O5 P/ |4 s. i
- #include <stdbool.h>
+ q0 ?) T- _* p4 y - #include "aos/kernel.h"7 w+ t; a C1 d3 R9 y$ p! s
- 2 h/ H; J! @7 A* B; |1 j" Y
- #define PINS_IN_GROUP 16
}$ M/ U5 v- o( P1 G/ r - #define GROUP_GPIOA 0
7 T8 J5 x# D7 ]% Y2 D3 Y4 f - #define GROUP_GPIOB 1 9 t/ I6 r: I7 w/ f& Q( C* d2 t
- #define GROUP_GPIOC 2
! w3 b% I& r- K/ }, v - #define GROUP_GPIOD 3
9 s3 r7 H& c6 |6 O+ Z5 x* S - #define GROUP_GPIOE 4
* A+ V% }1 r* T5 N - #define GROUP_GPIOF 5
8 k* F6 N" C! O7 P% z' S# [2 ]) Y - #define GROUP_GPIOG 6
! s3 {! t( O+ ~; W$ \3 N - #define GROUP_GPIOH 7
- z% R) T& u7 f9 g- m -
4 t9 \% f. U8 o4 U' ~; P0 q# B' Z( ~ - #define HAL_GPIO_0 ((uint8_t)0) /* represent GPIOA pin 0 */
% B# }8 C0 z }0 c* I6 K) }* b* G - #define HAL_GPIO_1 ((uint8_t)1) /* represent GPIOA pin 1 */! b+ u9 {" X T& H8 w2 @& u
- #define HAL_GPIO_2 ((uint8_t)2) /* represent GPIOA pin 2 */: m5 j0 ~. o' y2 a& R
- #define HAL_GPIO_3 ((uint8_t)3) /* represent GPIOA pin 3 */3 H/ n+ H3 c& N% @
- #define HAL_GPIO_4 ((uint8_t)4) /* represent GPIOA pin 4 */
1 o6 e! S- R5 e5 x5 H - #define HAL_GPIO_5 ((uint8_t)5) /* represent GPIOA pin 5 */$ d/ ?8 ?" A5 O( F) N
- #define HAL_GPIO_6 ((uint8_t)6) /* represent GPIOA pin 6 */, @0 M v# U, k
- #define HAL_GPIO_7 ((uint8_t)7) /* represent GPIOA pin 7 */
9 j5 c" {- ^* M0 }9 e' c/ Q, ] - #define HAL_GPIO_8 ((uint8_t)8) /* represent GPIOA pin 8 */
/ l, I( o" }, t/ T+ t5 w, | - #define HAL_GPIO_9 ((uint8_t)9) /* represent GPIOA pin 9 */
! K; r& u& c* ], L - #define HAL_GPIO_10 ((uint8_t)10) /* represent GPIOA pin 10 */1 C; f; L/ {" k' r
- #define HAL_GPIO_11 ((uint8_t)11) /* represent GPIOA pin 11 */
3 [6 `& \5 h' k+ M8 e - #define HAL_GPIO_12 ((uint8_t)12) /* represent GPIOA pin 12 */
, T0 O0 L# r' ^8 N: @8 r1 m$ t4 H - #define HAL_GPIO_13 ((uint8_t)13) /* represent GPIOA pin 13 */" X% z5 x6 v. f, K: W/ [) B. ]. D
- #define HAL_GPIO_14 ((uint8_t)14) /* represent GPIOA pin 14 */3 C* E. A; w3 j- E& ]" O. l
- #define HAL_GPIO_15 ((uint8_t)15) /* represent GPIOA pin 15 */" a/ U! b3 D: T9 Y8 y) ~) T
-
$ E0 e6 d; w4 G' D% g+ m, W - #define HAL_GPIO_16 ((uint8_t)16) /* represent GPIOB pin 0 */0 E7 D# t- q$ D3 a: a% Z
- #define HAL_GPIO_17 ((uint8_t)17) /* represent GPIOB pin 1 */
, B8 C g+ J* t3 _ - #define HAL_GPIO_18 ((uint8_t)18) /* represent GPIOB pin 2 */7 z; U* Y4 p, d- g/ Y) b' O
- #define HAL_GPIO_19 ((uint8_t)19) /* represent GPIOB pin 3 */! a1 w9 J6 w3 b. H& X
- #define HAL_GPIO_20 ((uint8_t)20) /* represent GPIOB pin 4 */0 D3 l: X* C8 d1 g' {# y
- #define HAL_GPIO_21 ((uint8_t)21) /* represent GPIOB pin 5 */
$ O. V; y; b4 |; X" S - #define HAL_GPIO_22 ((uint8_t)22) /* represent GPIOB pin 6 */: { L: f8 w4 ^8 ~
- #define HAL_GPIO_23 ((uint8_t)23) /* represent GPIOB pin 7 */
0 c( U- T9 G5 ?- S& E - #define HAL_GPIO_24 ((uint8_t)24) /* represent GPIOB pin 8 */( s1 T' ?" I3 B
- #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 hal_gpio_init4 r4 W$ v+ v7 s$ P9 N- h
- 2 hal_gpio_output_high
, t, |0 Y- V7 u5 z# r# _ - 3 hal_gpio_output_low* }7 f3 o3 C6 F( \/ p& ]# c
- 4 hal_gpio_output_toggle
! Y$ x) o7 V1 L7 r& Y - 5 hal_gpio_input_get4 D9 Q' K1 I3 q! @- J; t2 Q' ^
- 6 hal_gpio_enable_irq
1 c6 o- t. l2 A/ ^1 } - 7 hal_gpio_disable_irq
# m; k: D1 z9 Z1 n9 w - 8 hal_gpio_clear_irq6 T- {, v4 J! k
- 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
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- #include <aos/aos.h>6 n/ E% E% C: k5 u L
- #include <hal/soc/soc.h>- Q6 E, m4 |; Z; O
" }( L4 P' @. a* P, ^- #define LED1 22
- U- v2 ] H+ k4 m - gpio_dev_t led;
, [0 S: l) }' y7 W7 J
7 K: ^+ k" ^" V j( h1 R* r
, a$ X6 I" D, {7 _$ K- static void app_delayed_action(void *arg). D8 m% u+ ]9 q/ Y: _2 \' c
- {
; w: f! L8 T3 ^6 Y( i - //LOG("helloworld %s:%d %s\r\n", __func__, __LINE__, aos_task_name());9 s$ R$ F9 Y8 y, C/ l
- hal_gpio_output_toggle(&led);
1 }" D" T p D4 W4 a5 [. y - aos_post_delayed_action(500, app_delayed_action, NULL);
' Z# {. n R9 v3 R+ _6 l! l - }1 o* @# d# [/ T$ E
! _2 B9 D# c% k5 F: U- int application_start(int argc, char *argv[])' ~4 [( {3 t. {: ]& g- |
- {: L- o. O/ E0 T/ f
- LOG("application started.");- G |$ Z |4 D
- /* gpio port config */3 R1 h. p) F: n6 ?; W7 H% G
- led.port = LED1;" W" v5 F0 E3 I" L4 }3 F$ c: v
- /* set as output mode */
: O- S& B' K2 O - led.config = OUTPUT_PUSH_PULL;
4 _5 p1 v! T0 Q; \7 U3 r+ b - /* configure GPIO with the given settings */& M. T S& t/ m1 i# D
- hal_gpio_init(&led);
; V- I- q' O# l2 N7 V - - M8 i O! W9 H' M- g
- aos_post_delayed_action(1000, app_delayed_action, NULL);( {+ ^& r: B$ r! u8 y2 v
- aos_loop_run();2 W- _2 U# r1 O/ V' d L$ n
- ( v& M( x; f9 u
- return 0;
7 n( F+ F5 {) c- N - }; p5 t. D( _- M0 w, C8 d7 }0 b
) 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
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 |