0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

指针变量, 位带指针 ,LSB最低有效位 ······

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-08 11:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

主要内容:

1.指针变量及例子

2.指针变量---位带操作

3.位带别名区最低有效位

4.位带操作另一种宏定义

1指针变量及例子

前面文章【STM32位带操作】牵涉到的一个重要知识点就是指针变量。

这种位带映射操作,就是操作映射过后的地址,其实就是操作指针变量。

指针变量:指存放地址的变量。

指针变量是一种特殊的变量,它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是数据的地址。《摘自百度百科【指针变量】》

指针变量的例子

intmain(void){ uint32_t *p; p = (uint32_t *)(0x42210184); System_Initializes(); while(1) { *p =0; TIMDelay_Nms(500); *p =1; TIMDelay_Nms(500); }}

上面例子中给p指针变量赋的值是“0x42210184”,只是强制转换成(uint32_t *)这种指针类型。

而*p = 0;代表该地址上的数据值为0;也就是上面说的该地址存放的数据为0;

前面有一个朋友问过我关于指针变量的问题,看到这里,相信你应该知道使用指针变量,直接打印指针就可以判断指针是否越界。

2指针变量---位带操作

上面代码中“0x42210184”代表STM32F103系列芯片中PA1的位带别名地址(就是映射过去的地址),截一个图,大家看看:

提示:上图中对p的赋值,其实是一样的(在STM32中),都是0x42210184。

结合公式理解

上一篇文章【STM32位带操作】列出了关于片上外设区计算公式:

AliasAddr = 0x42000000+(A-0x40000000)*32 + n*4

对比截图中第一个p赋的值,就是片上外设的计算公式。

第二个p只是对代码优化了:“&”到“-”的优化,可以看编译器相关手册。

第4个p就是上一节代码中值,有没有发现,位带操作其实就操作指针变量啊?

这样相比读出寄存器,再&或者|再写入寄存器的效率要高多啦?

3位带别名区最低有效位

有朋友发现,*p = 0;这样操作对地址0x42210184(PA1输出)写入0,PA1输出低。假如我写入0x10,那么PA1输出多少呢?

答案:输出低。

原因在于:在位带区中,每个比特都映射到别名地址区的一个字只有 LSB 有效,也就是最低一位有效。

4位带操作另一种宏定义

有通过昨天的两个公式,可以推出下图的公式:

上面框起来的定义适合RAM和外设两种,假如定义一个LED为PA1,只需要将PA1相关参数传入即可。

LED另外一种定义:

#define LED BIT_ADDR((GPIOA_BASE+ 12),1)

这种定义需要注意:+12,其实是ODR相对GPIOA的基地址的偏移地址。

我曾在这里遇到的坑:我将STM32F1的移植到F4上,出现了问题,我找了半天才发现由于这个偏移地址不一样导致的。

