可能在C中动态更改变量中的多个管道值?

问题描述 投票:0回答:1

我正在尝试一种方法,我可以在用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中过滤掉活动的插槽数据,但它的接缝更灵敏,可以激活或取消激活所需的插槽?

很高兴上传更多代码,如果它有用。

c variables pipe definition
1个回答
0
投票

好吧,我想我错过了一个显而易见的事情。

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;
© www.soinside.com 2019 - 2024. All rights reserved.