table of contents
前言
之前 刚刚跳出了 串口的坑,万分高兴的同时继续下一个函数功能的验证,普通的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 功能也是能用了,真是一步一个坑,不过,掉坑里再爬出来学的是最多的。坑永远都有,但我下次爬坑的速度更快了。