📄 adc.c
字号:
{
volatile uint32 uiOffsetBase;
volatile uint32 *puiBaseAddr;
if (uiID >= __ADC_MAX_NUM) { /* 检查参数有效性 */
return (uint32)(OPERATE_FAIL);
}
IRQDisable(); /* 关IRQ中断 */
uiOffsetBase = __GpADCInfoData[uiID]->uiOffsetBase;
puiBaseAddr = __GpADCInfoData[uiID]->puiAddrBase;
if (__GpADCInfoData[uiID]->uiBurst == TRUE) { /* 硬件控制模式 */
puiBaseAddr[__B_ADC_ADCR << uiOffsetBase] &= (~(0x01 << 16)); /* Burst = 0,终止重复扫描 */
} else {
puiBaseAddr[__B_ADC_ADCR << uiOffsetBase] |= (~(__GpADCInfoData[uiID]->uiStart << 24));
/* 软件控制模式,则Start位置0 */
}
/*
* 记录状态信息
*/
__GpADCInfoData[uiID]->uiStart = FALSE;
IRQEnable(); /* 开IRQ中断 */
return (uint32)(OPERATE_SUCCESS);
}
/*********************************************************************************************************
** Function name: adcGetValue
**
** Descriptions: 读取ADC转换结果
** input parameters: uiID --部件设备号:0-ADC0
** uiChn --ADC读取结果通道号
** pRsv --保留指针参数,可输入NULL.
** Output parameters: OPERATE_FAIL -- 操作失败
** Returned value: 读取ADC结果 -- 操作成功
**
** Using example :
*********************************************************************************************************/
uint32 adcGetValue (uint32 uiID,
uint32 uiChn,
void *pRsv)
{
uint32 uiOffsetBase;
volatile uint32 *puiBaseAddr;
volatile uint32 uiReadAdcData;
static uint8 ucRetMsg;
volatile uint8 *ucDone;
uint8 i;
/*
* 检查参数有效性
*/
if ((uiID >= __ADC_MAX_NUM) ||
(uiChn > __ADC_CHN_NUM)) { /* 输入通道号值范围为0 ~ 7 */
return (uint32)(OPERATE_FAIL);
}
pRsv = pRsv ; /* 为了防止编译器警告 */
/*
* 全局参数处理
*/
IRQDisable(); /* 关IRQ中断 */
uiOffsetBase = __GpADCInfoData[uiID]->uiOffsetBase;
puiBaseAddr = __GpADCInfoData[uiID]->puiAddrBase;
ucDone = __GpADCInfoData[uiID]->ucDoneFlg;
IRQEnable(); /* 开IRQ中断 */
/*
* 读取ADC转换结果 中断方式
*/
if ((ucDone[uiChn] == TRUE) &&
((__GpADCInfoData[uiID]->uiAdcState == ADC_OK) ||
(__GpADCInfoData[uiID]->uiAdcState == ADC_PAUSE))) {
/* 对应通道已转换结束 */
for (i = 0; i < __ADC_CHN_NUM; i++) {
if (QueueRead(&ucRetMsg,__GpADCInfoData[uiID]->AdcQueAddr) == QUEUE_OK) {
ucRetMsg &= 0x07; /* 获取所读取的通道号最旧值 */
if (ucRetMsg == ucDone[uiChn]) { /* 是所要读取的通道号 */
if (QueueRead(&ucRetMsg,__GpADCInfoData[uiID]->AdcQueAddr) == QUEUE_OK) {
/* 读取已转换的对应通道值,返回 */
uiReadAdcData = ucRetMsg; /* 读取10位转换结果的低8位 */
if (QueueRead(&ucRetMsg,__GpADCInfoData[uiID]->AdcQueAddr) == QUEUE_OK) {
uiReadAdcData |= (ucRetMsg << 8); /* 读取高2位,存入32位变量中 */
}
return (uiReadAdcData);
}
} else { /* 丢弃非对应通道后两个字节数据*/
QueueRead(&ucRetMsg,__GpADCInfoData[uiID]->AdcQueAddr);
QueueRead(&ucRetMsg,__GpADCInfoData[uiID]->AdcQueAddr);
}
}
}
} else { /* 对应通道正在转换 */
return (uint32)(ADC_BUSY);
}
return (uint32)(OPERATE_FAIL);
}
/*********************************************************************************************************
** Function name: __adcIsrSub
**
** Descriptions: 读取ADC转换结果
** input parameters: uiID --部件设备号:0-ADC0
** pRsv --保留指针参数,可输入NULL.
** Output parameters: OPERATE_FAIL -- 操作失败
** Returned value: OPERATE_SUCCESS -- 操作成功
**
** Notice: 只对采样结果进行保存,具体处理留给用户处理.
*********************************************************************************************************/
static uint32 __adcIsrSub (uint32 uiID, void *pRsv)
{
volatile uint32 uiChn;
uint32 uiOffsetBase;
volatile uint32 *puiBaseAddr;
static volatile uint32 uiAdcData;
volatile uint8 ucAdcDataH;
volatile uint8 ucAdcDataL;
uint8 ucAdcChnFlg;
uint32 uiAdcChn;
uint16 usAdcBufNdata;
uint16 usAdcBufSize;
uint32 uiAdcCtrlState;
if (uiID >= __ADC_MAX_NUM) { /* 检查参数有效性 */
return (uint32)(OPERATE_FAIL);
}
pRsv = pRsv ; /* 为了防止编译器警告 */
IRQDisable(); /* 关IRQ中断 */
uiOffsetBase = __GpADCInfoData[uiID]->uiOffsetBase;
puiBaseAddr = __GpADCInfoData[uiID]->puiAddrBase;
uiAdcData = puiBaseAddr[__B_ADC_ADDR << uiOffsetBase];
/*
* 记录已转换通道信息
*/
uiChn = ((uiAdcData >> 24) & 0x07);
uiChn = ((4 * ((uiChn >> 2) & 0x01)) + (2 * ((uiChn >> 1) & 0x01)) + (1 * ((uiChn >> 0) & 0x01)));
__GpADCInfoData[uiID]->ucUseChn[uiChn] = TRUE;
__GpADCInfoData[uiID]->ucDoneFlg[uiChn] = TRUE;
IRQEnable(); /* 开IRQ中断 */
/*
* 读取ADC对应通道转换结果(10位)
*/
ucAdcDataL = (uint8)((uiAdcData >> 6) & 0xFF); /* 读取低8位 */
ucAdcDataH = (uint8)((uiAdcData >> 14) & 0x03); /* 读取高2位 */
__GpADCInfoData[uiID]->uiAdcState = ADC_BUSY; /* ADC工作忙 */
uiAdcCtrlState = (__GpADCInfoData[uiID]->uiBurst == TRUE) ? (ADC_BURST) : (ADC_SOFE);
/* 记录ADC控制方式状态 */
/*
* AD转换结果处理,数据入队缓冲
*/
uiAdcChn = __GpADCInfoData[uiID]->uiChnNum; /* 初始化时所记录的通道号个数 */
usAdcBufNdata = QueueNData(__GpADCInfoData[uiID]->AdcQueAddr);
usAdcBufSize = QueueSize (__GpADCInfoData[uiID]->AdcQueAddr);
if ( __GpADCInfoData[uiID]->AdcQueAddr== NULL) { /* 检查数据队列是否已创建 */
return (uint32)(OPERATE_FAIL);
}
if ((uiAdcChn != 0) && (usAdcBufNdata < usAdcBufSize)) { /* 检查通道号,数据队列是否已满 */
ucAdcChnFlg = (uint8)(0xA0 | (__GpADCInfoData[uiID]->ucDoneFlg[uiChn] & 0x07));
if ((QueueWrite(__GpADCInfoData[uiID]->AdcQueAddr,ucAdcChnFlg)) == QUEUE_OK) {
if ((QueueWrite(__GpADCInfoData[uiID]->AdcQueAddr,ucAdcDataL)) == QUEUE_OK) {
if ((QueueWrite(__GpADCInfoData[uiID]->AdcQueAddr,ucAdcDataH)) == QUEUE_OK) {
__GpADCInfoData[uiID]->uiAdcState = ADC_OK; /* ADC操作成功 */
__GpADCInfoData[uiID]->uiChnNum--; /* 工作通道号减一 */
if ((__GpADCInfoData[uiID]->uiChnNum == 0) && (uiAdcCtrlState== ADC_BURST)) {
/* Burst模式下才执行停止 */
__GpADCInfoData[uiID]->uiAdcState = ADC_PAUSE;
adcStop(uiID); /* 当通道转换完一次循环,停止ADC*/
}
return (uint32)(OPERATE_SUCCESS);
}
}
}
}
/*
* 错误处理
*/
if ((__GpADCInfoData[uiID]->uiChnNum == 0) && (uiAdcCtrlState== ADC_BURST)) {
/* Burst模式下才执行停止 */
__GpADCInfoData[uiID]->uiAdcState = ADC_PAUSE;
adcStop(uiID); /* 当通道转换完一次循环,停止ADC*/
}
__GpADCInfoData[uiID]->uiAdcState = (usAdcBufNdata < usAdcBufSize) ? ADC_ERR : ADC_BUF_FULL;
return (uint32)(OPERATE_FAIL); /* ADC操作失败 */
}
/*********************************************************************************************************
** Function name: adc0Isr
** Descriptions: ADC0中断服务程序
** input parameters: 无
** Returned value: 无
*********************************************************************************************************/
void adc0Isr (void)
{
__adcIsrSub(ADC_0,NULL); /* 调用中断响应函数 */
adc0Hook(); /* 调用用户的钩子函数 */
VICVectAddr = 0x00; /* 中断处理结束 */
}
#endif /* ADC_FUN_LIB */
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -