用位段、宏分别实现寄存器的位定义

CCS中的IER和IFR寄存器:Symbol ‘IER‘ could not be resolved 问题现象 main函数初始化时,关闭CPU的中断使能,清除不断标志,一般都是这么写的: IER = 0x0000; IFR = 0x0000; 但是,CCS却提示: Symbol 'IER' could not be resolved 可是呢,编译整个工程时,也不会报错。 <Linking> Finished building target: "DCDC.out" "D:/ti/ccs1040/ccs/utils/tiobj2bin/tiobj... 阅读详情

用位段、宏分别实现寄存器的位定义

1. 一个32位寄存器描述:中断使能寄存器(IER)

寄存器位

名称

属性

复位值

描述

31 : 8

RFU

——

0x0

RFU(未被使用的位)

7

PTIME

R/W

0x0

略

6:3

RFU

——

0x0

RFU

2

ELSI

R/W

0x0

略

1

ETBEI

R/W

0x0

略

0

ERBFI

R/W

0x0

略

2. 用宏实现位定义

#define ERBFI               ((uint32_t)0x00000001)

#define ETBEI               ((uint32_t)0x00000002)

#define ELSI                 ((uint32_t)0x00000004)

#define PTIME             ((uint32_t)0x00000004)

宏定义数字加上类型,这样使代码更加安全,赋值出现类型匹配错误会报错。

如果要设置某些位,只需将这些位相或以后,再与该寄存器值相或:

IER |= (ELSI | PTIME);

如果要清除某些位,只需将这些位相或以后取反,再与该寄存器值相与:

IER &= ~(ELSI | PTIME);

3. 用位段实现位定义

首先定义一个位段结构体:

struct UART_IER_BIT

{

      uint32_tRFU0:   24;

      uint32_tPTIME: 1;

      uint32_tRFU1:   4;

      uint32_tELSI:    1;

      uint32_tETBEI: 1;

      uint32_tERBFI: 1;

};

位段操作寄存器非常方便,可以直接进行读写。但是使用位段也会带来一些问题,注重可移植性的程序应该避免使用位段。

(1) int位段被当做有符号数还是无符号数。

(2)位段中位的存放顺序,以上定义的位段是从字的高位到低位。还有从低位到高位的实现方式。根据不同的目标机器和编译器编译方式有不同的定义。

(3)当一个位段指明了两个位段,第二个位段比较大,无法容纳于第一个位段剩余的位时,编译器有可能把第二个位段放在内存的下一个存储单元,也可能直接放在第一个位段后面,从而在两个内存位置的边界上。

i.MX21 BMI与I2C寄存器深度解析:从总线主控到通信协议的嵌入式实战 在嵌入式系统开发中,总线主控接口(BMI)和I2C总线是处理器与外部设备通信的核心技术。BMI作为处理器的“交通指挥官”,通过配置控制寄存器(如BMICTLR2)和状态寄存器(BMISR),管理外部总线的访问时序与数据流,其FIFO机制能有效缓冲数据并提升传输效率。I2C则作为一种两线制串行总线,通过精确定时和仲裁机制,可靠地连接传感器、EEPROM等外设。理解这些接口的寄存器工作原理,对于构建稳定、高效的嵌入式系统至关重要,尤其是在资源受限的ARM9平台(如i.MX21)上,能直接解决数据丢失、总线死锁等 阅读详情

相关推荐

SRAM:SRAM入门指南与工作原理

SRAM(Static Random Access Memory),即静态随机存取存储器,是一种能够读取和写入数据的内存(RAM)。它使用由晶体管组成的触发器来存储数据,只要有电源供应,数据就可以稳定地保存。与动态随机存取存储器(DRAM)不同,SRAM 不需要周期性地刷新来保持数据。

weixin_42896509的博客 1万+

DSP_CPU_Example_2833x_CpuTimer

