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

之前为大家分享的《cortex-m位带操作的原理》,虽然现在不常用位带操作了,但里面很多知识点值得学习和了解。
指针变量及例子
位带操作牵涉到的一个重要知识点就是指针变量。
这种位带映射操作,就是操作映射过后的地址,其实就是操作指针变量(存放地址的变量)。
指针变量是一种特殊的变量,它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是数据的地址。《摘自百度百科【指针变量】》
指针变量的例子:
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。
结合公式理解:
之前文章《位带操作原理》列出了关于片上外设区计算公式:
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库都有这样定义)。
来源:strongerhuang
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。


基于Linux操作系统和ARM处理器实现数据通信系统的设计
商汤科技领跑2022年AI软件市场,多个领域蝉联市场第一
SEER模拟情绪表达机器人:可同步追踪人脸表情,甚至眼神接触
关于电导率土壤温度水分PH四合一传感器的介绍
华为首款运动手环正式发布 50米防水设计 超长21天续航
单片机位带牵涉的指针变量问题
云端存储本地化,企业数据上云的多个应用场景
关于全球最小型9轴运动传感器的性能分析和应用介绍
谷歌将推出五项安卓新功能
魅族16Xs性能体验 为用户设置了极高的下限
大联大“Android智能手机解决方案”研讨会即将登场
无锡市人大常委会到华进调研:力求高质量打造国家创新中心
柔性织物传感器在智能服装及可穿戴设备上的应用
浪潮信息企业级SSD:降本又增效?AIPR技术解决高并发读取性能大问题
实验室信息管理系统(LIMS)详解
一种适用于海外地区的外送电缆通道的新型电气性能计算模型
双口网络的开路参数
光纤常用的模块是哪七种?多模与单模光纤区别有哪些?
2023年中国集成电路封测市场规模及行业竞争格局分析
LED控制驱动电路原理图