打印
[其他]

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

[复制链接]
692|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 豌豆爹 于 2023-3-14 10:34 编辑

指针变量及例子

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


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


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


指针变量的例子:

int main(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的位带别名地址(就是映射过去的地址),截一个图给大家看看:



提示:上图中对p的赋值,其实是一样的(在STM32中),都是0x42210184。
结合公式理解:
在之前的文章《Cortex-M位带操作的原理》中,列出了关于片上外设区计算公式:
AliasAddr = 0x42000000+(A-0x40000000)*32 + n*4
对比截图中第一个p赋的值,就是片上外设的计算公式。
第二个p只是对代码优化了:“&”到“-”的优化,可以看编译器相关手册。
第4个p就是上一节代码中值,有没有发现,位带操作其实就操作指针变量啊?
这样相比读出寄存器,再&或者|再写入寄存器的效率要高多啦?

位带别名区最低有效位

可能有朋友会发现,*p = 0;这样操作对地址0x42210184(PA1输出)写入0,PA1输出低。假如我写入0x10,那么PA1输出多少呢?
答案:输出低。
原因在于:在位带区中,每个比特都映射到别名地址区的一个字只有LSB有效,也就是最低一位有效。

位带操作另一种宏定义

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



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

使用特权

评论回复
沙发
AdaMaYun| | 2023-3-14 15:57 | 只看该作者
指针变量是指存放地址的变量。因地址的改变而做出指定性质的衡量变法。

使用特权

评论回复
板凳
tpgf| | 2023-4-13 10:02 | 只看该作者
位带操作,指的就是单独对一个bit位进行读和写

使用特权

评论回复
地板
heimaojingzhang| | 2023-4-13 13:15 | 只看该作者
位带操作过程中硬件层面不允许被中断线程打断

使用特权

评论回复
5
keaibukelian| | 2023-4-13 14:32 | 只看该作者
用位带别名区,把位带区的地址映射到别名区,修改别名区的内容就等于修改了位带区地址里的内容

使用特权

评论回复
6
paotangsan| | 2023-4-13 15:53 | 只看该作者
我们想设置一个GPIO口时,可以用库函数已经封装好地址的GPIO->ODR,传入要操作的位即可

使用特权

评论回复
7
renzheshengui| | 2023-4-13 16:25 | 只看该作者
无论是位带写还是读,编译到汇编指令时,位带操作对于直接操作寄存器都会少一个指令

使用特权

评论回复
8
wakayi| | 2023-4-13 16:42 | 只看该作者
当你使用位带功能时,要访问的变量必须用 volatile 来修饰,因为 C 编译器并不知道同一个比特可以有两个地址

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

508

主题

1941

帖子

5

粉丝