中斷副程式的宣告 __interrupt void cpu_timer0_isr(void); 進入副程式 __interrupt void cpu_timer0_isr(void) { CpuTimer0.InterruptCount++; // Acknowledge this interrupt to re...

aiqiaoqing3630的博客 917

恶意代码实验3:Word宏病毒实验

只要下次打开这个word文档,就会执行以上代码,并将自身复制到Normal.dot(word文档的公共模板)和当前文档的ThisDocument中,同时改变函数名(模板中为Document_Close,当前文档为Document_Open),此时所有的word文档打开和关闭时,都将运行以上的病毒代码,可以加入适当的恶意代码,影响word的正常使用,本例中只是简单的跳出一个提示框。回答不正确三次,即可自动跳出病毒程序,但那时已经出现几十个文档。1、打开的宏编辑器如图所示,即可编写病毒代码。

qq_63949327的博客 6504

6713中断寄存器配置及存储映射

介绍6713中断寄存器配置和存储器映射

想做一条贪吃蛇 1万+

Labview_DQMH框架学习1--浅析

本文主要结合一个相对容易理解的例子,阐述 DQMH 框架的工作原理,希望对初学者有一定的帮助。

hrbeuxn的博客 3048

python编程实现制作网络流量监控动画

c,实时显示网络带宽使用情况,用柱状图或折线图表示不同时间段的流量变化。通过 Python编程实现图形库(如 Pygame、Tkinter、Matplotlib 等)来实现计算机网络基础概念的可视化动画。global bars # 声明 bars 为全局变量。# 获取当前网络流量。# 创建图形和坐标轴。

qq_42788199的博客 718

PC下串口IO空间及其寄存器详解

串口(Serial UART), 全称是通用异步收发口universal asynchronous receiver/transmitter. 主要用于计算机之间的串行通信任务。UART主要完成时序和奇偶校验等功能。而在通信时 需要附加的设备是TTL电平与RS232电平的转换设备。 对于TTL电平,规定+5V为逻辑“1”, 0V为逻辑“0” 对于RS232电平,规定+3V到+12V为逻辑“

huangkangying的专栏 1万+

树莓派4B+Ubuntu22.04+思岚RPLIDAR C1激光雷达应用

树莓派+Ubuntu22.04+思岚RPLIDAR C1激光雷达简单应用

techfuture的博客 3703

单片机(MCU)寄存器的位操作宏解析

对单片机寄存器位操作的宏进行了解析。#define SFR(sfr, start, len, dat) \ (sfr = (sfr & ~((~(0xffffffff

ydgd118的博客 1055

ThinkpadCPU锁频0.4G问题

这篇帖子总结的很好,有这种问题可以试一试:但是切记,不要病急乱投医,冷静下来,慢慢分析和排除故障,有时候,并不需要我们知道所有的原理,只要问题解决了就是OK的。ThinkpadCPU锁频0.4G,具体是过程是今天我需要去楼下打印东西,要带着笔记本电脑,拔掉电源我就去楼下。一般这种问题很有可能是电源导致的,先不要病急乱投医,刷BIOS,装系统什么的,没用。但是确实解决了我的问题,记录下来。带着电脑回到工位,插上电源。突然我突发奇想,拔掉电源,神奇的事情发生了,CPU频率复活了,再插上电源,CPU完全恢复了。

小幽余生不加糖 1万+

如何在Ubuntu 22.04系统上安装CUDA 12.9

本文提供Ubuntu22.04系统上安装CUDA12.9的简明指南:1)确认已安装适配575驱动;2)清理旧版本后安装必需依赖库;3)通过deb包方式添加英伟达源并安装CUDA12.9工具包;4)配置环境变量;5)通过nvcc-V和nvidia-smi命令验证安装。文中包含常见问题解决方法及多显卡使用说明,全程约需10分钟完成安装。

2501_93651177的博客 1479

位段

