我正在尝试一种方法,我可以在用C编写的SAI音频定义块中更改活动槽定义。
#define ACTIVE_TDM_SLOTS 1|2|3|4|5|6|7|8
数字是此结构中使用的uint32_t值,当存在时激活微型上的TDM音频插槽。
typedef struct{
uint32_t FirstBitOffset;
uint32_t SlotSize;
uint32_t SlotNumber;
uint32_t SlotActive;
}SAI_SlotInitTypeDef;
我正在尝试一种动态改变ACTIVE_TDM_SLOTS组成的方法,具体取决于需要激活的通道。 256种可能的活动通道组合。我可以初始化和取消硬件插槽来更改活动插槽的配置。
我假设#define #ifdef/#endef
都是预处理器,所以我需要以某种方式使用变量?
我可以从ACTIVE_TDM_SLOTS的所需活动通道中创建一个字符串,但是如何将其加载到变量中?我可以使用一组char * var并将它们一起加入变量吗?
我不完全确定管道是如何使用第一名的定义!也许它只是不可能将其加载到变量中?
我的另一个解决方案是在流式传输时从DMA中过滤掉活动的插槽数据,但它的接缝更灵敏,可以激活或取消激活所需的插槽?
很高兴上传更多代码,如果它有用。
好吧,我想我错过了一个显而易见的事情。
SAI_SLOT_NOTACTIVE 0;
我只是给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)
例如,chanel 1 2 3 4路由到前4个记录槽,而5 6 7 8路径被禁用
通道号更改为使用的插槽计数
/* 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;