c - 在 core_cm4.h 上,为什么会有类似 ((uint32_t)(int32_t)IRQn) 的转换?

标签 c arm cortex-m3 cortex-m cmsis

在来自 core_cm4.h 的以下代码中,为什么有双重转换 ((uint32_t)(int32_t)IRQn)

例如在下面的函数中:

__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
{
  NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));
}

这样做的目的是什么?

最佳答案

由于 CM4 软件为核心实现负中断源,您必须先将值转换为 32 位有符号整数,然后再转换为无符号 32 位,以便在数字左侧填充零进行正确的右移。

CM4 使用 -15 到 -1 作为 CM4-Core 源,从 0 到下一个作为供应商特定源。

关于c - 在 core_cm4.h 上,为什么会有类似 ((uint32_t)(int32_t)IRQn) 的转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46468494/

相关文章:

c++ - 动态无锁内存分配器

c - 将 typedef 枚举初始化为字符串

c - 你有一个简单的 bzero 例子吗?

c - ARM M4 每周期指令 (IPC) 计数器

c++ - CC2538 (Cortex m3) 启动时出现硬故障,位于 __lib_init_array 中

c - 嵌入式函数指针

c++ - C++ 中的 ARM Cortex-M 中断处理程序

operating-system - 为arm架构编写操作系统

0xFFE700DE >0xA 的汇编代码比较失败

arm - 如何判断一个字(4字节)是16位指令还是32位指令?