位段以位为单位定义结构体(或共用体)中成员所占存储空间的长度。含有位段的结构体类型称为位段结构。位段结构也是一种结构体类型,只不过其中含有以位为单位定义存储长度的整数类型位段成员。采用位段结构既节省存储空间,又可方便操作。位段结构中位段的定义格式为:   unsigned :例如:struct bytedata{    unsigned a:2;    /*位段a,占2位*/    u

starryheavens的专栏 889

【日志】Prometheus/Loki+Alertmanager+Grafana监控告警

参考文章:匹配写法:https://blog.ossq.cn/2674.html。

CN_Eden 1320

如何操作DSP的寄存器

DSP芯片的寄存器能够实现对系统和外设功能的配置和控制,所以对寄存器的操作尤为重要,那么如何实现对寄存器的操作呢?

qq_44920122的博客 2059

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

深入理解 C 语言位段:高效内存利用的利器

本文介绍了C语言位段的概念及其优势。位段是与结构体类似但能按比特分配内存的数据结构,适用于内存紧张场景。文章详细解析了位段的内存分配规则及其跨平台兼容性问题,列举了嵌入式系统、网络协议等典型应用场景,并与结构体进行对比分析。位段虽能优化内存但存在平台差异,适用于不需跨平台但对内存要求苛刻的场景。掌握位段有助于开发高效、底层的程序代码。

2503_93893479的博客 1329

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

简单理解:GPIO 配置中完整的 4 位寄存器位定义

STM32F103 GPIO配置采用4位组合控制(2位MODE+2位CNF):MODE[1:0]决定基础模式(输入/输出)及输出速率,CNF[1:0]指定细分类型(浮空/上拉/推挽等)。4位组合覆盖所有引脚模式,如0xA表示复用推挽输出。配置时需注意:输入模式MODE=00,输出模式按速率选01/10/11;复用模式需开启外设时钟;上拉/下拉需配合ODR寄存器。低8引脚用CRL寄存器,高8引脚用CRH寄存器。该4位组合可直接转换为十六进制值用于寄存器配置,提供完整的引脚模式控制方案。

DIY 692

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

STM32的位段操作

位操作就是可以读/写单独的一个比特位,在STM32中没有像51单片机的sbit来实行位定义,但是它可以通过位带别名区来实现。 在STM32中有两个地方实现了位带操作,一个是SRAM区的最低1MB空间,另一个是外设区最低1MB空间。0x2000 0000 ~ 0x200f ffff (SRAM区中的最低1MB) 0x4000 0000 ~ 0x400f ffff (片上外设区中的最低1MB,已覆盖了

echo_bright_的博客 8194

C语言当中位段的使用

文章来源 http://hi.baidu.com/colin719/blog/item/3f1783138e635f806538db40.htmlC语言当中位段的使用2007-01-13 20:54位段以位为单位定义结构体(或共用体)中成员所占存储空间的长度。 含有位段的结构体类型称为位段结构。位段结构也是一种结构体类型,只不过其中含有以位为单位定义存储长度

杨德龙的专栏 1557

stm32 C 语言位段定义,STM32 位段详解

1 定义首先需要明确下,位段,位带和别名区这三个名词位段:STM32用户参考手册使用的名字位带:CortexM3参考手册使用的别名区:地址总线上用来位访问地址区域,所以说,位段和位带是一个意思,是不同手册的不同叫法。由上述的名词解释得知,位带功能并不是STM32独有的,是CortexM3的功能(CortexM4也有这样的功能)。MCS51有位操作,以一位(bit)为数据对象的操作,MCS51可以简...

weixin_35511255的博客 528

简单理解:不止 I2C!CR 寄存器才是 MCU 所有外设的 “总控面板”

摘要:代码中操作TWIx->CR寄存器是因为CR(控制寄存器)集中了I2C外设的所有核心控制功能。不同功能通过操作CR寄存器的不同位段实现,如bit24~31配置自动NACK字节数,bit11控制自动NACK使能。这种设计遵循MCU外设的通用规范:控制功能集中到CR寄存器,状态信息放SR寄存器,数据存储用DR寄存器。通过位操作(&=、|=)可单独修改目标位段而不影响其他功能,既节省地址空间又便于编程,体现了嵌入式系统寄存器设计的典型思路。

DIY 321

C语言自定义类型深度解析:结构体、位段、枚举与联合体的实战应用

在C语言编程中,自定义类型是构建复杂数据结构和实现底层系统控制的核心工具。其原理在于通过结构体、联合体、枚举和位段等机制,程序员可以定义符合特定需求的数据组织形式,从而精确控制内存布局与数据解释方式。这一技术价值在于它能显著提升代码的可读性、可维护性及内存使用效率,是嵌入式开发、系统编程和协议设计等领域不可或缺的基石。例如,在嵌入式系统开发中,通过结构体内存对齐优化可以节省宝贵的内存资源;而在通信协议设计中,灵活运用联合体和位段能够高效地处理多变的数据负载。本文将聚焦于结构体、位段、枚举和联合体这四种关键的

weixin_34161032的博客 451

寄存器就是硬件“开关”:写一个地址,硬件就动作

本文揭示了寄存器作为硬件控制接口的本质,通过统一编址机制,CPU通过内存读写操作即可控制硬件。当程序写入GPIO等寄存器地址时,硬件电路会锁存数据并触发相应动作(如引脚电平变化)。ARM架构将外设寄存器映射到特定内存地址(4字节对齐),使C语言指针能直接操作硬件。这种设计实现了用"写内存"方式控制硬件的高效机制,体现了ARM架构的优雅性——CPU只需执行标准读写操作,无需区分操作对象是内存还是外设。

m0_38123813的博客 226

【车载开发系列】RH850与CAN相关的寄存器介绍

它是CAN硬件 ID过滤表的总数量配置寄存器,它的作用是告诉CAN控制器:我一共写了多少条CAN ID接收规则,硬件按这个数量去查表过滤报文。它是CAN驱动最为核心的总开关。同时也是模式切换主控寄存器它是CANFD通道0标准CAN仲裁段波特率时序寄存器。你的CAN总线跑多少波特率就是由这个寄存器决定的。一般情况下配置其值为:0x020B1004 = 40M 时钟 → 500Kbps。CANFD通道0普通接收缓冲区数量配置寄存器。它用来配置普通接收缓存数量。

千月星跡 395

C语言——结构体

这篇文章将讲述C语言中一种自定义类型:结构体。位段在结构体中定义时,使用冒号(:)指定每个成员占用的位数。// 定义一个包含位段的结构体// 占1位// 占3位// 占4位// 设置位段成员的值// 打印位段成员的值// 打印结构体的总大小return 0;冒号后面的数值是指所占用的比特位。这里三个位段成员 a、b 和 c,分别占用1位、3位和4位。位段在不同编译器的存储方式不同,所以这里不再具体说明,仅对位段做一个简单的介绍。

2301_80817503的博客 1109
上一篇: 去掉字符串中所有空格
下一篇: 循环队列-队列的顺序表示和实现1
lne8734
博客等级 码龄10年 7粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值