OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5324|回复: 7

750用ADC采集电压,卡死在ISR寄存器的EOC里了,以及采集的电压一直不对

[复制链接]

2

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2020-12-11
在线时间
7 小时
发表于 2021-6-10 17:45:00 | 显示全部楼层 |阅读模式
10金钱
前面的adc初始化是按照开发板流程来的,检查了寄存器的值也都没有问题。



u16 Get_Adc(u8 ch)   
{
        ADC1->PCSEL|=1<<ch;                        //adc转换通道预选择
                 
        ADC1->SQR1&=~(0X1F<<6*1);        //    规则序列1通道清零
        ADC1->SQR1|=ch<<6*1;                //    设置规则序列1的转换通道为ch
        ADC1->CR|=1<<2;                       //    启动规则转换通道
        while(!(ADC1->ISR&1<<2));        //                                                                       会卡死在这里,发现EOC的值并没有置1,无法转换通道结束
        return ADC1->DR;                        //                                                                      DR寄存器的值总是为0xFFFF,或者干脆为0.
}



最佳答案

查看完整内容[请看2#楼]

debug的时候开启peripherals查看寄存器的值就会将EOC的值重新置0,并卡在while里,直接debug全速运行也一样会卡在while里面,但是如果先进入外层的while循环,再全速运行,就不会再卡死,请教一下各位大哥这是为啥
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2020-12-11
在线时间
7 小时
 楼主| 发表于 2021-6-11 12:07:00 | 显示全部楼层
我查看了跟ADC相关的寄存器,相应的状态都跟预想的一样,唯独ISR 的EOC位无法置1,查看手册说是当转换完成就会将通过EOC置1,但是当开启转换后,EOS置1,EOSMP置1,ADC1_DR的值变为0xFFFF,但是EOC没用变化,一直都是0
回复

使用道具 举报

2

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2020-12-11
在线时间
7 小时
 楼主| 发表于 2021-6-10 17:45:01 | 显示全部楼层
debug的时候开启peripherals查看寄存器的值就会将EOC的值重新置0,并卡在while里,直接debug全速运行也一样会卡在while里面,但是如果先进入外层的while循环,再全速运行,就不会再卡死,请教一下各位大哥这是为啥
回复

使用道具 举报

2

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2020-12-11
在线时间
7 小时
 楼主| 发表于 2021-6-10 17:54:32 | 显示全部楼层
初始化
void Adc_Init(void)
{
//先初始化 IO 口
RCC->AHB1ENR|=1<<5; //使能 ADC1/2 时钟
RCC->AHB4ENR|=1<<0; //使能 PORTA 时钟
GPIO_Set(GPIOA,PIN5,GPIO_MODE_AIN,0,0,GPIO_PUPD_NONE);
//PA5,模拟输入,不带上下拉
RCC->AHB1RSTR|=1<<5; //ADC1/2 复位
RCC->AHB1RSTR&=~(1<<5); //复位结束
RCC->D3CCIPR&=~(3<<16); //ADCSEL[1:0]清零
RCC->D3CCIPR|=2<<16; //ADCSEL[1:0]=2,per_ck 作为 ADC 时钟源,
//默认选择 hsi_ker_ck 作为 per_ck,频率:64Mhz
ADC12_COMMON->CCR|=1<<18;
//PRESC[3:0]=1,输入时钟2分频,即adc_ker_ck=per_ck/2=64/2=32Mhz(不能超过36Mhz)
ADC1->CR=0; //CR 寄存器清零,DEEPPWD 清零,从深度睡眠唤醒.
ADC1->CR|=1<<28; //ADVREGEN=1,使能 ADC 稳压器
delay_ms(10); //等待稳压器启动完成,约 10us,延时大一点,没关系.
ADC1->CR|=1<<8;
//BOOST=1,ADC 工作在 boost 模式(ADC 频率大于 20M 的时候,必须设置 boost 位)
ADC1->CFGR&=~(1<<13); //CONT=0,单次转换模式
ADC1->CFGR|=1<<12; //OVRMOD=1,复写模式(DR 寄存器可被复写)
ADC1->CFGR&=~(3<<10); //EXTEN[1:0]=0,软件触发
ADC1->CFGR&=~(7<<2); //RES[2:0]位清零
ADC1->CFGR|=0<<2; //RES[2:0]=0,16 位分辨率(0,16 位;1,14 位;2,12 位;3,10 位;4,8 位.)
ADC1->CFGR2&=~((u32)15<<28);//LSHIFT[3:0]=0,不左移,数据右对齐.
ADC1->CFGR2&=~((u32)0X3FF<<16);//OSR[9:0]=0,不使用过采样
ADC1->CR&=~((u32)1<<30); //ADCALDIF=0,校准单端转换通道
ADC1->CR|=1<<16; //ADCALLIN=1,线性校准
ADC1->CR|=(u32)1<<31; //开启校准
while(ADC1->CR&((u32)1<<31));//等待校准完成
ADC1->SQR1&=~(0XF<<0); //L[3:0]清零
ADC1->SQR1|=0<<0; //L[3:0]=0,1 个转换在规则序列中也就是只转换规则序列 1
//设置通道 19 的采样时间
ADC1->SMPR2&=~(7<<(3*9)); //通道 19 采样时间清空
ADC1->SMPR2|=7<<(3*9); //通道 19 810.5 个周期,提高采样时间可以提高精确度
ADC1->CR|=1<<0; //开启 AD 转换器
}
回复

使用道具 举报

1

主题

385

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1023
金钱
1023
注册时间
2019-9-21
在线时间
269 小时
发表于 2021-6-10 18:44:30 | 显示全部楼层
回复

使用道具 举报

2

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2020-12-11
在线时间
7 小时
 楼主| 发表于 2021-6-11 09:51:44 | 显示全部楼层
gjs13030247996 发表于 2021-6-10 18:44
可以参考一下这个链接:https://blog.csdn.net/weixin_38345163/article/details/107127478

很感谢你的回答,但是我查看了我的寄存器状态是正常的,与链接中的博主情况不一样
回复

使用道具 举报

2

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2020-12-11
在线时间
7 小时
 楼主| 发表于 2021-6-11 09:53:47 | 显示全部楼层
回复

使用道具 举报

2

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2020-12-11
在线时间
7 小时
 楼主| 发表于 2021-6-14 12:40:48 | 显示全部楼层
求助一手
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 14:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表