环境介绍

硬件:一块STM32 NUCLEO-F411RE开发板,一个ST-Link;
软件:装好ST-Link的驱动程序,Keil5;
文档:开发板的原理图、芯片的参考手册和HAL驱动说明书。
系统:AIios-things。

关于AIios-things

AliOS Things 将致力于搭建云端一体化 IoT 基础设施,具备极致性能、极简开发、云端一体、丰富组件、安全防护等关键能力,并支持终端设备连接到阿里云 Link,可广泛应用在智能家居、智慧城市、工业,新出行等领域。


阿里云IoT - 所知不止于感知](https://iot.aliyun.com/products/aliosthings?spm=5176.12825654.h2v3icoap.334.54562c4aSYItZN)

STM32f401RE

参考MB1136 原理图可以看到 NUCLEO F401一共有三颗LED。
LD1:ST-Link的通讯指示灯,在我们烧录程序和调试的时候可以观察到LD1的变化。
LD2:如下图该LED连接在PA5与PB13引脚,默认情况下连接在PA5,SB42通过0R电阻短接,SB29断开连接。
LD3:LD3是作为5V的供电指示灯,当外部供电或者USB供电正常时该LED正常点亮。

这一次要点亮的是LD2,从电路图我们可以看出管脚是PA5。
让PA5输出高电平即可点亮

HAL库

stm32hal库的GPIO函数库在stm32f4xx_hal_gpio.h。

点灯用到GPIO,alios要忽略硬件之间的差异,必然得提供一份统一的API及差异化的硬件配置,统一的API提供了GPIO的初始化、读写操作,而差异化的硬件配置则针对特定的硬件平台。
与ST提供的HAL库相对应的是AIios里提供的hal_gpio_stm32f4xx.h。

/*
 * Copyright (C) 2015-2017 Alibaba Group Holding Limited
 */

#ifndef __HAL_GPIO_STM32F4_H
#define __HAL_GPIO_STM32F4_H

#ifdef __cplusplus
 extern "C" {
#endif

#include "stm32f4xx_hal.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>

#include "aos/hal/gpio.h"
#include "aos/kernel.h"

#include "board.h"

typedef struct{ 
    uint16_t    port;  //Logical Port
    void*       GpioGroup; //GPIOA, GPIOB
    uint16_t Pin;       /*!< Specifies the GPIO pins to be configured.
                            This parameter can be any value of @ref GPIO_pins_define */
    uint16_t Speed;     /*!< Specifies the speed for the selected pins.
                            This parameter can be a value of @ref GPIO_speed_define */
    gpio_pinstate_t  defaultLogicalVal;//only used for output

}gpio_mapping_t;

typedef  struct gpio_irq_slop {
    int32_t pin_num;
    int32_t irq_num;
    gpio_irq_handler_t handler;
    void * priv;
} gpio_irq_slop_t;

extern  const gpio_mapping_t gpio_mapping_table[];

#define PINS_IN_GROUP  16
#define GROUP_GPIOA    0
#define GROUP_GPIOB    1
#define GROUP_GPIOC    2
#define GROUP_GPIOD    3 
#define GROUP_GPIOE    4

#define HAL_GPIO_0                 ((uint8_t)0)        /* represent GPIOA pin 0 */
#define HAL_GPIO_1                 ((uint8_t)1)        /* represent GPIOA pin 1 */
#define HAL_GPIO_2                 ((uint8_t)2)        /* represent GPIOA pin 2 */
#define HAL_GPIO_3                 ((uint8_t)3)        /* represent GPIOA pin 3 */
#define HAL_GPIO_4                 ((uint8_t)4)        /* represent GPIOA pin 4 */
#define HAL_GPIO_5                 ((uint8_t)5)        /* represent GPIOA pin 5 */
#define HAL_GPIO_6                 ((uint8_t)6)        /* represent GPIOA pin 6 */
#define HAL_GPIO_7                 ((uint8_t)7)        /* represent GPIOA pin 7 */
#define HAL_GPIO_8                 ((uint8_t)8)        /* represent GPIOA pin 8 */
#define HAL_GPIO_9                 ((uint8_t)9)        /* represent GPIOA pin 9 */
#define HAL_GPIO_10                ((uint8_t)10)       /* represent GPIOA pin 10 */
#define HAL_GPIO_11                ((uint8_t)11)       /* represent GPIOA pin 11 */
#define HAL_GPIO_12                ((uint8_t)12)       /* represent GPIOA pin 12 */
#define HAL_GPIO_13                ((uint8_t)13)       /* represent GPIOA pin 13 */
#define HAL_GPIO_14                ((uint8_t)14)       /* represent GPIOA pin 14 */
#define HAL_GPIO_15                ((uint8_t)15)       /* represent GPIOA pin 15 */
	 
#define HAL_GPIO_16                ((uint8_t)16)       /* represent GPIOB pin 0 */
#define HAL_GPIO_17                ((uint8_t)17)       /* represent GPIOB pin 1 */
#define HAL_GPIO_18                ((uint8_t)18)       /* represent GPIOB pin 2 */
#define HAL_GPIO_19                ((uint8_t)19)       /* represent GPIOB pin 3 */
#define HAL_GPIO_20                ((uint8_t)20)       /* represent GPIOB pin 4 */
#define HAL_GPIO_21                ((uint8_t)21)       /* represent GPIOB pin 5 */
#define HAL_GPIO_22                ((uint8_t)22)       /* represent GPIOB pin 6 */
#define HAL_GPIO_23                ((uint8_t)23)       /* represent GPIOB pin 7 */
#define HAL_GPIO_24                ((uint8_t)24)       /* represent GPIOB pin 8 */
#define HAL_GPIO_25                ((uint8_t)25)       /* represent GPIOB pin 9 */
#define HAL_GPIO_26                ((uint8_t)26)       /* represent GPIOB pin 10 */
#define HAL_GPIO_27                ((uint8_t)27)       /* represent GPIOB pin 11 */
#define HAL_GPIO_28                ((uint8_t)28)       /* represent GPIOB pin 12 */
#define HAL_GPIO_29                ((uint8_t)29)       /* represent GPIOB pin 13 */
#define HAL_GPIO_30                ((uint8_t)30)       /* represent GPIOB pin 14 */
#define HAL_GPIO_31                ((uint8_t)31)       /* represent GPIOB pin 15 */

#define HAL_GPIO_32                ((uint8_t)32)       /* represent GPIOC pin 0 */
#define HAL_GPIO_33                ((uint8_t)33)       /* represent GPIOC pin 1 */
#define HAL_GPIO_34                ((uint8_t)34)       /* represent GPIOC pin 2 */
#define HAL_GPIO_35                ((uint8_t)35)       /* represent GPIOC pin 3 */
#define HAL_GPIO_36                ((uint8_t)36)       /* represent GPIOC pin 4 */
#define HAL_GPIO_37                ((uint8_t)37)       /* represent GPIOC pin 5 */
#define HAL_GPIO_38                ((uint8_t)38)       /* represent GPIOC pin 6 */
#define HAL_GPIO_39                ((uint8_t)39)       /* represent GPIOC pin 7 */
#define HAL_GPIO_40                ((uint8_t)40)       /* represent GPIOC pin 8 */
#define HAL_GPIO_41                ((uint8_t)41)       /* represent GPIOC pin 9 */
#define HAL_GPIO_42                ((uint8_t)42)       /* represent GPIOC pin 10 */
#define HAL_GPIO_43                ((uint8_t)43)       /* represent GPIOC pin 11 */
#define HAL_GPIO_44                ((uint8_t)44)       /* represent GPIOC pin 12 */
#define HAL_GPIO_45                ((uint8_t)45)       /* represent GPIOC pin 13 */
#define HAL_GPIO_46                ((uint8_t)46)       /* represent GPIOC pin 14 */
#define HAL_GPIO_47                ((uint8_t)47)       /* represent GPIOC pin 15 */	

#define ON_BOARD_LED01 HAL_GPIO_16
#define ON_BOARD_LED02 HAL_GPIO_32
#define ON_BOARD_LED03 HAL_GPIO_30

#define GPIOA_SPEED    GPIO_SPEED_FREQ_VERY_HIGH

#ifdef __cplusplus
}
#endif

#endif /* __HAL_GPIO_STM32L4_H */

GPIO映射得知LD2在AliOS中其编号为5
hal_gpio_stm32f4xx.c

开始编程

1.在AIiOS中选择定制你的AIiOS thing,勾选stm32f401re的板子,APP就勾选helloworld这个最初始的例程。(需要登录才可以下载,选下载keil)
2.用keil5打开,编译运行一下是否会出错。使用ST-Link下载进板子里测试,串口调试看是否有打印输出,有则表明系统在板子里有跑起来。
3.就在helloworld这个例程上进行更改。

具体步骤

int application_start(int argc, char *argv[])

这个是应用程序的入口函数,因为是OS,跟裸机的编程框架是不同的。

#define GPIO_LED_IO		5

gpio_dev_t led;

static void app_delayed_action(void *arg)
{
    hal_gpio_output_toggle(&led);
    aos_post_delayed_action(500, app_delayed_action, NULL);
}

int application_start(int argc, char *argv[])
{
		led.port=GPIO_LED_IO;
		led.config=OUTPUT_PUSH_PULL;//上拉输出
		hal_gpio_init(&led);
		
		hal_gpio_output_high(&led);
		aos_loop_run();
		
		return 0;
}

const gpio_mapping_t gpio_mapping_table[TOTAL_GPIO_NUM] =
{
    {ON_BOARD_LED01, GPIOB, GPIO_PIN_0,  /*IRQ_NULL,*/GPIO_PULLUP, GPIO_SPEED_FREQ_LOW},
    {ON_BOARD_LED02, GPIOA, GPIO_PIN_5,  /*IRQ_NULL,*/GPIO_PULLUP, GPIO_SPEED_FREQ_LOW},
    {ON_BOARD_LED03, GPIOB, GPIO_PIN_14, /*IRQ_NULL,*/GPIO_PULLUP, GPIO_SPEED_FREQ_LOW}
};

gpio_mapping_table中将LED02的管脚改成PA5.

hal_gpio_stm32f4xx.h

#define ON_BOARD_LED02 HAL_GPIO_5

下载完成后复位开发板

结果显示(LD2点亮)

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