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

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

3天内不再提示

单片机位带牵涉的指针变量问题

jf_pJlTbmA9 来源:strongerHuang 作者:strongerHuang 2023-09-27 15:18 次阅读

之前为大家分享的《Cortex-M位带操作的原理》,虽然现在不常用位带操作了,但里面很多知识点值得学习和了解。

指针变量及例子

位带操作牵涉到的一个重要知识点就是指针变量。

这种位带映射操作,就是操作映射过后的地址,其实就是操作指针变量(存放地址的变量)。
指针变量是一种特殊的变量,它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是数据的地址。《摘自百度百科【指针变量】》
指针变量的例子:

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;

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

指针变量---位带操作

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

wKgaomUDz8eAbg41AAEpaapon1c549.jpg

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

之前文章《位带操作原理》列出了关于片上外设区计算公式:

AliasAddr = 0x42000000+(A-0x40000000)*32 + n*4
对比截图中第一个p赋的值,就是片上外设的计算公式。

第二个p只是对代码优化了:“ ”到“-”的优化,可以看编译器相关手册。
第4个p就是上一节代码中值,有没有发现,位带操作其实就操作指针变量啊?
这样相比读出寄存器,再 或者|再写入寄存器的效率要高多啦?
位带别名区最低有效位

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

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

位带操作另一种宏定义

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

wKgaomUDz8mAdg6vAACDF7HQhCU831.jpg

上面框起来的定义适合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库都有这样定义)。

来源:strongerHuang

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

审核编辑 黄宇

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

    关注

    240

    文章

    23025

    浏览量

    656227
  • 单片机
    +关注

    关注

    6029

    文章

    44480

    浏览量

    631612
  • 指针
    +关注

    关注

    1

    文章

    477

    浏览量

    70488
  • 指针变量
    +关注

    关注

    0

    文章

    17

    浏览量

    7225
收藏 人收藏

    评论

    相关推荐

    keil中单片机C编程指针变量的关系

    指针变量注:keil中单片机C编程若指针没有指向提前声明的变量,会产生混乱eg:情景一:情景二:Type *p,*q;Type *p,*q
    发表于 07-14 08:35

    在keil中单片机C编程的指针变量有何关系

    在keil中单片机C编程的指针变量有何关系?指针自身地址和指针所指地址分别是什么?
    发表于 10-19 09:30

    基于51单片机指针设计

    51单片机-指针1. 指针变量a的指针=变量a的地址再定义一个
    发表于 11-18 06:45

    单片机指针变量的相关资料分享

    单片机C语言变量分别有char型,int型,long型,float型等,它们分别占用内存为1个单元,2单元,4单元,4单元等,另外数组和字符串则占用了内存某段连续的单元。这些变量的共同特征是它们都装
    发表于 11-30 08:05

    单片机教程十四:单片机位操作指令

    单片机教程十四:单片机位操作指令 前面那些流水灯的例程,我们已经习惯了“位”一位就是一盏灯的亮和灭,而我们学的指令却全都是用“字节”
    发表于 05-15 23:09 1590次阅读

    单片机视频教程07:变量

    《手把手教你学单片机单片机视频教程07:变量 单片机视频教程07:变量 1、局部变量,在函数内
    发表于 08-21 09:35 1.2w次阅读
    <b class='flag-5'>单片机</b>视频教程07:<b class='flag-5'>变量</b>

    单片机的结构体和指针等资料说明

    本文档的主要内容详细介绍的是单片机的结构体和指针等资料说明包括了:单片机的常量,单片机变量,构造类型:数组,构造类型:结构体,构造类型:
    发表于 12-05 17:23 17次下载
    <b class='flag-5'>单片机</b>的结构体和<b class='flag-5'>指针</b>等资料说明

    单片机的常量和变量与数组的详细资料说明

    本文档的主要内容详细介绍的是单片机的常量和变量与数组的详细资料说明包括了:单片机的常量,单片机变量,构造类型:数组,构造类型:结构体,构造
    发表于 12-11 17:36 13次下载
    <b class='flag-5'>单片机</b>的常量和<b class='flag-5'>变量</b>与数组的详细资料说明

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

    指针变量,位指针,LSB最低有效位······
    的头像 发表于 03-08 11:53 2375次阅读

    教你如何轻松写单片机指针

    摘要:大家想过没有我们用keil写单片机的代码,你的函数啊、变量啊最终都放在了哪里?我们一直说的内存五区,到底是哪五区?到底放在芯片的哪个地方呢?还有为什么你学完C语言指针和结构体,32单片机
    的头像 发表于 06-17 16:08 3085次阅读
    教你如何轻松写<b class='flag-5'>单片机</b>的<b class='flag-5'>指针</b>

    51单片机-指针方法-串口实例

    51单片机-指针1. 指针变量a的指针=变量a的地址再定义一个
    发表于 11-12 09:51 33次下载
    51<b class='flag-5'>单片机</b>-<b class='flag-5'>指针</b>方法-串口实例

    单片机C语言之指针变量

    单片机C语言变量分别有char型,int型,long型,float型等,它们分别占用内存为1个单元,2单元,4单元,4单元等,另外数组和字符串则占用了内存某段连续的单元。这些变量的共同特征是它们都装
    发表于 11-21 09:06 15次下载
    <b class='flag-5'>单片机</b>C语言之<b class='flag-5'>指针</b><b class='flag-5'>变量</b>

    STM32位带引申的指针变量问题

    位带操作牵涉到的一个重要知识点就是指针变量。这种位映射操作,就是操作映射过后的地址,其实就是操作指针
    发表于 02-08 15:57 3次下载
    STM32位带引申的<b class='flag-5'>指针</b><b class='flag-5'>变量</b>问题

    单片机指针变量及例子

    这种位映射操作,就是操作映射过后的地址,其实就是操作指针变量(存放地址的变量)。 指针变量
    发表于 12-29 13:52 711次阅读

    指针能不能作为循环变量

    指针能不能作为循环变量
    的头像 发表于 02-16 18:11 985次阅读