点个灯是为了上手,了解一些最基础的东西,比如程序框架,外设的一般操作方式。
4 M W' M! b, I0 ^
~" M1 q! f9 _/ _" kAlios即然是一个OS,程序框架必然和裸机操作不同,先看个简单的hello-world,代码如下
9 K7 \7 ?& h1 S7 d% x" L7 W- #include <aos/aos.h>1 b- \$ J6 C1 J6 C' h/ U; P! b
- 5 Z7 ~/ x% J2 }4 r
- static void app_delayed_action(void *arg)% S% F1 t% ?" C5 b( y
- {% @% U6 z7 a6 Z4 t" \8 P
- LOG("helloworld %s:%d %s\r\n", __func__, __LINE__, aos_task_name());# z/ R# ^# Y3 f1 p$ _, ?
- aos_post_delayed_action(5000, app_delayed_action, NULL);
! w4 f+ ~' T& }4 O* o: i' _, S - }
2 K7 s3 ?' O( B6 h! c2 {
8 _! z. O0 u: R3 U- int application_start(int argc, char *argv[])
' s( g: c1 G; J5 w8 V - {7 P/ h8 G8 ^! i
- LOG("application started.");
: q( X: T# k2 y- b) b - aos_post_delayed_action(1000, app_delayed_action, NULL);' w+ O" c5 n1 \3 u% O) X7 N- \
- aos_loop_run();
1 z; [# ~7 h7 W: W& \
& }& C& A% C8 Z! l9 K- return 0;( i1 h. _: n' i/ b& x9 Y& X
- }
复制代码 头文件aos.h是alios动力的源头,先不管有多复杂,照抄就是了。, I) y$ i- N3 M0 Y7 W
application_start是程序的入口点,硬件上电初始化后,要跳到这里来执行。$ x4 |. C3 _5 i2 }5 x
9 q8 b$ g c0 M, f$ Q6 Y/ @8 paos_post_delayed_action(1000, app_delayed_action, NULL)的作用是延迟执行指定的代码,在1秒钟后执行app_delayed_action函数,这个用法有点和Android中的Handler.postDelay方法类似。
. w- I! k# P b8 b) D3 S4 o) k. u, L
然后在app_delay_action函数中,反复延迟调用自身,从而达到反复执行的目的。
$ T$ U' \! v: [8 G8 `! n
6 B ?3 P- S. q' t2 i0 s在入口函数中的aos_loop_run则是进入事件循环,该干啥就干啥。
9 Y |" T' U: F3 {! }/ P K1 q7 [8 D- [# f' A! d3 h- x
点灯用到GPIO,alios要忽略硬件之间的差异,必然得提供一份统一的API及差异化的硬件配置,统一的API提供了GPIO的初始化、读写操作,而差异化的硬件配置则针对特定的硬件平台。3 K' c% H- E5 B2 g7 X& g
9 k$ l- B1 X- F# z/ _5 v# l这个差异化的配置文件位于board目录下,针对Alios Things Development Kit来说,该文件为9 M* \5 z7 @+ `/ C1 I, g
- AliOS-Things\board\developerkit\hal\hal_gpio_stm32_l4.h
复制代码 中,部分代码摘录如下$ r' A" o* W7 X- h3 J
$ A8 r- U- G; q/ [: q* x3 k3 d5 {# a
- #include "stm32l4xx_hal.h"
! p' V$ _$ {# C$ ~ - #include <string.h># J5 x$ T3 A0 k N# U' o6 b' X, s4 e
- #include <stdlib.h>) o: J" H7 s7 D9 a- W# t6 w7 {
- #include <stdio.h>: i [6 {5 f* k! L4 T
- #include <stdbool.h>
" r9 X& ^& h4 K9 G7 ~ - #include "aos/kernel.h"* {0 G( A( E8 O* v( Z& @ m
8 r3 j6 W9 A" I: w+ t3 h; h- #define PINS_IN_GROUP 16, o+ ?- | k9 t s: [3 Y
- #define GROUP_GPIOA 0
+ N3 e- c/ v/ u" l ~ - #define GROUP_GPIOB 1 " e8 G! @: D* V
- #define GROUP_GPIOC 2' I! \) @, u$ h' b% ^0 ~0 G6 U
- #define GROUP_GPIOD 3
3 Z& f& j* B1 e7 G - #define GROUP_GPIOE 44 d% ~0 w8 [6 }) f5 Z
- #define GROUP_GPIOF 5. n1 n* i. J8 ?0 ~
- #define GROUP_GPIOG 6
Q R" @0 s3 w - #define GROUP_GPIOH 7) b2 Y7 n3 O ?- C* [. m: H
- ( Y0 R4 P0 y5 v$ h& e
- #define HAL_GPIO_0 ((uint8_t)0) /* represent GPIOA pin 0 */
, U* \/ d& ^7 M- Y/ _ - #define HAL_GPIO_1 ((uint8_t)1) /* represent GPIOA pin 1 */5 K5 g. N! |. _0 }2 h! }4 s! X# f
- #define HAL_GPIO_2 ((uint8_t)2) /* represent GPIOA pin 2 */
! j3 q* B. c+ I - #define HAL_GPIO_3 ((uint8_t)3) /* represent GPIOA pin 3 */
. }6 P6 a; ~2 A% A5 k) ^5 |6 R - #define HAL_GPIO_4 ((uint8_t)4) /* represent GPIOA pin 4 */6 J3 a' a+ n0 b2 O. E
- #define HAL_GPIO_5 ((uint8_t)5) /* represent GPIOA pin 5 */' e* l/ U5 ^ ]2 [3 R
- #define HAL_GPIO_6 ((uint8_t)6) /* represent GPIOA pin 6 */
- _' e( M2 O0 p$ {7 B - #define HAL_GPIO_7 ((uint8_t)7) /* represent GPIOA pin 7 */+ b5 _' h O: ? O6 d$ D9 v
- #define HAL_GPIO_8 ((uint8_t)8) /* represent GPIOA pin 8 */
( n" O% Y# `' C& t0 s% j - #define HAL_GPIO_9 ((uint8_t)9) /* represent GPIOA pin 9 */' [! X7 V: n- M
- #define HAL_GPIO_10 ((uint8_t)10) /* represent GPIOA pin 10 */
c0 f- E- i& [ - #define HAL_GPIO_11 ((uint8_t)11) /* represent GPIOA pin 11 */
( y" C# _/ N( T J: l - #define HAL_GPIO_12 ((uint8_t)12) /* represent GPIOA pin 12 *// A& h/ l. u: }( [) ^- ?
- #define HAL_GPIO_13 ((uint8_t)13) /* represent GPIOA pin 13 */5 F& K) @ ?6 @3 c$ a& W
- #define HAL_GPIO_14 ((uint8_t)14) /* represent GPIOA pin 14 */8 o0 M8 e' Y! B( n4 ]6 m
- #define HAL_GPIO_15 ((uint8_t)15) /* represent GPIOA pin 15 */$ [. ?/ G; [2 `0 Y
- # x" m q( G% ?+ ~* |
- #define HAL_GPIO_16 ((uint8_t)16) /* represent GPIOB pin 0 */
6 N% A4 k; [$ s" a" F7 p p - #define HAL_GPIO_17 ((uint8_t)17) /* represent GPIOB pin 1 */$ ?* ]# l: ~+ y* B3 l! u
- #define HAL_GPIO_18 ((uint8_t)18) /* represent GPIOB pin 2 */
4 z3 c$ m9 f5 u7 } D( n& \ - #define HAL_GPIO_19 ((uint8_t)19) /* represent GPIOB pin 3 */
7 ?1 _( @. u3 N8 w$ b+ I' w/ C - #define HAL_GPIO_20 ((uint8_t)20) /* represent GPIOB pin 4 */4 p& ?/ L7 N& g' {
- #define HAL_GPIO_21 ((uint8_t)21) /* represent GPIOB pin 5 */4 } t) Q2 v4 E A Q
- #define HAL_GPIO_22 ((uint8_t)22) /* represent GPIOB pin 6 */
2 x9 i* j/ |% O9 p1 U8 t3 d- r6 e! p. Q - #define HAL_GPIO_23 ((uint8_t)23) /* represent GPIOB pin 7 */8 X, d6 m8 r6 |
- #define HAL_GPIO_24 ((uint8_t)24) /* represent GPIOB pin 8 */
% W/ F; S3 d: Z8 w1 H- c - #define HAL_GPIO_25 ((uint8_t)25) /* represent GPIOB pin 9 */
复制代码 这个倒是非常清楚,不过在官方的文档里却没有提到,需要用户自己去找,找了很久才找到!2 T* M! J3 P9 h
- M$ O; h3 \- d7 \4 k' ?& o3 P
GPIO通用的API列表如下& u S1 y% E: [/ W) ^ N J) ~7 M u
- 1 hal_gpio_init3 {) W/ Q) {1 b/ j0 z! f
- 2 hal_gpio_output_high
5 z' \5 g( h( k9 c6 r! o - 3 hal_gpio_output_low% K [- I/ ?$ [
- 4 hal_gpio_output_toggle
% ]8 }& \3 c0 L ^ e - 5 hal_gpio_input_get
7 x7 o. v& V8 V. u - 6 hal_gpio_enable_irq
! Y t$ {5 c& M: j. d - 7 hal_gpio_disable_irq
% d2 u( K w# ?& @% z/ Z - 8 hal_gpio_clear_irq
% H6 Q3 e9 L$ F3 v - 9 hal_gpio_finalize
复制代码 有了这些基础,接下来就可以点灯了。6 D) W- G. l0 E0 P8 A
4 g9 Q+ @- W- p. s% l" V3 f0 \
开发板上提供了LED1, LED2,LED3,对应的硬件连接如图
/ L5 Z) _. _3 L/ K- H3 r: H3 K0 p% e" X" ~
/ q* f% c: v {' d) r' \, ]# I1 x# t; t
对应前面的GPIO映射得知在ALIOS中其编号为22,接下来修改代码如下2 P7 M1 n1 i/ @4 R- n) B [1 y
3 E! H4 f7 b/ _- Y; \, @! l( Y- #include <aos/aos.h>
: v0 ?9 Y) } l5 s% T$ k - #include <hal/soc/soc.h>
' z7 G- D' Y& ~0 @7 |: t/ b6 P9 M( S. o1 X - : s' P n# K$ q9 g4 B% i4 t
- #define LED1 22
6 o( W& M+ p2 v# s o# ? - gpio_dev_t led;( g1 K2 {# R( ?! P0 d
- 7 F- h' y4 m) J( R, ^! x* i
- + U' A' ^% v! G, H
- static void app_delayed_action(void *arg)
8 h6 ^& P" P! L3 O" a/ \9 L - {- d. a# y$ a9 v) D" o
- //LOG("helloworld %s:%d %s\r\n", __func__, __LINE__, aos_task_name());
/ V2 T. c0 D) Y! M) z" E - hal_gpio_output_toggle(&led);7 J3 |9 ~/ r+ W0 g& g
- aos_post_delayed_action(500, app_delayed_action, NULL);
0 F* Y: T7 D- S# X# Q/ C7 X7 \ - }
/ [. p, Y6 K# s$ t+ l; ^
) N/ d8 v* K1 f. ~; Q- int application_start(int argc, char *argv[])
5 J1 l" e: K, N% ` - {! N" k1 h2 I* j0 e. A- I
- LOG("application started.");
$ K# b( x9 w+ s+ S+ Z - /* gpio port config */
7 X" d4 N/ k! i0 D- D A# U& u - led.port = LED1;: @; F O& i4 U$ o' L6 p- h g
- /* set as output mode */7 F8 G3 t- _* o* h
- led.config = OUTPUT_PUSH_PULL;
& U( g8 K$ K' j - /* configure GPIO with the given settings */" O: I6 E& N$ w8 u0 \
- hal_gpio_init(&led);# A& C" L `( M( C
1 T- R1 l \0 m2 d4 A0 P5 Z- aos_post_delayed_action(1000, app_delayed_action, NULL);% h6 j; V1 l5 w8 j( \
- aos_loop_run();' u2 b! q7 C7 h' c: U! ]7 \
- ' u0 k( U$ O' r# d
- return 0;
! R5 d* h6 ^8 `9 { - }
+ \: S% t# u: l9 y
+ A3 ]. U1 z" A6 y
复制代码
1 A3 l3 a/ X( a: H. z+ u0 T3 [ L* i/ T) T6 D! E: A9 i0 J
非常简单的代码,然后编译,上传到开发板,LED1开始闪烁。; I! Q* z/ f# }( m. m
# |- R1 t+ D/ Q3 |+ _. `) U关于开发环境,使用的是VSCode,使用之前记得先安装相关的组件,如下
7 Y# W t" z0 X) j/ `! D$ l2 O. B# s) |2 m) f; T
* i4 F, t! O" J! c, I/ ~# `" G
" ?7 T6 s+ c" s9 b( K7 ]4 p然后就可以在VSCode里打开Github上拉下来的代码文件夹,开始体验。
# P- ]3 l$ r/ h6 P) ~& L- M4 z/ e+ c3 U5 q) X+ F1 j( r
- Y! R. g4 q; ~7 m; f
6 H$ |4 L# ` o. g. k9 i$ r1 Y0 v [9 @* K9 j$ u3 r# w. S
|