在点灯的时候遇到一个问题:

 GPIO_ResetBits(GPIOF,GPIO_Pin_9);  //LED0对应引脚GPIOF.9拉低,亮  等同LED0=0;GPIO_SetBits(GPIOF,GPIO_Pin_9);    //LED0对应引脚GPIOF.0拉高,灭  等同LED0=1;

为啥通过GPIO_Pin_9  这个参数就可以设置GPIOF中引脚9的高低电平呢,我找到了GPIO相应的置位和复位函数:

//复位函数 设置IO引脚为低电平,点亮led
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{/* Check the parameters */assert_param(IS_GPIO_ALL_PERIPH(GPIOx));assert_param(IS_GPIO_PIN(GPIO_Pin));GPIOx->BSRRH = GPIO_Pin;
}
//置位函数  设置IO引脚为高电平,熄灭led
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{/* Check the parameters */assert_param(IS_GPIO_ALL_PERIPH(GPIOx));assert_param(IS_GPIO_PIN(GPIO_Pin));GPIOx->BSRRL = GPIO_Pin;
}

这两段函数都是先检查传入参数的有效性,然后执行这个代码:

GPIOx->BSRRL = GPIO_Pin;

GPIO_Pin就是传入的参数,在这里其实就是调用函数时候填写的GPIO_Pin_9,那为啥填写这个就可以配置GPIOx->BSRRL寄存器呢,这也不是变量啊,怎么给寄存器GPIOx->BSRRH赋值的呢:

在如下代码位置右击,点击红框处:

就看到这个界面:

原来是通过宏定义啊:

#define GPIO_Pin_9                 ((uint16_t)0x0200)

其实换成16进制,也就是:

#define GPIO_Pin_9                0000 0010 0000 0000

再来看一下BSRR寄存器:

0000 0010 0000 0000正好就是对寄存器的第9位(BS9)写1置位,引脚9输出高电平,这个时候LED熄灭(低电平点亮); 同样,对寄存器的第25位(BR9)写1复位,引脚9输出低电平,这个时候LED点亮。

说明:置位 复位都是操作同一个寄存器,只不过分为低 16 位和高 16 位:

  • 低 16 位(0-15),我们往相应的位写 1,那么对应的 IO 口会输出高电平
  • 高 16 位(16-31)作用刚好相反,对相应的位写 1 会输出低电平

总结:STM32对宏定义的使用较多,写成这样当然也是可以的:

GPIOx->BSRRL = ((uint16_t)0x0200);

或者这样:

GPIOx->BSRRL = 0000 0010 0000 0000

但是问题就是不那么清晰明了,采用宏定义的方式给这些变量起个名字,这样一眼就可以看出这个是设置哪个引脚的,要不然还得去看手册,查寄存器:

GPIOx->BSRRL = GPIO_Pin;    //这里的GPIO_Pin 就是传入的参数GPIO_Pin_9

