我正在尝试想出一种方法来更改 SAI 中的事件插槽定义 用 C 编写的音频定义 block 。
#define ACTIVE_TDM_SLOTS 1|2|3|4|5|6|7|8
这些数字是此结构中使用的 uint32_t 值,当存在时激活微 Controller 上的 TDM 音频插槽。
typedef struct{
uint32_t FirstBitOffset;
uint32_t SlotSize;
uint32_t SlotNumber;
uint32_t SlotActive;
}SAI_SlotInitTypeDef;
我正在尝试考虑一种方法来根据需要激活的 channel 来动态更改 ACTIVE_TDM_SLOTS 的构成。 256 种可能的事件 channel 组合。 我可以初始化和取消初始化硬件插槽来更改事件插槽的配置。
我假设 #define #ifdef/#endef
都是预处理器,所以我需要以某种方式使用变量?
我可以从 ACTIVE_TDM_SLOTS 所需的事件 channel 中创建一个字符串,但如何将其加载到变量中?我可以使用一组 char *var 并将它们连接到变量中吗?
我一开始并不完全确定管道是如何与定义一起工作的!也许只是无法将其加载到变量中?
我的另一个解决方案是在 DMA 流入时过滤事件插槽数据,但激活或停用所需插槽似乎更明智?
如果有用的话,很乐意上传更多代码。
最佳答案
好吧,我想我错过了一件明显的事情。
SAI_SLOT_NOTACTIVE 0;
我只是将 0 分配给 | uint32_t 变量 |那些不活跃的。 我在想我必须删除 slotActive 列表中的插槽!
如果这有效,我会回复以防其他尝试者感到困惑 动态更改 ARM STM32xxx 上的 SAI TDM 音频插槽配置
原始定义
/* SAI_Block_Slot_Active SAI Block Slot Active */
#define SAI_SLOT_NOTACTIVE ((uint32_t)0x00000000U)
#define SAI_SLOTACTIVE_0 ((uint32_t)0x00000001U)
#define SAI_SLOTACTIVE_1 ((uint32_t)0x00000002U)
#define SAI_SLOTACTIVE_2 ((uint32_t)0x00000004U)
#define SAI_SLOTACTIVE_3 ((uint32_t)0x00000008U)
#define SAI_SLOTACTIVE_4 ((uint32_t)0x00000010U)
#define SAI_SLOTACTIVE_5 ((uint32_t)0x00000020U)
#define SAI_SLOTACTIVE_6 ((uint32_t)0x00000040U)
#define SAI_SLOTACTIVE_7 ((uint32_t)0x00000080U)
#define SAI_SLOTACTIVE_8 ((uint32_t)0x00000100U)
#define SAI_SLOTACTIVE_9 ((uint32_t)0x00000200U)
#define SAI_SLOTACTIVE_10 ((uint32_t)0x00000400U)
#define SAI_SLOTACTIVE_11 ((uint32_t)0x00000800U)
#define SAI_SLOTACTIVE_12 ((uint32_t)0x00001000U)
#define SAI_SLOTACTIVE_13 ((uint32_t)0x00002000U)
#define SAI_SLOTACTIVE_14 ((uint32_t)0x00004000U)
#define SAI_SLOTACTIVE_15 ((uint32_t)0x00008000U)
#define SAI_SLOTACTIVE_ALL ((uint32_t)0x0000FFFFU)
示例,其中 channel 1 2 3 4 路由到第 4 个记录槽,并且 channel 5 6 7 8 已禁用
channel 数更改为使用的插槽数
/* TDM record slot assign to channel or deactivate any TDMx value 0 to disable slot */
uint32_t TDM1 = SAI_SLOTACTIVE_0;
uint32_t TDM2 = SAI_SLOTACTIVE_1;
uint32_t TDM3 = SAI_SLOTACTIVE_2;
uint32_t TDM4 = SAI_SLOTACTIVE_3;
uint32_t TDM5 = SAI_SLOT_NOTACTIVE;
uint32_t TDM6 = SAI_SLOT_NOTACTIVE;
uint32_t TDM7 = SAI_SLOT_NOTACTIVE;
uint32_t TDM8 = SAI_SLOT_NOTACTIVE;
haudio_out_sai.SlotInit.SlotActive = TDM1 | TDM2 | TDM3 | TDM4 | TDM5 | TDM6 | TDM7 | TDM8;
haudio_out_sai.SlotInit.SlotNumber = 4;
关于在 C 中动态更改变量中的多个管道值可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55235423/