【ARM 嵌入式 C 入门及渐进 12 --寄存器位清0和置位函数实现】

这篇具有很好参考价值的文章主要介绍了【ARM 嵌入式 C 入门及渐进 12 --寄存器位清0和置位函数实现】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

寄存器位清0和置位函数实现

在 C 语言中,可以使用宏定义来创建用于清除(清零)或设置(置一)32位地址中特定位的函数。以下是两个宏定义的示例:

#define CLEAR_BIT(addr, bit) (*(volatile uint32_t *)(addr) &= ~(1UL << (bit))) 
#define SET_BIT(addr, bit) (*(volatile uint32_t *)(addr) |= (1UL << (bit))) 

这里的 addr 是指向目标32位地址的指针,bit 是需要操作的位的索引(从0开始计数)。

示例使用方式

假设要操作的是一个具有可读写属性的寄存器,它的地址为 0x40021000,现在我们想要清除第3位,设置第5位:

#define REG_ADDRESS 0x40021000 
// 清除第3位 
CLEAR_BIT(REG_ADDRESS, 3); 

// 设置第5位 
SET_BIT(REG_ADDRESS, 5); 

注意事项

  1. 这些宏定义假设 addr 是一个有效的32位寄存器地址。

  2. 使用 volatile 关键字确保每次访问寄存器时都会直接从内存读取,而不会使用缓存的值,这是访问硬件寄存器时的标准做法。

  3. 1UL 表示无符号长整型字面量,确保移位操作是在一个32位的值上执行的,以便正确地处理位操作。

  4. 在执行位清除操作时,首先使用 1UL << bit 创建一个只有目标位为1其余位为0的掩码,然后使用按位取反操作 ~ 来反转掩码,最后使用按位与操作 &= 来清除目标位。 5. 在执行位设置操作时,使用 1UL << bit 创建掩码,然后使用按位或操作 |= 来设置目标位。文章来源地址https://www.toymoban.com/news/detail-842353.html

到了这里,关于【ARM 嵌入式 C 入门及渐进 12 --寄存器位清0和置位函数实现】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式学习笔记——STM32的USART相关寄存器介绍及其配置

    上一篇中,对串口做了个概述,主要是介绍了串口通信的特征,异步串行全双工通信,然后就是结合串口的框图梳理了一下STM32中USART的配置流程以及发送接收数据的流程,本文将接着上篇的内容,对串口的寄存器做个介绍,然后实现一个简单的收发实验。 根据之前GPIO的经验

    2024年02月05日
    浏览(58)
  • 人工智能深入参与嵌入式控制器调试---ChatGPT回答TC377 PSRi寄存器ACT位置位失效问题

    做嵌入式开发的小伙伴们,有福利了! 当遇到调试过程中遇到难题,我们往往会找手册,上网搜索,找FAE来解决, 现在有了ChatGPT,尝试问了下调试的问题,如下  首先 我的问题描述 : 当设置 MCMCAN 控制器模式时,当 CCCRi.INT 被设置为 NORMAL 时,什么会导致 TC377 cpu PSRi 寄存

    2023年04月27日
    浏览(44)
  • 痞子衡嵌入式:不清i.MXRTxxx里FLEXSPI_MCR0寄存器保留位会造成IP CMD读写异常

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是 不清i.MXRTxxx里FLEXSPI_MCR0寄存器保留位会造成IP CMD读写异常 。 痞子衡曾经写过一篇文章 《改动i.MXRT1xxx里IOMUXC_GPR寄存器保留位可能会造成系统异常》,这篇文章提出了一个观点,即对于 MCU 外设寄存器应

    2024年03月09日
    浏览(54)
  • 痞子衡嵌入式:如果i.MXRT1xxx离线无法启动,请先查看SRC_SBMRx寄存器

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是 SRC_SBMRx寄存器对于定位i.MXRT1xxx离线无法启动问题的意义 。 最近有一位开源社区大佬在使能 RT1050 BEE 加密过程中遇到无法启动问题,折腾到一度崩溃,甚至想要弃坑。痞子衡哪能让这位“老乡”跑掉,连

    2024年02月19日
    浏览(39)
  • 12.3 ARM寄存器组织

    目录 ARM寄存器组织(一) 寄存器 概念 作用 分类 ARM寄存器 ARM寄存器组织(二) 专用寄存器 R15(PC,Program Counter) R14(LR,Link Register) R13(SP,Stack Pointer) ARM寄存器组织(三) CPSR寄存器 ARM寄存器组织(一) 寄存器 概念 寄存器是处理器内部的存储器,没有地址 C语言中register存储在寄

    2024年02月13日
    浏览(40)
  • 嵌入式开发——ARM介绍

    ARM是一种芯片架构,由英国的ARM Holdings公司开发和授权,被广泛应用于各种嵌入式系统、移动设备和消费电子产品中。ARM架构被设计成低功耗、高性能、可定制化的特点,能够满足各种应用场景下的需求。 ARM架构主要设计了以下几个部分内容: 指令集架构 (Instruction Set Ar

    2024年02月04日
    浏览(69)
  • 嵌入式学习---ARM时钟体系

    按 一定电压幅度 , 一定时间间隔 连续发出的脉冲信号。它是一个周期性的信号,每个周期内包含一个上升沿和一个下降沿。时钟脉冲的上升沿和下降沿通常用于触发和同步各个电子元件的操作,例如CPU的指令执行、数据传输、寄存器更新等。 时钟频率是指时钟脉冲的频率

    2024年01月16日
    浏览(61)
  • C/C++|物联网开发入门+项目实战|空间读写|非字符空间|返回值内部实现|嵌入式C语言高级|C语言函数的使用(2)-学习笔记(12)

    参考: 麦子学院-嵌入式C语言高级-C语言函数的使用 空间的读写 void fun(char *p); const char *p 只读空间,只为了看 char *p;该空间可能修改,几乎都要变 strcpy(); 定义:char *strcpy(char *dest,const char *src); sprintf(); 作用 1、修改 int * short * long * 2、空间传递 2.1 子函数看看空间里的情况

    2023年04月22日
    浏览(64)
  • 嵌入式:ARM Day6

    目的:1.输入\\\'a\\\',显示\\\'b\\\',将输入的字符的ASCII码下一位字符输出            2.原样输出输入的字符串 源码: uart4.h  uart4.c main.c 结果1: 结果2: 

    2024年02月12日
    浏览(45)
  • ARM+LINUX嵌入式学习路线

    嵌入式学习是一个循序渐进的过程,如果是希望向嵌入式软件方向发展的话,目前最常见的是嵌入式Linux方向,关注这个方向,大概分3个阶段: 1、嵌入式linux上层应用,包括QT的GUI开发 2、嵌入式linux系统开发 3、嵌入式linux驱动开发 嵌入式目前主要面向的几个操作系统是,

    2024年02月02日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包