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

发布时间:2023-03-24  

之前为大家分享的《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库都有这样定义)。


------------ END ------------


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    着不同的过程任务,相当于主循环程序的子程序。模块化编程中被调用块不向调用块返回数据。 03、模块化编程实例 模块化编程实例1 - 液位监视 • 监视一个慢变得过程不需要每次扫描都进行。如果......
    西门子PLC程序编程技巧分享;一、程序结构统一 OB1:主程序; OB100:初始化程序(无需主程序调用); OB35:100ms(可修改)中断(无需主程序调用),可以调用PID模块; OB80......
    干货!西门子PLC程序编程技巧;OB1:主程序; OB100:初始化程序(无需主程序调用); OB35:100ms(可修改)中断(无需主程序调用),可以调用PID模块; OB80、OB82、OB85......
    、OB82、OB85、OB86、OB87、OB121、OB122:故障诊断模块(无需主程序调用、无需编程); FC1:系统模式; FC2:输入处理; FC3:输出处理; FC4:运行处理; FC5:停止......
    、OB82、OB85、OB86、OB87、OB121、OB122:故障诊断模块(无需主程序调用、无需编程); FC1:系统模式; FC2:输入处理; FC3:输出处理; FC4:运行处理; FC5:停止......
    单片机入门教程第22课-串行口应用编程实例;1. 串口方式0应用编程 8051单片机串行口方式0为移位寄存器方式,外接一个串入并出的移位寄存器,就可以扩展一个并行口。例:用8051串行......
    一直点击下一步直到创建这一步并点击创建,看一下输出窗口,创建库文件成功) 02 调用库指令 第一步:(重新启动STEP7-MicroWIN SMART编程软件后,在左侧项目树库指令会看到前面创建的库指令名称) 第二步:(在主程序调用......
    Modbus RTU从站指令库(图1),库中应当包括MBUS_INIT和MBUS_SLAVE两个子程序。  西门子smart200的modbus从站库文件 图1. 指令树中的库指令 2.编程......
    Produce Call Standard) ATPCS(ARM-Thumb Produce Call Standard): ARM 程序和 Thumb 程序中子程序调用的基本规则 子程序调用......
     DELAY ;调用延时子程序   SETB  P1.0 ;P1.0输出高电平,使LED1熄灭   CLR   P1.1 ;P1.1输出低电平,使LED2点亮   ACALL DELAY ;调用延时子程序......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>