b_mod_adchub
数据结构
//回调 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, \
}
接口介绍
//注册ADCHUB实例,所有注册的实例将组成列表
int bAdchubRegist(bAdcInstance_t *pinstance);
//喂ADC数据,ad_seq:ADC的序号 ad_val:ADC的值
int bAdchubFeedValue(uint8_t ad_seq, uint32_t ad_val);
使用例子
//回调函数
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);
}
}