

在找开源的时候 遇到了这样写的代码
问了一些软件对代码的解释 但是不是特别明白 不知道能不能具体讲讲为什么这样写 这样写有什么好处


晚上好🌙🌙🌙
本答案参考通义千问
这段代码涉及到了STM32微控制器中的DMA(直接内存访问)和CCM RAM(紧密耦合内存)的使用。让我们逐一解析并解答你的问题。
问题描述:
//使用DMA的变量时候不能将其放在CCM RAM中!!
uint16_t ADC1Result[4];
uint16_t ADC2Result[2];
__attribute__((section("ccmram"))) ADC_Data_t Vcap,Vin,Vout,Iin,Iout,Icap;
解释:
为什么不能将DMA变量放在CCM RAM中?
好处:
问题描述:
_attribute_((section("ccmram"))) void Get_ADC(ADC_Data_t *ADC)
{
ADC->now_value = ADC->conversion.proportion * (ADC->ADC_value) + ADC->conversion.offset;
ADC->ave_value = LowPass(ADC->now_value, ADC->ave_value, ADC->lowpass_a);
}
_attribute_((section("ccmram"))) void Resolve_ADC(void)
{
Get_ADC(&Vout);
Get_ADC(&Vcap);
Get_ADC(&Iin);
Get_ADC(&Iout);
Get_ADC(&Icap);
#if DELETE_VIN
// SAMPLE Vin.ADC value Vout.ADC value;
// Vin.ave value Vout.ave_value;
// Vin.now_value Vout.now_value;
#else
Get_ADC(&Vin);
#endif
}
解释:
__attribute__((section("ccmram"))) 属性将函数或变量放置在CCM RAM中。Get_ADC 函数计算ADC值并更新平均值。Resolve_ADC 函数调用 Get_ADC 来处理多个ADC数据。为什么使用 __attribute__((section("ccmram")))?
为了更清晰地展示,我们可以对代码进行一些改进:
// 定义ADC数据结构体
typedef struct {
uint16_t ADC_value;
float conversion_proportion;
float conversion_offset;
float lowpass_a;
uint16_t now_value;
uint16_t ave_value;
} ADC_Data_t;
// 定义低通滤波器函数
float LowPass(uint16_t new_value, float old_value, float alpha) {
return alpha * new_value + (1 - alpha) * old_value;
}
// 使用DMA的变量
uint16_t ADC1Result[4];
uint16_t ADC2Result[2];
// 放置在CCM RAM中的变量
__attribute__((section("ccmram"))) ADC_Data_t Vcap, Vin, Vout, Iin, Iout, Icap;
// 获取ADC数值
void Get_ADC(ADC_Data_t *ADC) {
ADC->now_value = ADC->conversion_proportion * (ADC->ADC_value) + ADC->conversion_offset;
ADC->ave_value = LowPass(ADC->now_value, ADC->ave_value, ADC->lowpass_a);
}
// 解算ADC数值
void Resolve_ADC(void) {
Get_ADC(&Vout);
Get_ADC(&Vcap);
Get_ADC(&Iin);
Get_ADC(&Iout);
Get_ADC(&Icap);
#if DELETE_VIN
// 样例代码,注释掉
#else
Get_ADC(&Vin);
#endif
}