[PIC®/AVR®/dsPIC®产品] 从 C 代码中使用 SFR

[复制链接]
3256|17
 楼主| 21mengnan 发表于 2024-3-12 19:51 | 显示全部楼层 |阅读模式
特殊功能寄存器 (Special Function Register, SFR)是一些控制器件上 MCU 操作或外设模块各个方面的寄存器。其中大多数寄存器都进行了存储器映射,这意味着它们会位于器件数据存储空间中的一些特定地址处,并可以使用这些地址进行访问。一些寄存器中的各个位控制独立的特性。一些寄存器是只读的;一些是只写的。
存储器映射的 SFR 通过一些置于寄存器地址处的特殊 C 变量进行访问。
SFR 变量在头文件中预定义,在源代码中包含 <xc.h> 头文件 之后即可访问它们。头文件中同时定义了位变量和带位域的结构,所以可以在源代码中使用这两种形式中任一种来访问寄存器中的位。
对于映射到寄存器以及这些寄存器中的位的 C 变量,其名称将基于器件数据手册中指定的名称。但是,由于寄存器内的某些位名称可能会重复,所以命名可能会有差异。
存放位域的结构的名称通常为相应寄存器的名称后跟随 bits。例如,下面显示了一个代码示例,它包含了通用头文件、将 PORTA 作为一个整体清零、使用位变量将 PORTA的 bit 0 置 1,以及使用结构 / 位域定义将 PORTA 的 bit 2 置 1。
  1. #include <xc.h>
  2. void main(void)
  3. {
  4. PORTA = 0x00;
  5. RA0 = 1;
  6. PORTAbits.RA2 = 1;
  7. }
要确认与所用器件有关的名称,请查看 <xc.h> 将包含的特定于器件的头文件,确定每个变量的定义。这些文件将位于编译器的 include 目录,并具有一个代表该器件的名称。
器件和将通过 <xc.h> 包含的头文件的名称存在一对一关系,例如,针对 PIC16LF1826器件进行编译时,<xc.h> 将包含头文件 <pic16lf1826.h>。请记住,不需要在源代码中包含这个特定于芯片的文件;它由 <xc.h> 自动包含。

从 C 代码或嵌入到 C 代码的汇编代码中访问一些 SFR 时需要小心。编译器使用一些寄存器来保存计算的中间值,直接写入这些寄存器可能导致代码失败。当 SFR 由于 C 或汇编代码直接写入它们而发生改变时,编译器并不会检测到发生了这种情况。



小灵通2018 发表于 2024-3-14 15:30 | 显示全部楼层
支持位操作吗
小灵通2018 发表于 2024-3-14 15:30 | 显示全部楼层
这个比51好像还简单啊,包含头文件就行了,不用自己再生命sbit
dongnanxibei 发表于 2024-3-18 22:23 | 显示全部楼层
这些头文件里是如何实现的呢
小明的同学 发表于 2024-3-26 21:17 | 显示全部楼层
PORTAbits.RA2这种定义很方便操作。
小明的同学 发表于 2024-3-26 21:31 | 显示全部楼层
相当于位操作。
LEDyyds 发表于 2024-3-27 17:06 | 显示全部楼层
从 C 代码或嵌入到 C 代码的汇编代码中访问一些 SFR 时需要小心。编译器使用一些寄存器来保存计算的中间值,直接写入这些寄存器可能导致代码失败。
问天少年 发表于 2024-3-28 11:25 | 显示全部楼层
存储器映射的 SFR 通过一些置于寄存器地址处的特殊 C 变量进行访问
lix1yr 发表于 2024-3-28 11:26 | 显示全部楼层
在嵌入式系统中,SFR(Special Function Register)是用于控制和配置微控制器硬件功能的特殊寄存器。在C代码中使用SFR通常涉及直接访问这些寄存器,以配置和控制微控制器的硬件功能
ex7s4 发表于 2024-3-28 12:30 | 显示全部楼层
通常,开发人员会使用宏定义来简化对SFR的访问。例如,可以定义一系列宏来代表不同的SFR地址,以及对应的位操作。这样可以使代码更易读和易维护
w2nme1ai7 发表于 2024-3-28 13:34 | 显示全部楼层
宏定义操作呗,其实我觉得宏还是很好用的
q1d0mnx 发表于 2024-3-28 14:37 | 显示全部楼层
在C语言中,可以使用volatile关键字来告诉编译器,这些变量可能会在未经通知的情况下被更改,因此编译器不应该进行优化
b5z1giu 发表于 2024-3-28 16:42 | 显示全部楼层
需要注意的是,直接访问SFR需要谨慎,因为这可能会影响微控制器的正常运行
p0gon9y 发表于 2024-3-28 18:15 | 显示全部楼层
在使用SFR时,应该遵循相关的数据手册和技术文档,确保对SFR的访问是正确的,并且不会导致不可预测的行为
q1ngt12 发表于 2024-3-29 06:22 | 显示全部楼层
SFR我好像还没用过的吧
l1uyn9b 发表于 2024-3-29 07:36 | 显示全部楼层
这种特殊寄存器话说STM32是否也具有?
d1ng2x 发表于 2024-3-29 09:10 | 显示全部楼层
其实就是应用,看官方demo如何应用的呗,倒时候就可以用了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

1151

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部