stm32f091 掉坑历险记 - ADC


前言

之前 刚刚跳出了 串口的坑,万分高兴的同时继续下一个函数功能的验证,普通的io口很简单就通过了,然后adc 一脚踩到了坑里 T.T

一、adc 单次传输

基本的配置也很简单 也不用什么remap操作,
照着例程 配置gpio 选择gpio_mode_an,
然后就是adc功能配置, 设为单词转换模式+adc校准
然后 在while里等待ready标志位

二、adc 与 eoc 标志位

正常来说都没啥问题,就配置采样通道,然后调用 ADC_StartOfConversion() 开始采样,eoc 标志位是硬件置位的,然后我就卡在了 while 等待这个eoc 标志位 这里, 也就是一脚踩进了坑里,开始时以为是其他的gpio配置影响到了这个,但是我一想,不可能啊,我GPIOA 的ADC 跟GPIOE的有什么关系呢? 寻思好久没有头绪,开始打开keil 的寄存器观察窗口, 唉 我的keil 的system viewer 是空的 又增加了难度,无奈只能用 右下角窗口的 memery1 然后输入ADC 的地址了(寄存器映射也是没问题)还好isr 的偏移位很好认,一下就找到了 ,发现我开始转换的时候 之后有一瞬间,eoc 是 置一的! 但是又马上置0了,然后找到了这个现象,就在网上搜,找到了个前辈的笔记,真的佩服,能通过这现象联想到这个keil 仿真读取dr 寄存器 然后清0 了 eoc。
https://www.pianshen.com/article/60061131890/

这里有个小问题,既然keil 读取寄存器会导致某些硬件置位的标志位会清0,那我之前读串口 的时候为啥又不会把标志位清了呢?

三、adc 配置

本来以为没问题了, 结果程序一跑 还是遇上了鬼故事, 我在配置adc 之前配置了一些普通的io输入输出口,本来就是跟这个adc 的端口一点都不相干的,结果就是 配置完输入之后,adc采集的数就完全不对了 直接是16位的数(正常来说是12位)经过一系列的鬼打墙之后,我慢慢的静下心来,一个一个寄存器的值来看,后来发现 配置adc结构体的时候 由于是软件触发,就没有配置外部触发通道的这个成员,结果就是放任这个成员自己赋值,观察到配置完io口之后,这个成员的初始值会有一些奇特的值,完全不在函数的考虑范围内,所以配置就出现了未知错误,当我把这个成员也赋值了之后,采集就没问题了,(所以之后配置这些外设,需要把所有的结构体成员的值都要自己赋值一遍,不要让它放任自流)

四、adc 采集

在上面的一系列debug 之后,终于能有正确的值了,然后我就很高兴的 使用单adc 单通道单次扫描,while里面循环读取 3个channel 的值,然后 鬼故事又来了, 三个端口分别接的是不同的测量电压,只采集一个的时候能有正确的值,但是 两个开始 就出现了问题了,总是只能测到某一个通道的值,也没有搞懂为什么,我只是脑海中有个想法,直接读完再次配置adc,然后3个就能读取正确的值了,我想问题应该出现在配置里,可能是有些配置固定了之后得deinit 去才能更改。

总结

虽然还有些小问题,但是adc 功能也是能用了,真是一步一个坑,不过,掉坑里再爬出来学的是最多的。坑永远都有,但我下次爬坑的速度更快了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值