从入门到放弃☞ ..\\STC8H1K16的adc标志位不清零导致看门口复位
问题
<1>程序逻辑 上电初始化所有外设 包括adc
<2>初始化阶段去掉等待标志位的语句 程序正常
<3> 上电读取一段adc值存在数组里 所以需要再初始化以后开始执行
为啥只有去掉等待标志位的语句 while (!(ADC_CONTR & ADC_FLAG));
ADC_CONTR &=~ADC_FLAG; 程序才能正常 而主循环里 不去掉这个 while (!(ADC_CONTR & ADC_FLAG));
ADC_CONTR &=~ADC_FLAG;又可以正常运行
看截图 我准备了两个函数uint16_t adc_result(uint8_t CH) 和 uint16_t adc_no_wait_flag(uint8_t CH)来解决问题 但这不是正常的办法 肯定是哪里问题我不知道
请打包上传可以复现问题的简化项目,这样方便排查。 乘风飞扬 发表于 2024-3-15 09:03
请打包上传可以复现问题的简化项目,这样方便排查。
uint16_t adc_wait_3ms_flag(uint8_t CH)
{
uint16_t result = 0;
ADC_CONTR = ADC_POWER | ADC_START | CH;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG))
{
if (tm0.adc_ms_wait_ticks > 5)
{
tm0.adc_ms_wait_ticks = 0;
// 超过 3ms 未检测到标志位,自动设置标志位并跳出循环
//infoss("Indeed, no ADC flag position 1 was detected within 3ms. I forced it to be 1","adc_wait_3ms_flag(4)");
infols("Indeed, no ADC flag position 1 was detected within 3ms. I forced it to be 1");
ADC_CONTR |= ADC_FLAG;
break;
}
}
if (ADC_CONTR & ADC_FLAG)
{
ADC_CONTR &= ~ADC_FLAG;
result = ADC_RES << 8 | ADC_RESL;
}
return result;
}没认真研究为什么了 定时器定时3ms 标志位等不到 强行置1
页:
[1]