## b_mod_adchub ### 数据结构 ```C //回调 ad_val:ADC值 arg:用户指定传入的参数 typedef void (*pAdchubCb_t)(uint32_t ad_val, uint32_t arg); typedef struct _AdcInfo { uint8_t seq; //序号,每个实例中序号不能一样 uint8_t filter; //是否进行默认滤波处理 uint8_t flag; //buf是否填充满 uint8_t index; //当前喂入的数据放入buf的索引 pAdchubCb_t callback; //回调函数 uint32_t arg; //指定回调传入的参数 uint32_t buf[FILTER_BUF_SIZE]; struct _AdcInfo *next; struct _AdcInfo *prev; } bAdcInfo_t; typedef bAdcInfo_t bAdcInstance_t; //快速创建实例的宏,name:实例名 ad_seq:序号 filter_en:是否需要滤波 cb:回调 cb_arg:回调参数 #define bADC_INSTANCE(name, ad_seq, filter_en, cb, cb_arg) \ bAdcInstance_t name = { \ .seq = ad_seq, \ .filter = filter_en, \ .callback = cb, \ .arg = cb_arg, \ } ``` ### 接口介绍 ```C //注册ADCHUB实例,所有注册的实例将组成列表 int bAdchubRegist(bAdcInstance_t *pinstance); //喂ADC数据,ad_seq:ADC的序号 ad_val:ADC的值 int bAdchubFeedValue(uint8_t ad_seq, uint32_t ad_val); ``` ### 使用例子 ```C //回调函数 void _AdcCallback(uint32_t ad_val, uint32_t arg) { b_log("%d:%d\r\n", arg, ad_val); if (arg == 2) //可以根据arg来判断是哪个实例的回调 { //..... } } //此处定义实例,序号分别填的是10和16,在喂数据时候要对应 //由于使用同一个回调函数,那么回调带入的参数要区分,分别是1 和 2 bADC_INSTANCE(ADTest, 10, 1, _AdcCallback, 1); bADC_INSTANCE(ADTemp, 16, 1, _AdcCallback, 2); int main() { ... bInit(); //注册实例 bAdchubRegist(&ADTest); bAdchubRegist(&ADTemp); ... } //喂数据,中断里获取ADC值,然后喂数据 void ADC1_2_IRQHandler() { uint32_t tmp = 0; if (ADC_GetITStatus(ADC1, ADC_IT_JEOC) == SET) { ADC_ClearITPendingBit(ADC1, ADC_IT_JEOC); tmp = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1); bAdchubFeedValue(10, tmp); tmp = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_2); bAdchubFeedValue(16, tmp); } } ```