F429-挑战者:LED的宏定义代码
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 灯亮灭的宏,
* 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
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的宏定义代码相关推荐
- C语言函数调用及宏定义代码实例
函数 #include<stdio.h>int square(int x); int square(int x){return x * x; }/*** 求x的平方*/ int main( ...
- 如何用#define宏定义多行函数
在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定义.那么究竟是用函数好,还是宏定义好?这就要求我们对二者进行合理的取舍. 首先,函数调用会带 ...
- C/C++宏定义中#与##区别 .
// #表示:对应变量字符串化 // ##表示:把宏参数名与宏定义代码序列中的标识符连接在一起,形成一个新的标识符 #define U_BOOT_CMD_MKENT_COMPLETE(name,max ...
- C/C++ 宏定义中#、##、#@的区别
#表示:对应变量字符串化 ##表示:把宏参数名与宏定义代码序列中的标识符连接在一起,形成一个新的标识符 连接符#@:它将单字符标记符变换为单字符,即加单引号.例如: #define B(x) #@x ...
- 【转】C语言中DEFINE简介及多行宏定义
要写好C语言,漂亮的宏定义是非常重要的.宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定 ...
- 转 C++宏定义详解
来自:传送门 C++宏定义详解 一.#define的基本用法 #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往 ...
- C语言中宏定义和函数的取舍
要写好C语言,漂亮的宏定义是非常重要的.宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定 ...
- 函数宏定义 与函数自定义
为什么在C语言中要有函数宏定义这种形式呢?宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏 ...
- define宏定义函数及用模板函数实现同样的功能
最近在看别人的代码的过程中,发现了宏定义代码,由于自己这块之前没有用过,所以编写了示例程序,学习一下宏定义代码. 比如我们现在有一个需求,要实现两个数字交换,这两个数字可能是整型,浮点型或者其他类型, ...
最新文章
- Slack推安全企业加密管理可轻易用密钥控制数据
- 机器学习-梯度下降算法原理及公式推导
- 二维模式(矩阵)匹配(Rabin-Karp算法推广到二维)[转]
- find命令的xargs参数的使用---Linux学习笔记
- Opencv——图像金字塔与图像尺寸缩放
- Linux shell中在vim打开的文件中查找关键字
- 【Elasticsearch】Elasticsearch 集群协调迎来新时代
- c# 操作redisclient 设置过期时间_C# Redis分布式锁 单节点
- 锁失效_分布式锁的解决方案(二)
- java报错: 类重复: newemission.calculate_java当中的继承(一)
- 使用SAXReader所需jar包
- html font文本颜色 字体 大小标签元素
- Nik Collection 5 Mac,最新PS滤镜插件套装
- 基金投资入门1:基金基础知识介绍
- 计算机桌面背景在哪里调整,电脑中怎么设置桌面背景
- 如何保持精力充沛_在家工作,如何管理一支精力充沛,精力充沛的日常团队,远程站起来...
- weui popup的使用
- 机器学习笔记:随机深度网络 stochastic depth
- 网络库libevent、libev、libuv、libhv对比
- bom成本分析模型_各位成本会计,请问用BOM表算成本的大致思路是什么?
热门文章
- ATI图形芯片ABC
- android代码流分析工具,视频码流分析工具(Elecard StreamAnalyzer)下载 v4.0.171116 官方版 - 比克尔下载...
- Python 通过adb传输文件到手机
- Linux常用命令 -- lsblk(简单易学)
- SIP–eyebeam配置手册
- Java学生信息管理系统(增、删、改、查)
- MAC电脑 安全与隐私 中没有任何来源选项怎么办
- Ubuntu 暂时不能解析域名及解决办法
- iOS设备播放mkv格式视频无声音解决
- Json接口代码生成工具-Json2Code