1.LED 控制引脚相关的宏                  

//引脚定义//R 红色灯
#define LED1_PIN                    GPIO_PIN_10
#define LED1_GPIO_PORT              GPIOH
#define LED1_GPIO_CLK_ENABLE()      __GPIOH_CLK_ENABLE()//G 绿色灯
#define LED2_PIN                    GPIO_PIN_11
#define LED2_GPIO_PORT              GPIOH
#define LED2_GPIO_CLK_ENABLE()      __GPIOH_CLK_ENABLE()//B 蓝色灯
#define LED3_PIN                     GPIO_PIN_12
#define LED3_GPIO_PORT               GPIOH
#define LED3_GPIO_CLK_ENABLE()       __GPIOH_CLK_ENABLE()
        以上代码分别把控制 LED 灯的 GPIO 端口、GPIO 引脚号以及 GPIO 端口时钟封装起来了。在实际控制的时候我们就直接用这些宏,以达到应用代码跟硬件无关的效果。
2 .控制 LED 灯亮灭状态的宏定义
        这部分宏控制 LED 亮灭的操作是直接向 BSRR 寄存器写入控制指令来实现的,对 BSRR 低 16 位 写 1 输出高电平,对 BSRR 高 16 位写 1 输出低电平,对 ODR 寄存器某位进行异或操作可反转位 的状态。
        RGB 彩灯可以实现混色,如最后一段代码我们控制红灯和绿灯亮而蓝灯灭,可混出黄色效果。

/** 控制 LED 灯亮灭的宏,
* LED 低电平亮,设置 ON=0,OFF=1
* 若 LED 高电平亮,把宏设置成 ON=1 ,OFF=0 即可
*/
#define ON     GPIO_PIN_RESET
#define OFF    GPIO_PIN_SET/* 带参宏,可以像内联函数一样使用 */
#define LED1(a)     HAL_GPIO_WritePin(LED1_GPIO_PORT,LED1_PIN,a)
#define LED2(a)     HAL_GPIO_WritePin(LED2_GPIO_PORT,LED2_PIN,a)
#define LED3(a)     HAL_GPIO_WritePin(LED2_GPIO_PORT,LED3_PIN,a)/* 直接操作寄存器的方法控制 IO */
#define digitalHi(p,i)         {p->BSRR=i;} //设置为高电平
#define digitalLo(p,i)         {p->BSRR=(uint32_t)i << 16;} //输出低电平
#define digitalToggle(p,i)     {p->ODR ^=i;} //输出反转状态/* 定义控制 IO 的宏 */
#define LED1_TOGGLE       digitalToggle(LED1_GPIO_PORT,LED1_PIN)
#define LED1_OFF          digitalHi(LED1_GPIO_PORT,LED1_PIN)
#define LED1_ON           digitalLo(LED1_GPIO_PORT,LED1_PIN)#define LED2_TOGGLE       digitalToggle(LED2_GPIO_PORT,LED2_PIN)
#define LED2_OFF          digitalHi(LED2_GPIO_PORT,LED2_PIN)
#define LED2_ON           digitalLo(LED2_GPIO_PORT,LED2_PIN)#define LED3_TOGGLE       digitalToggle(LED3_GPIO_PORT,LED3_PIN)
#define LED3_OFF          digitalHi(LED3_GPIO_PORT,LED3_PIN)
#define LED3_ON           digitalLo(LED3_GPIO_PORT,LED3_PIN)/* 基本混色,后面高级用法使用 PWM 可混出全彩颜色, 且效果更好 *///红
#define LED_RED \LED1_ON;\LED2_OFF\LED3_OFF//绿
#define LED_GREEN \LED1_OFF;\LED2_ON\LED3_OFF//蓝
#define LED_BLUE \LED1_OFF;\LED2_OFF\LED3_ON//黄 (红 + 绿)
#define LED_YELLOW \LED1_ON;\LED2_ON\LED3_OFF//紫 (红 + 蓝)
#define LED_PURPLE \LED1_ON;\LED2_OFF\LED3_ON//青 (绿 + 蓝)
#define LED_CYAN \LED1_OFF;\LED2_ON\LED3_ON//白 (红 + 绿 + 蓝)
#define LED_WHITE \LED1_ON;\LED2_ON\LED3_ON//黑 (全部关闭)
#define LED_RGBOFF \LED1_OFF;\LED2_OFF\LED3_OFF

