点个灯是为了上手,了解一些最基础的东西,比如程序框架,外设的一般操作方式。
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
- #include <aos/aos.h>) a: ? d% t! X, i6 [2 v
- B+ x7 l9 K' x; y9 a8 x4 R( l
- static void app_delayed_action(void *arg)) x# m. g$ y( }
- {2 a9 S; W+ f% r! T) V4 L
- LOG("helloworld %s:%d %s\r\n", __func__, __LINE__, aos_task_name());2 A) I7 j o- ?5 L6 O9 {
- aos_post_delayed_action(5000, app_delayed_action, NULL);
7 b N6 v7 c; g - }4 S7 [: j# D2 e. Z/ j) y
7 H" G; n# q) O$ G0 v- int application_start(int argc, char *argv[])
/ l* `% G8 P: l0 C) x3 K - {
/ U2 O0 B# A, [6 m; }2 T7 r3 a - LOG("application started.");
9 s3 B; P- w) \+ @3 R) ~! t6 |1 B - aos_post_delayed_action(1000, app_delayed_action, NULL);
& T( E% k1 E- D. k4 K - aos_loop_run();6 J6 {; j) z9 ?
& I j( l7 @2 q. j' n- return 0;! P2 {( J1 P9 A E$ E1 J( P
- }
复制代码 头文件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
- AliOS-Things\board\developerkit\hal\hal_gpio_stm32_l4.h
复制代码 中,部分代码摘录如下2 F I7 X, |- a; ]' x; ?4 K d
- Y2 [2 {6 I* `- #include "stm32l4xx_hal.h"
, q& X. q1 c5 o. x5 e, O - #include <string.h>6 i4 f* F5 {7 S8 H
- #include <stdlib.h>
( E1 o5 _6 Y" [; M* f- t* I+ | - #include <stdio.h>
( p% }& t$ r- V - #include <stdbool.h>
' R: `# s) V" s$ k6 E$ C - #include "aos/kernel.h"
" v; J% w$ V2 \' P - / Y, Y( g; l7 _* E& |. J( G
- #define PINS_IN_GROUP 16
4 ~+ L( B& r8 B( O+ L2 _0 i& K - #define GROUP_GPIOA 0
& W! d+ A c6 N7 K/ i/ P. s - #define GROUP_GPIOB 1 8 c: |6 G# u2 m2 P2 j
- #define GROUP_GPIOC 2
3 I9 d0 t- V/ L8 N6 e- x - #define GROUP_GPIOD 3 + V) Z' ]7 p& I2 r7 _( L( U* [
- #define GROUP_GPIOE 4
. G7 s/ [5 E' O; s* E. s6 E- x6 n - #define GROUP_GPIOF 5: r f$ j$ F5 W) p9 d2 }" ?: S" H* H
- #define GROUP_GPIOG 6- X2 [2 B1 ~& u; J( s4 i7 ]
- #define GROUP_GPIOH 7
/ D8 S4 X9 ?. a4 v* B2 O$ n -
% {4 s8 |9 b' w - #define HAL_GPIO_0 ((uint8_t)0) /* represent GPIOA pin 0 */ L3 e) Z3 a, Y, `
- #define HAL_GPIO_1 ((uint8_t)1) /* represent GPIOA pin 1 */2 u% H7 P" U) F( j8 z# y# u
- #define HAL_GPIO_2 ((uint8_t)2) /* represent GPIOA pin 2 */
3 ^0 l9 e# Z+ Z6 {2 N - #define HAL_GPIO_3 ((uint8_t)3) /* represent GPIOA pin 3 */
0 a- E. B7 m* U2 G# h" c+ x - #define HAL_GPIO_4 ((uint8_t)4) /* represent GPIOA pin 4 */
* X% m, w \4 F4 _! ?" c j - #define HAL_GPIO_5 ((uint8_t)5) /* represent GPIOA pin 5 */
% ]: \9 C; m$ F - #define HAL_GPIO_6 ((uint8_t)6) /* represent GPIOA pin 6 */
( R( l, c- I/ G/ l* S6 U - #define HAL_GPIO_7 ((uint8_t)7) /* represent GPIOA pin 7 */' |0 t* H& i" f2 @6 C7 K' ^
- #define HAL_GPIO_8 ((uint8_t)8) /* represent GPIOA pin 8 */
0 v1 m9 I0 H- b0 q5 m - #define HAL_GPIO_9 ((uint8_t)9) /* represent GPIOA pin 9 */
. L- M! }& u$ O- n4 F# Z# v - #define HAL_GPIO_10 ((uint8_t)10) /* represent GPIOA pin 10 */( G2 b! h( n& z. ~
- #define HAL_GPIO_11 ((uint8_t)11) /* represent GPIOA pin 11 */% X# [6 @/ I+ R0 ^/ F, i
- #define HAL_GPIO_12 ((uint8_t)12) /* represent GPIOA pin 12 */: u5 P* S! E" w0 m6 r* i& j; @
- #define HAL_GPIO_13 ((uint8_t)13) /* represent GPIOA pin 13 */
" L& [" H O8 z8 u- a - #define HAL_GPIO_14 ((uint8_t)14) /* represent GPIOA pin 14 */5 U& J0 b1 Y2 D' J ~ b
- #define HAL_GPIO_15 ((uint8_t)15) /* represent GPIOA pin 15 */
7 o& k' g8 s% n- G5 @ - 7 r1 A) e- `% X3 h# V
- #define HAL_GPIO_16 ((uint8_t)16) /* represent GPIOB pin 0 */
" O: ^0 `6 E4 y% B - #define HAL_GPIO_17 ((uint8_t)17) /* represent GPIOB pin 1 */& V' b- g4 Z* @2 D% M7 {
- #define HAL_GPIO_18 ((uint8_t)18) /* represent GPIOB pin 2 */
5 p L/ |/ ^! { - #define HAL_GPIO_19 ((uint8_t)19) /* represent GPIOB pin 3 */
8 {8 e2 H9 ^: h; G - #define HAL_GPIO_20 ((uint8_t)20) /* represent GPIOB pin 4 */
+ w# i0 }& h# E0 i2 _1 i - #define HAL_GPIO_21 ((uint8_t)21) /* represent GPIOB pin 5 */, K( S$ { a. U8 y" w( }2 }0 z
- #define HAL_GPIO_22 ((uint8_t)22) /* represent GPIOB pin 6 */0 s) ]2 M- e5 u k! q
- #define HAL_GPIO_23 ((uint8_t)23) /* represent GPIOB pin 7 */
, j9 w' W5 m- n, g& ^: `$ ` - #define HAL_GPIO_24 ((uint8_t)24) /* represent GPIOB pin 8 */0 C$ l& c. t2 D9 t6 | b1 G8 K
- #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 hal_gpio_init- f, {5 x; H% _1 |2 _6 f" w
- 2 hal_gpio_output_high
* w) Z @/ r0 C - 3 hal_gpio_output_low/ F7 T1 v1 N C* ]- ^5 i, I! s
- 4 hal_gpio_output_toggle
3 A ]+ ?; ~! `1 { - 5 hal_gpio_input_get6 T) I- t0 J) l: V
- 6 hal_gpio_enable_irq! r. H! p) D9 U1 m3 f2 k9 V9 p
- 7 hal_gpio_disable_irq% C% P: @) V8 C4 w" v+ L4 h; k
- 8 hal_gpio_clear_irq
/ v3 Y0 ~/ r, D* v& y8 A+ ]6 s - 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
}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
- #include <aos/aos.h>
; S b: d+ J9 q" D! T3 S \ - #include <hal/soc/soc.h>
. d% i4 x/ w$ K4 P( t3 _/ R ~ - 0 |: h: h5 z, [2 ]
- #define LED1 22
' h7 x( _; b$ |* x - gpio_dev_t led;
7 z6 Q1 t9 l Y, @
' D6 q7 H4 A2 B5 U g
# w: I3 \, g1 R2 w7 F- static void app_delayed_action(void *arg)# Q2 ~ z( v0 B8 S" w
- {
- I2 X# v1 ?4 |) u( q& x! ]1 w - //LOG("helloworld %s:%d %s\r\n", __func__, __LINE__, aos_task_name());. c ]# L( D" N4 g+ M
- hal_gpio_output_toggle(&led);
, Z3 p6 M. P2 \ - aos_post_delayed_action(500, app_delayed_action, NULL); T7 Q; k) [7 i) i$ g+ Q
- }
% Q- @0 g% T& q s% P$ X/ u
4 d+ O+ W' f) U" \" R- int application_start(int argc, char *argv[])
1 {( D) k/ q6 i9 S Y1 j3 s+ w, Y - {! F, V" o9 f k- t9 k/ e
- LOG("application started.");+ _. U& h6 ?" u
- /* gpio port config */
* r2 }4 j/ | D- L8 Y - led.port = LED1;
9 }% p1 t% p* _5 Y# |# T - /* set as output mode */
( Y8 l) [. `" t3 s0 ^ - led.config = OUTPUT_PUSH_PULL;
! S7 I- E* n, e2 r, J6 V+ e! \ - /* configure GPIO with the given settings */
% u% _" s. v% h! _8 Z% e - hal_gpio_init(&led);" r6 }" s$ l7 ^/ w/ m5 t
% [$ s" X2 y+ @/ g8 L0 h& ^- aos_post_delayed_action(1000, app_delayed_action, NULL);
& U: @" G8 L: }+ k4 `; k# n - aos_loop_run();5 f- R- r+ U7 Z: O x$ ]
% Y f1 U0 ?8 p# u6 x- return 0;4 O3 D) P" X; l. E) Y
- }
9 z6 D1 j% e3 b/ }+ I, r( K; k1 ~
# 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
) 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 |