This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
您好(Jagadish)、
我注意到、无论 ADC 的 FIFO 大小配置如何(在 HALCoGen 中)、生成的代码将始终读取 BUF0的值(GxBUF[x] . BUF0 )。 例如、adcGetData()函数:
uint32 adcGetData(adcBASE_t *adc, uint32 group, adcData_t * data) { uint32 i; uint32 buf; uint32 mode; uint32 index = (adc == adcREG1) ? 0U : 1U; uint32 intcr_reg = adc->GxINTCR[group]; uint32 count = (intcr_reg >= 256U) ? s_adcFiFoSize[index][group] : (s_adcFiFoSize[index][group] - (uint32)(intcr_reg & 0xFFU)); adcData_t *ptr = data; /* USER CODE BEGIN (16) */ /* USER CODE END */ mode = (adc->OPMODECR & ADC_12_BIT_MODE); if(mode == ADC_12_BIT_MODE) { /** - Get conversion data and channel/pin id */ for (i = 0U; i < count; i++) { buf = adc->GxBUF[group].BUF0; /*SAFETYMCUSW 45 D MR:21.1 <APPROVED> "Valid non NULL input parameters are only allowed in this driver" */ ptr->value = (uint16)(buf & 0xFFFU); ptr->id = (uint32)((buf >> 16U) & 0x1FU); /*SAFETYMCUSW 567 S MR:17.1,17.4 <APPROVED> "Pointer increment needed" */ ptr++; } } else { /** - Get conversion data and channel/pin id */ for (i = 0U; i < count; i++) { buf = adc->GxBUF[group].BUF0; /*SAFETYMCUSW 45 D MR:21.1 <APPROVED> "Valid non NULL input parameters are only allowed in this driver" */ ptr->value = (uint16)(buf & 0x3FFU); ptr->id = (uint32)((buf >> 10U) & 0x1FU); /*SAFETYMCUSW 567 S MR:17.1,17.4 <APPROVED> "Pointer increment needed" */ ptr++; } } adc->GxINTFLG[group] = 9U; /** @note The function adcInit has to be called before this function can be used.\n * The user is responsible to initialize the message box. */ /* USER CODE BEGIN (17) */ /* USER CODE END */ return count; }
在 adcBase_t 内部、代码如下所示:
struct { uint32 BUF0; /**< 0x0090,0x00B0,0x00D0: Group 0-2 result buffer 1 register */ uint32 BUF1; /**< 0x0094,0x00B4,0x00D4: Group 0-2 result buffer 1 register */ uint32 BUF2; /**< 0x0098,0x00B8,0x00D8: Group 0-2 result buffer 2 register */ uint32 BUF3; /**< 0x009C,0x00BC,0x00DC: Group 0-2 result buffer 3 register */ uint32 BUF4; /**< 0x00A0,0x00C0,0x00E0: Group 0-2 result buffer 4 register */ uint32 BUF5; /**< 0x00A4,0x00C4,0x00E4: Group 0-2 result buffer 5 register */ uint32 BUF6; /**< 0x00A8,0x00C8,0x00E8: Group 0-2 result buffer 6 register */ uint32 BUF7; /**< 0x00AC,0x00CC,0x00EC: Group 0-2 result buffer 7 register */ } GxBUF[3U];
我仍然不知道 FIFO 是如何在引擎盖下工作的、更具体地说是:
1. BUF1到 BUF7的用途是什么?
2.对其中一个存储器位置(例如 BUF0) 的读取是否会自动旋转硬件 FIFO (移动尾部)?
谢谢。此致、
Varban
您好、Varban、
ADC 结果(我的意思是转换后的数据)读数有两种方式:
一种是基于 FIFO 的方法、另一种是直接访问存储器。
此处 ADcGetData 仅使用基于 FIFO 的方法。 我的意思是 BUF0只是一个 FIFO。
我们可以从 BUF0至 BUF7读取任何缓冲器、因为它们都将只保存相同的转换结果。 这些 FIFO 队列将首次保存 第一个转换数据、如果我们读取这些数据、则 FIFO 将更新 ADC RAM 中的其他数据、该数据在第一次转换数据后立即被转换、该过程将继续进行。
请参阅 TRM 一次以了解更多详细信息。
——
谢谢、此致、
Jagadish。
尊敬的 Jagadish:
感谢 您的明确解释!