3.LED GPIO 初始化函数
        整个函数与“构建库函数雏形”章节中的类似,主要区别是硬件相关的部分使用宏来代替,初始
化 GPIO 端口时钟时也采用了 STM32 库函数,函数执行流程如下:
(1) 使用 GPIO_InitTypeDef 定义 GPIO 初始化结构体变量,以便下面用于存储 GPIO 配置。
(2) 调用宏定义函数 LED1_GPIO_CLK_ENABLE() 来使能 LED 灯的 GPIO 端口时钟,在前面的章
节中我们是直接向 RCC 寄存器赋值来使能时钟的,不如这样直观。该函数在 HAL 库里边将操作
寄存器部分封装起来,直接调用宏即可。
(3) 向 GPIO 初始化结构体赋值,把引脚初始化成推挽输出模式,其中的 GPIO_PIN 使用宏“LEDx_PIN”来赋值,使函数的实现方便移植。

(4) 使用以上初始化结构体的配置,调用 HAL_GPIO_Init 函数向寄存器写入参数,完成 GPIO 的
初始化,这里的 GPIO 端口使用“LEDx_GPIO_PORT”宏来赋值,也是为了程序移植方便。
(5) 使用同样的初始化结构体,只修改控制的引脚和端口,初始化其它 LED 灯使用的 GPIO 引
脚。
(6) 使用宏控制 RGB 灯默认关闭。
void LED_GPIO_Config(void) {/* 定义一个 GPIO_InitTypeDef 类型的结构体 */GPIO_InitTypeDef  GPIO_InitStruct;/* 开启 LED 相关的 GPIO 外设时钟 */LED1_GPIO_CLK_ENABLE();LED2_GPIO_CLK_ENABLE();LED3_GPIO_CLK_ENABLE();/* 选择要控制的 GPIO 引脚 */GPIO_InitStruct.Pin = LED1_PIN;/* 设置引脚的输出类型为推挽输出 */GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;/* 设置引脚为上拉模式 */GPIO_InitStruct.Pull = GPIO_PULLUP;/* 设置引脚速率为高速 */GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;/* 调用库函数,使用上面配置的 GPIO_InitStructure 初始化 GPIO*/HAL_GPIO_Init (LED1_GPIO_PORT, &GPIO_InitStruct);/* 选择要控制的 GPIO 引脚 */GPIO_InitStruct.Pin = LED2_PIN;HAL_GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStruct);/* 选择要控制的 GPIO 引脚 */GPIO_InitStruct.Pin = LED3_PIN;HAL_GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStruct);/* 关闭 RGB 灯 */LED_RGBOFF;}

4.主函数

编写完 LED 灯的控制函数后,就可以在 main 函数中测试了。在 main 函数中,调用 SystemClock_Confifig 函数初始化系统的时钟。F429-挑战者的为 180MHz,所有程序都必须设置好系统的时钟再进行其他操作。接着调用我们前面定义的 LED_GPIO_Confifig 初始化好 LED 的控制引脚,然后直接调用各种控制 LED 灯亮灭的宏来实现 LED 灯的控制,延时采用库自带基于滴答时钟延时 HAL_Delay 单位为 ms,直接调用即可,这里 HAL_Delay(1000) 表示延时 1s。

以上,就是一个使用 STM32 HAL 软件库开发应用的流程。

