STM32F103VC中ADC模拟看门狗问题-LL库
单通道示例
初始化配置
LL_ADC_StartCalibration(ADC1); /* 开始自校验 */
// LL_ADC_EnableIT_EOS(ADC1); /* 使能单次转换中断 */
LL_ADC_Enable(ADC1);
while(LL_ADC_IsCalibrationOnGoing(ADC1));
// LL_ADC_EnableIT_EOS(ADC1);
LL_ADC_REG_StartConversionSWStart(ADC1);
中断配置
void ADC1_2_IRQHandler(void)
{
/* USER CODE BEGIN ADC1_2_IRQn 0 */
static uint8_t adcConvChannel = 1;
if (LL_ADC_IsActiveFlag_AWD1(ADC1))
{
// AWD中断触发
// 清除AWD中断标志位
LL_ADC_ClearFlag_AWD1(ADC1);
}
if((LL_ADC_IsActiveFlag_AWD1(ADC1) != 0))
{
// 禁用AWD中断
// LL_ADC_DisableIT_AWD1(ADC1);
ADC_WATCHDOG_DEAL(adcConvChannel);
adcConvChannel = 4;
do
{
adcConvChannel++;
LL_ADC_ClearFlag_AWD1(ADC1);
}while(LL_ADC_IsActiveFlag_AWD1(ADC1));
}
/* USER CODE END ADC1_2_IRQn 0 */
/* USER CODE BEGIN ADC1_2_IRQn 1 */
// LL_ADC_EnableIT_EOS(ADC1);
// LL_ADC_EnableIT_AWD1(ADC1);
// LL_ADC_Enable(ADC1);
// LL_ADC_REG_StartConversionSWStart(ADC1);
/* USER CODE END ADC1_2_IRQn 1 */
}
未使能单次转换中断
- STRT:LL_ADC_REG_StartConversionSWStart之后会执行,表示转换完成
触发模拟看门狗中断
疑问一: 上图中可以看到DR寄存器未超过阈值
解惑:
- 从数据手册可以看到,转换的数据未放到总线上就被看门狗取走用作中断条件,但此时SR寄存器中的EOC位是上一次转换的EOC标志位,所以,本次取到的ADC转换值是没有办法获取到的
注意点:
- 取消单次转换中断和模拟看门狗中断使能是不会清楚中断触发标志位的
- 读取数据也可以清除EOC标志位
- 但是清楚ADON,关闭ADC转换是可以清除中断标志位,但不会清除中断使能
问题1
- 这里清除EOC标志位没有起到作用,第一感觉是函数没有执行成功
再往下执行,这个中断没有进来,感觉是ST-Link有点问题(未解决)
坑
- 我把中断使能打开之后,这个函数就进来了,所以每次进入中断的时候,一定先关断使能(这句话不对)
我在里面打断点就能进入do{}while,不打断点就就不去do{}while,实际带上个led灯操作是没有执行的,这应该是keil或者st-link的bug
多个通道执行模拟看门狗
- 配置多通道,扫描模式,不使能单次转换中断,使用DMA,无法判断是哪个通道触发的模拟看门狗
- 配置多通道,扫描模式,使能单次转换中断,使用DMA,中断次数过多,放弃这个方法
存在的问题
- 使用DMA,DMA从总线上拿数据,模拟看门狗中断后,拿到的数据是有问题的