【STM32-宏定义】相关推荐

  1. STM32: startup_**.s、Core_cm3.c、宏定义、HAL库

    .s 启动文件选择 给STM32写程序时,我们需要在工程文件中加入厂家提供的启动文件(这里以STMf10x系列为例),里面包含的是启动代码,启动代码是一段和硬件相关的汇编代码.是必不可少的!这代码主要 ...

  2. c语言assert_param,STM32断言机制assert_param()宏定义

    我们在学STM32的时候函数assert_param出现的几率非常大,上网搜索一下,网上一般解释断言机制,做为程序开发调试阶段时使用. 下面我就谈一下我对这些应用的看法,学习东西抱着知其然也要知其所以 ...

  3. STM32的C语言重点知识(1.C语言数据类型+2.C语言宏定义+3.C语言typedef+4.C语言结构体+5.C语言枚举)

    1.C语言数据类型: 注:目的是看到stdint,如看到int8_t;uint16_t能够瞬间知道表示的是char,8字节:unsigned short,16字节. ST关键字意思是在老版本的引脚说明 ...

  4. STM32 理解宏定义的重要性

    今天做STM32F107系列单片机与ADM2587E的开发时,遇到了一个很郁闷的问题,通过串口发送数据后,单片机接收端的指示灯亮,但没我有返回值(通过接收标志发送数据).代码反反复复检查好几遍就是找不 ...

  5. 单片机\程序中的那些宏定义

    1.字符串的数据长度,用sizeof求数据长度并用宏定义表示 uint8_t  buf[]="Hello,I am STM32\r\n"; 求字符串数组buf的数据长度: uint ...

  6. 绝学:用宏定义找BUG,了解一下?

    宏打印函数 在我们的嵌入式开发中,使用printf打印一些信息是一种常用的调试手段.但是,在打印的信息量比较多的时候,就比较难知道哪些信息在哪个函数里进行打印. 特别是对于异常情况的打印,我们需要快速 ...

  7. .net 宏定义_C语言、嵌入式中一些实用的宏技巧

    宏打印函数 在我们的嵌入式开发中,使用printf打印一些信息是一种常用的调试手段.但是,在打印的信息量比较多的时候,就比较难知道哪些信息在哪个函数里进行打印. 特别是对于异常情况的打印,我们需要快速 ...

  8. MDK中利用宏定义__DATE__和__TIME__设置产品的代码固件版本

    文章目录 前言 一.__DATE__和__TIME__是什么? 二.使用步骤 1.引入库 2.参考代码 总结 前言 STM32开发中,利用宏定义的__DATE__和__TIME__设置产品的代码固件版 ...

  9. 嵌入式开发常见宏定义

    目录 一.编译器预定义的宏 二.c语言内置宏 三.实用宏定义 一.编译器预定义的宏 在stm32系列单片机里的core_cmx.h(x:0/3/4/7)头文件里有如下一段宏定义: /* define ...

  10. F429-挑战者:LED的宏定义代码

    1.LED 控制引脚相关的宏                   //引脚定义//R 红色灯 #define LED1_PIN GPIO_PIN_10 #define LED1_GPIO_PORT G ...

最新文章

  1. BeanShell中this类型引用的特殊成员
  2. vue 出现Elements in iteration expect to have 'v-bind:key' directives
  3. 查看 rabbitmq 启动websocket 提示404_RabbitMQ在windows下安装(笔记)
  4. spring boot 的使用(一)
  5. 项目改用GoModules管理依赖的方法和经验总结
  6. Codeforces Round #246 (Div. 2) D. Prefixes and Suffixe 后缀数组
  7. android activity 跳转与值
  8. 程序猿,这里有你想学的10门机器学习课程 | 资源
  9. jmx.JmxAdminException
  10. 【问题解决:死锁】Lock wait timeout exceeded; try restarting transaction的问题
  11. 操作系统学习笔记 002 安装NASM
  12. [Spring]04_最小化Spring XML配置
  13. mysql插件的初始化
  14. mysql lpad 列_mysql的lpad函数
  15. python并行编程 - GPU篇
  16. 【嵌入式Linux】开发环境搭建
  17. 浏览器基础(2)-跨域
  18. oracle sy imp,oracle逻辑备份imp/exp 示例用法【转】
  19. 凡是函数中未指定存储类型_函数中未指定存储类别的局部变量,其隐含的存储类别为()...
  20. 【buuctf】cscctf_2019_qual_babyheap

热门文章

  1. 用递归方法求n的阶乘【C语言实现】
  2. 探寻宝藏 【算法设计与分析课设】 c语言代码 + 思路详解 + 三维优化
  3. Final互评------《弹球学成语》---- 杨老师粉丝群
  4. 自适应二次元可爱萝莉音乐404页面源码
  5. MySql必练的查询语句
  6. 父亲节英文短信祝福语大全
  7. 《Class label autoencoder for zero-shot learning》阅读笔记
  8. 马化腾发大招!又一批百万富翁诞生。。。
  9. python 视频分段_Python中使用moviepy进行视频分割
  10. 3DMax怎样制作圆形吸顶灯