高级会员
- 积分
- 616
- 金钱
- 616
- 注册时间
- 2015-6-29
- 在线时间
- 101 小时
|
最近在学习STM8S,使用的是STM8SF103F3 ,网上一块最小板5元~~在学习ADC模块时,想实现像STM32那样的多通道连续扫描的效果,网上搜了一下,都没发现合自己心水的代码,想着反正有中文版的参考手册,自己写吧,估计跟STM32差不多。没想到一写,才发现跟STM32的有点不一样,差点把自己搞晕了,主要注意以下几点:
1、我使用的这个芯片没有DMA,还好多了一个数据缓存寄存器,配合中断也是基本上能达到STM32使用DMA的效果;
2、STM8S的AD的扫描模式比较坑爹,只能规定从AIN0通道开始转换,一直转换到AINn通道,跟STM32可以指定扫描序列相比简直不能忍;
3、按照正常思路,在AD的转换完成中断函数中要清除相应的标志位,一开始直接调用库函数ADC1_ClearITPendingBit(ADC1_IT_EOC),发现又跪了,仔细看参考手册,发现有这么一段话:
“在扫描模式中,不要使用位操作指令去清除EOC标志位,这是因为该指令是对整个ADC_CSR寄存器的一个读-修改-写操作。而在扫描转换的过程中,序号CH[3:0]位的值是被硬件自动更新的,它总是保存当前正在被转换的通道编号,从CH[3:0]寄存器中读取当前的通道编号和写回该寄存器,将会改变扫描序列的最后通道编号。
在连续扫描模式中正确的清除EOC标志位的方法是从一个RAM变量中载入一个字节到ADC_CSR寄存器,这样来
清除EOC标志位同时还重新载入扫描序列新的最后通道编号。”
这个不仔细看还真的掉坑里面去了。
不知道我的理解对不对,还请大家多多指教,最后附上代码:
|
|