STM32F1的ODR偏移是12,而F4的ODR偏移是20。所以,建议大家使用GPIOA->ODR这种方式。(不管是标准外设库还是HAL库都有这样定义)。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2305

    文章

    11120

    浏览量

    371046
  • LSB
    LSB
    +关注

    关注

    0

    文章

    42

    浏览量

    13664
  • 指针变量
    +关注

    关注

    0

    文章

    17

    浏览量

    7353
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    带操作的分析

    个字节,“*8”表示一个字节中有8个比特。 四、读写操作的机制 在位区中,虽然每个比特都映射到别名区的一个字,但别名区的字只有LSB最低
    发表于 11-18 07:01

    C指针的妙用分享

    1、你知道吗?指针其实是个天生的数学家!看这个: #include int main() { int arr[] = {10, 20, 30, 40, 50}; int *p = arr
    发表于 11-17 06:35

    GPIO输出操作的几种方法分享

    权威指南》第五章,第5小节 带操作(87页~92页)。   为简化带操作,可以定义一些宏。比如,我们可以建立一个把“地址+序号
    发表于 11-13 07:50

    rt_tick_increase 引用指针变量未判断其是否为空?

    指针变量使用之前没有判断是否为空,万一rt_system_scheduler_start此函数调用之前来滴答定时器的中断了,这样操作是不是会有风险
    发表于 10-09 08:07

    GaAs 数字衰减器 5 、1 dB LSB 400 MHz-4 GHz skyworksinc

    电子发烧友网为你提供()GaAs 数字衰减器 5 、1 dB LSB 400 MHz-4 GHz相关产品参数、数据手册,更有GaAs 数字衰减器 5 、1 dB LSB 400 M
    发表于 05-26 18:33
    GaAs 数字衰减器 5 <b class='flag-5'>位</b>、1 dB <b class='flag-5'>LSB</b> 400 MHz-4 GHz skyworksinc

    驱动器的 10 MHz - 1.0 GHz 六数字衰减器(0.5 dB LSB,31.5 dB 范围) skyworksinc

    电子发烧友网为你提供()驱动器的 10 MHz - 1.0 GHz 六数字衰减器(0.5 dB LSB,31.5 dB 范围)相关产品参数、数据手册,更有驱动器的 10 MHz
    发表于 05-26 18:32
    <b class='flag-5'>带</b>驱动器的 10 MHz - 1.0 GHz 六<b class='flag-5'>位</b>数字衰减器(0.5 dB <b class='flag-5'>LSB</b>,31.5 dB 范围) skyworksinc

    0.1-3.0 GHz 四数字衰减器 (1 dB LSB) skyworksinc

    电子发烧友网为你提供()0.1-3.0 GHz 四数字衰减器 (1 dB LSB)相关产品参数、数据手册,更有0.1-3.0 GHz 四数字衰减器 (1 dB LSB)的引脚图、接
    发表于 05-26 18:29
    0.1-3.0 GHz 四<b class='flag-5'>位</b>数字衰减器 (1 dB <b class='flag-5'>LSB</b>) skyworksinc

    0.7-4.0 GHz 五数字衰减器,串转并行驱动器 (0.5 dB LSB) skyworksinc

    电子发烧友网为你提供()0.7-4.0 GHz 五数字衰减器,串转并行驱动器 (0.5 dB LSB)相关产品参数、数据手册,更有0.7-4.0 GHz 五数字衰减器,
    发表于 05-23 18:31
    0.7-4.0 GHz 五<b class='flag-5'>位</b>数字衰减器,<b class='flag-5'>带</b>串转并行驱动器 (0.5 dB <b class='flag-5'>LSB</b>) skyworksinc

    DC-3.0 GHz 六数字衰减器,串行或并行驱动器 (0.5 dB LSB) skyworksinc

    电子发烧友网为你提供()DC-3.0 GHz 六数字衰减器,串行或并行驱动器 (0.5 dB LSB)相关产品参数、数据手册,更有DC-3.0 GHz 六数字衰减器,
    发表于 05-23 18:31
    DC-3.0 GHz 六<b class='flag-5'>位</b>数字衰减器,<b class='flag-5'>带</b>串行或并行驱动器 (0.5 dB <b class='flag-5'>LSB</b>) skyworksinc

    函数指针的六个常见应用场景

    函数指针在嵌入式开发中有着广泛的应用,它让代码更加灵活,减少冗余,提高可扩展性。很多时候,我们需要根据不同的情况动态调用不同的函数,而函数指针正是实现这一需求的重要工具。本文将介绍六个常见的函数指针
    的头像 发表于 04-07 11:58 1117次阅读
    函数<b class='flag-5'>指针</b>的六个常见应用场景

    RTOS中的本地存储指针使用

    本地存储指针是RTOS中的一个重要特性,增强了任务管理和数据处理能力。在RTOS上下文中,本地存储是指存储在本地的特定任务或对象的数据。通常与任务本地存储(Task Local Storage,TLS)有关,其中数据存储在任务控制块(TCB)中,允许每个任务具有私有的、特定于任务的
    的头像 发表于 02-28 16:33 1164次阅读
    RTOS中的本地存储<b class='flag-5'>指针</b>使用

    指针式万用表功能介绍

    在电子工程和电气维修领域,万用表是不可或缺的工具之一。它能够快速测量电路中的电压、电流和电阻等参数,帮助工程师和技术人员诊断和修复电路问题。 指针式万用表的基本原理 指针式万用表的工作原理
    的头像 发表于 01-23 09:12 3922次阅读

    指针式万用表使用指南

    一、指针式万用表简介 指针式万用表是一种传统的电子测量工具,因其表头指针的摆动来显示测量结果而得名。与数字万用表相比,指针式万用表在某些情况下能提供更直观的读数,尤其是在测量快速变化的
    的头像 发表于 01-22 17:25 3261次阅读

    指针式万用表测量精度比较

    指针式万用表的核心是一个可变电阻器(分压器)和一个可动的指针。当测量电压或电流时,通过分压器的电阻值会改变,从而改变通过指针的电流,使指针在刻度盘上移动。
    的头像 发表于 01-22 17:23 2320次阅读

    指针被释放后就变成了空指针

    指针被释放后,是不是就变成了空指针?有好多同学提出了这样的问题。 借用《C专家编程》上面的一段代码,可以很好的解释这个问题。     #include int main(){ char *s
    的头像 发表于 01-22 09:23 645次阅读