1. 前言
本次实验是在第一篇的基础上进行功能扩展,要实现的是点亮板子上的LED。
2. 工程模板移植
- 将【Template】工程文件夹copy为另一个工程文件夹【LightLED】
- 更改工程名字:Template –> LightLED
然后双击打开工程。
- 根据工程名重新管理工程
- 配置工程编译输出文件的名称
如果要编译生成hex文件,则讲途中圈起来的【Create HEX File】这一项勾选上。
- 设置调试器
因为工程模板是将配置文件和编译输出文件全部删除掉的,所以需要重新设置下调试器选项,步骤就不再重复说明了。
- 验证编译
为确保移植过来的默认设置没有问题,上面的设置好了之后最好先编译一次。
3. 编写LED的驱动
3.1 新建LED的驱动源文件和头文件
新建文件、保存文件以及添加至工程不再赘述。
3.2 编写LED驱动的头文件
我习惯在头文件中对外设硬件驱动的引脚、时钟、硬件名称等,用宏定义的方式在头文件中定义,所以这里我将LED的GPIO相关信息定义到头文件中,而LED的GPIO是哪些我们可以通过板子的原理图获知:
序号 | LED | 引脚 |
---|---|---|
1 | RED | PA15 |
2 | GREEN | PB3 |
3 | BLUE | PB4 |
4 | YELLOW | PB5 |
根据原理图可知,GPIO输出低电平的时候,发光二极管导通发亮,输出高电平的时候熄灭,所以我们在头文件中进行了如下宏定义:
1 | /* driver_led.h */ |
3.3 编写LED驱动的源文件
- LED的驱动源文件需要知道LED的引脚,所以需要包含我们自己新建的【driver_led.h】;
- 需要使能LED的GPIO的时钟,所以需要包含HAL库文件【hal_rcc.h】;
- 需要初始化LED的GPIO,调用的是【hal_gpio.c】里面的函数,所以需要包含【hal_gpio.h】;
1 |
编写LED的驱动一般步骤是:
- 使能GPIO的时钟;
- 初始化GPIO为输出模式(推挽输出);
- 封装LED的输出控制接口;
- 初始化LED的GPIO
1 | void Driver_LED_Init(void) |
其中对于绿灯的引脚PB3,需要将其复用做普通GPIO。
- 封装LED的写控制接口
为了便于后续向平台层封装,我们将LED的写控制接口函数名称统一为Driver_LED_Write
,考虑到要控制的LED可能不止一个,因而使用了枚举类型将所有的LED类型整合在了一起放到了头文件:
1 | typedef enum{ |
那么封装的接口函数实现如下:
1 | void Driver_LED_Write(LED_Type type, LED_Status status) |
然后将初始化函数接口和写控制接口在头文件中声明,方便别的源文件调用:
1 | void Driver_LED_Init(void); |
4. 验证
4.1 main函数调用LED接口
- 要调用LED的驱动接口,就需要包含其驱动头文件【driver_led.h】;
- 在main函数中首先调用初始化LED的函数;
- 然后再调用LED的写控制接口控制LED;
1 |
|
4.2 编译烧录
代码编写完毕之后,就可以编译看下是否有严重的警告或者错误,如果编译通过了,则可以使用调试器在线调试或者直接烧录到板子上查看现象。
- 本文作者: 摘星星的小朋友
- 本文链接: http://slhking.github.io/2022/05/07/MM32-2-LightLED/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!