寄存器操作*(volatile uint32 *)含义详解

本文详细解析了如何使用位运算对特定寄存器进行操作,并通过实例展示了寄存器地址转换为指针和位操作的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  #define PINMUX3             *( volatile Uint32* )( 0x01C40000+ 0x0C )

 PINMUX3 &= ~0x00600000;

 

分析:

将以上两句合成一条语句相当于

*( volatile Uint32* )( 0x01C40000+ 0x0C )  &= ~0x00600000;

意思是将0x01C40000+ 0x0C寄存器地址中的值&(~0x00600000)结果的值赋回给0x01C40000+ 0x0C寄存器

如上定义的PINMUX3是0x01C40000+ 0x0C地址中的值。

(volatile Uint32*)将地址强制转化成volatile Uint32*类型的指针。

即:

volatile Uint32*   p =   ( volatile Uint32* )( 0x01C40000+ 0x0C ) ;

* p  &=~0x00600000; 相当于 *p = *p & (~0x00600000);

 

结论就是设置0x01C40000+ 0x0C寄存器中的值,该值等于原先寄存器值& (~0x00600000);

“/** ****************************************************************************** * @file bsp_dwt.c * @author Wang Hongxi * @version V1.1.0 * @date 2022/3/8 * @brief ****************************************************************************** * @attention * ****************************************************************************** */ #include "bsp_dwt.h" DWT_Time_t SysTime; static uint32_t CPU_FREQ_Hz, CPU_FREQ_Hz_ms, CPU_FREQ_Hz_us; static uint32_t CYCCNT_RountCount; static uint32_t CYCCNT_LAST; uint64_t CYCCNT64; static void DWT_CNT_Update(void); void DWT_Init(uint32_t CPU_Freq_mHz) { /* 使能DWT外设 */ CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; /* DWT CYCCNT寄存器计数清0 */ DWT->CYCCNT = (uint32_t)0u; /* 使能Cortex-M DWT CYCCNT寄存器 */ DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; CPU_FREQ_Hz = CPU_Freq_mHz * 1000000; CPU_FREQ_Hz_ms = CPU_FREQ_Hz / 1000; CPU_FREQ_Hz_us = CPU_FREQ_Hz / 1000000; CYCCNT_RountCount = 0; } float DWT_GetDeltaT(uint32_t *cnt_last) { volatile uint32_t cnt_now = DWT->CYCCNT; float dt = ((uint32_t)(cnt_now - *cnt_last)) / ((float)(CPU_FREQ_Hz)); *cnt_last = cnt_now; DWT_CNT_Update(); return dt; } double DWT_GetDeltaT64(uint32_t *cnt_last) { volatile uint32_t cnt_now = DWT->CYCCNT; double dt = ((uint32_t)(cnt_now - *cnt_last)) / ((double)(CPU_FREQ_Hz)); *cnt_last = cnt_now; DWT_CNT_Update(); return dt; } void DWT_SysTimeUpdate(void) { volatile uint32_t cnt_now = DWT->CYCCNT; static uint64_t CNT_TEMP1, CNT_TEMP2, CNT_TEMP3; DWT_CNT_Update(); CYCCNT64 = (uint64_t)CYCCNT_RountCount * (uint64_t)UINT32_MAX + (uint64_t)cnt_now; CNT_TEMP1 = CYCCNT64 / CPU_FREQ_Hz; CNT_TEMP2 = CYCCNT64 - CNT_TEMP1 * CPU_FREQ_Hz; SysTime.s = CNT_TEMP1; SysTime.ms = CNT_TEMP2 / CPU_FREQ_Hz_ms; CNT_TEMP3 = CNT_TEMP2 - SysTime.ms * CPU_FREQ_Hz_ms; SysTime.us = CNT_TEMP3 / CPU_FREQ_Hz_us; } float DWT_GetTimeline_s(void) { DWT_SysTimeUpdate(); float DWT_Timelinef32 = SysTime.s + SysTime.ms * 0.001f + SysTime.us * 0.000001f; return DWT_Timelinef32; } float DWT_GetTimeline_ms(void) { DWT_SysTimeUpdate(); float DWT_Timelinef32 = SysTime.s * 1000 + SysTime.ms + SysTime.us * 0.001f; return DWT_Timelinef32; } uint64_t DWT_GetTimeline_us(void) { DWT_SysTimeUpdate(); uint64_t DWT_Timelinef32 = SysTime.s * 1000000 + SysTime.ms * 1000 + SysTime.us; return DWT_Timelinef32; } static void DWT_CNT_Update(void) { volatile uint32_t cnt_now = DWT->CYCCNT; if (cnt_now < CYCCNT_LAST) CYCCNT_RountCount++; CYCCNT_LAST = cnt_now; } void DWT_Delay(float Delay) { uint32_t tickstart = DWT->CYCCNT; float wait = Delay; while ((DWT->CYCCNT - tickstart) < wait * (float)CPU_FREQ_Hz) { } } ”这个dwt是什么意思
06-28
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值