int main(void){/* 系统时钟初始化成 216 MHz */SystemClock_Config();/* LED 端口初始化 */LED_GPIO_Config();/* 控制 LED 灯 */while (1){LED1( ON ); // 亮HAL_Delay(1000);LED1( OFF ); // 灭HAL_Delay(1000);LED2( ON ); // 亮HAL_Delay(1000);LED2( OFF ); // 灭LED3( ON ); // 亮HAL_Delay(1000);LED3( OFF ); // 灭/* 轮流显示 红绿蓝黄紫青白 颜色 */LED_RED;HAL_Delay(1000);LED_GREEN;HAL_Delay(1000);LED_BLUE;HAL_Delay(1000);LED_YELLOW;HAL_Delay(1000);LED_PURPLE;HAL_Delay(1000);LED_CYAN;HAL_Delay(1000);LED_WHITE;HAL_Delay(1000);LED_RGBOFF;HAL_Delay(1000);}
}

F429-挑战者:LED的宏定义代码相关推荐

  1. C语言函数调用及宏定义代码实例

    函数 #include<stdio.h>int square(int x); int square(int x){return x * x; }/*** 求x的平方*/ int main( ...

  2. 如何用#define宏定义多行函数

    在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定义.那么究竟是用函数好,还是宏定义好?这就要求我们对二者进行合理的取舍.     首先,函数调用会带 ...

  3. C/C++宏定义中#与##区别 .

    // #表示:对应变量字符串化 // ##表示:把宏参数名与宏定义代码序列中的标识符连接在一起,形成一个新的标识符 #define U_BOOT_CMD_MKENT_COMPLETE(name,max ...

  4. C/C++ 宏定义中#、##、#@的区别

    #表示:对应变量字符串化 ##表示:把宏参数名与宏定义代码序列中的标识符连接在一起,形成一个新的标识符 连接符#@:它将单字符标记符变换为单字符,即加单引号.例如: #define B(x) #@x ...

  5. 【转】C语言中DEFINE简介及多行宏定义

    要写好C语言,漂亮的宏定义是非常重要的.宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定 ...

  6. 转 C++宏定义详解

    来自:传送门 C++宏定义详解 一.#define的基本用法 #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往 ...

  7. C语言中宏定义和函数的取舍

    要写好C语言,漂亮的宏定义是非常重要的.宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定 ...

  8. 函数宏定义 与函数自定义

    为什么在C语言中要有函数宏定义这种形式呢?宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏 ...

  9. define宏定义函数及用模板函数实现同样的功能

    最近在看别人的代码的过程中,发现了宏定义代码,由于自己这块之前没有用过,所以编写了示例程序,学习一下宏定义代码. 比如我们现在有一个需求,要实现两个数字交换,这两个数字可能是整型,浮点型或者其他类型, ...

最新文章

  1. Slack推安全企业加密管理可轻易用密钥控制数据
  2. 机器学习-梯度下降算法原理及公式推导
  3. 二维模式(矩阵)匹配(Rabin-Karp算法推广到二维)[转]
  4. find命令的xargs参数的使用---Linux学习笔记
  5. Opencv——图像金字塔与图像尺寸缩放
  6. Linux shell中在vim打开的文件中查找关键字
  7. 【Elasticsearch】Elasticsearch 集群协调迎来新时代
  8. c# 操作redisclient 设置过期时间_C# Redis分布式锁 单节点
  9. 锁失效_分布式锁的解决方案(二)
  10. java报错: 类重复: newemission.calculate_java当中的继承(一)
  11. 使用SAXReader所需jar包
  12. html font文本颜色 字体 大小标签元素
  13. Nik Collection 5 Mac,最新PS滤镜插件套装
  14. 基金投资入门1:基金基础知识介绍
  15. 计算机桌面背景在哪里调整,电脑中怎么设置桌面背景
  16. 如何保持精力充沛_在家工作,如何管理一支精力充沛,精力充沛的日常团队,远程站起来...
  17. weui popup的使用
  18. 机器学习笔记:随机深度网络 stochastic depth
  19. 网络库libevent、libev、libuv、libhv对比
  20. bom成本分析模型_各位成本会计,请问用BOM表算成本的大致思路是什么?

热门文章

  1. ATI图形芯片ABC
  2. android代码流分析工具,视频码流分析工具(Elecard StreamAnalyzer)下载 v4.0.171116 官方版 - 比克尔下载...
  3. Python 通过adb传输文件到手机
  4. Linux常用命令 -- lsblk(简单易学)
  5. SIP–eyebeam配置手册
  6. Java学生信息管理系统(增、删、改、查)
  7. MAC电脑 安全与隐私 中没有任何来源选项怎么办
  8. Ubuntu 暂时不能解析域名及解决办法
  9. iOS设备播放mkv格式视频无声音解决
  10. Json接口代码生成工具-Json2Code