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
    +关注

    关注

    2270

    文章

    10895

    浏览量

    355728
  • LSB
    LSB
    +关注

    关注

    0

    文章

    37

    浏览量

    13252
  • 指针变量
    +关注

    关注

    0

    文章

    17

    浏览量

    7231
收藏 人收藏

    评论

    相关推荐

    ADS1282是32ADC,在计算对纹波要求的时候,LSB按照32计算,还是按照有效位数计算?

    ADS1282是32ADC,那么在计算对纹波要求的时候,LSB按照32计算,还是按照有效位数计算(有效位数才20
    发表于 12-04 08:36

    C语言指针运算符详解

    在C语言中,当你有一个指向数组中某个元素的指针时,你可以对该指针执行某些算术运算,例如加法或减法。这些运算可以用来遍历数组中的元素,如ptr[i]等价于*(ptr + i)。然而,如果你的操作使得指针指向了数组以外的位置(除了数
    的头像 发表于 10-30 11:16 237次阅读

    C语言指针详细解析

    的使用全局变量也能解决这个问题。 函数指针 函数指针是指指针的函数,函数指针的本质是一个
    发表于 09-14 10:03

    面试常考+1:函数指针指针函数、数组指针指针数组

    在嵌入式开发领域,函数指针指针函数、数组指针指针数组是一些非常重要但又容易混淆的概念。理解它们的特性和应用场景,对于提升嵌入式程序的效率和质量至关重要。一、
    的头像 发表于 08-10 08:11 825次阅读
    面试常考+1:函数<b class='flag-5'>指针</b>与<b class='flag-5'>指针</b>函数、数组<b class='flag-5'>指针</b>与<b class='flag-5'>指针</b>数组

    DACx0004四通道16、14、121LSB INL缓冲电压输出数模转换器数据表

    电子发烧友网站提供《DACx0004四通道16、14、121LSB INL缓冲电压输出数模转换器数据表.pdf》资料免费下载
    发表于 07-26 09:17 0次下载
    DACx0004四通道16<b class='flag-5'>位</b>、14<b class='flag-5'>位</b>、12<b class='flag-5'>位</b>1<b class='flag-5'>LSB</b> INL缓冲电压输出数模转换器数据表

    DACx0502双通道16、14和12 1LSB INL电压输出DAC数据表

    电子发烧友网站提供《DACx0502双通道16、14和12 1LSB INL电压输出DAC数据表.pdf》资料免费下载
    发表于 07-23 10:55 1次下载
    DACx0502双通道16<b class='flag-5'>位</b>、14<b class='flag-5'>位</b>和12<b class='flag-5'>位</b> 1<b class='flag-5'>LSB</b> INL电压输出DAC数据表

    面试中的高频问题:指针函数与函数指针,你能完美应对吗?

    的内存分析,彻底让大家明白指针的本质。建议大家静下心来再复习一遍。一、指针变量首先要明白指针是一个变量,为此写了如下代码来验证之:运行后可以
    的头像 发表于 06-22 08:11 1703次阅读
    面试中的高频问题:<b class='flag-5'>指针</b>函数与函数<b class='flag-5'>指针</b>,你能完美应对吗?

    指针式万用表的使用方法

    的机械调零螺钉,使指针与零刻度线重合。欧姆调零则是在测量电阻前对电阻档进行电气零校准,通过调整欧姆档零调节旋钮,使指针指在欧姆标度尺零
    的头像 发表于 05-09 18:23 1797次阅读

    STM32函数地址赋值给变量后结果会自动加1是怎么回事?

    保持为1,否则会进入故障。而常用的BX指令会导致T标志清零,但如果BX REG指令中目标地址的LSB最低有效)为1则不会清零T标志。看
    发表于 04-03 06:04

    字符型、指针型等变量等该如何初始化

     对于数值类型的变量往往初始化为0,但对于其他类型的变量,如字符型、指针型等变量等该如何初始化呢?
    的头像 发表于 03-18 11:02 1433次阅读

    函数指针与回调函数的应用实例

    通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。 函数指针可以像一般函数一样,用于调用函数、传递参数。
    的头像 发表于 03-07 11:13 399次阅读
    函数<b class='flag-5'>指针</b>与回调函数的应用实例

    C语言的指针用法

    C语言编程中善用指针可以简化一些任务的处理,而对于一些任务(比如动态内存分配),必须要有指针才行的。也就是说精通C指针编程是很有必要的,帮助你成为一名优秀的Cer。
    发表于 03-05 14:22 346次阅读
    C语言的<b class='flag-5'>指针</b>用法

    怎么理解指针指针

    怎么理解指针指针?其实这个概念并不难,只是把它放到实际应用中,容易造成困扰。
    的头像 发表于 02-23 16:46 1170次阅读
    怎么理解<b class='flag-5'>指针</b>的<b class='flag-5'>指针</b>?

    结构体与指针的关系

    在C语言中,结构体(Struct)是一种用户自定义的数据类型,它允许您将不同类型的数据项组合在一起,以便形成一个更复杂的数据结构。结构体可以包含多个成员变量,每个成员变量可以是不同的数据类型。而结构
    的头像 发表于 01-11 08:00 980次阅读
    结构体与<b class='flag-5'>指针</b>的关系

    函数指针指针函数是不是一个东西?

    函数指针的本质是指针,就跟整型指针、字符指针一样,函数指针指向的是一个函数。
    的头像 发表于 01-03 16:35 525次阅读
    函数<b class='flag-5'>指针</b>和<b class='flag-5'>指针</b>函数是不是一个东西?