从看到 STM32F3 系列的介绍就非常激动于其模拟信号是的大幅度加强. 拿到 STM32F3DISCOVERY 一直在琢磨, 玩什么才能发挥其特别强大的模拟外设的功能.
1. ADC 性能测试
介于上次对 F051 的 ADC 测试冒出的错位和 OVERRUN 的问题, 决定对 F303 也先做此类似的测试.
采样最多到9通道的外部通道+3个内部通道. 连续测试很久, 没有捕捉到错位现象和 OVERRUN 标志.
还没有采用最快采样速度和最高时钟频率, 留下再进一步测试.
有个很奇怪的问题, 按照数据手册, 在 CONT 置位的软件触发模式下, 设置 ADSTART 位后, 我理解为应该是连续重复采样的. 但是发现每次一个规则序列采样结束后, ADSTART 位会由硬件自动清除!
见 RM316 Rev1 的 P216:
12.4.13 Starting conversions (ADSTART, JADSTART)
Note: 1 In continuous mode (CONT=1), ADSTART is not cleared by hardware with the assertion of
EOS because the sequence is automatically relaunched.
上面是 CC_SRAM 里运行, CPU 主频 72Mhz. ADC 时钟为 RCC_ADC12PLLCLK_Div2 的测试.
为了提高触发 OVERRUN 的可能性, 首先提高 ADC 时钟为 RCC_ADC12PLLCLK_Div1 再测试. 但测试后也没有捕捉到错位现象和 OVERRUN 标志.
考虑到 CC_SRAM 里运行, 指令读取在 I-BUS, 是0 等待的, 这样 CPU 的总线矩阵的空闲率还是比较高.
于是决定增加数据贪吐率再测试, 方法是前台主程序里增加数据读写操作; 于是在前台主程序里, 进行大数组从 FLASH 搬移到 RAM 的工作. 继续 ADC 转换, 经过一个多小时的测试, 没有捕捉到 OVERRUN.
基本认为, ADC 方面的性能得到了提升.
2. DIY 一个示波器, 由于 STM32F3DISCOVERY 的 STM32F303 有 4 路独立的 ADC, 而且每个 ADC 的转换速度可以达 5Mps. 单芯片就能做到实时采样达 5M 的 4 通道示波器. 蛮有吸引力和挑战的设计.
方案设计:
1. 存储器分配: STM32F303 的 SRAM 为 40KB, 对于这个设计并不充裕, 为了高效利用存储器, 示波器 ADC 的采样深度设为 8 位, 除了系统使用外, 可以将 32KB SRAM 来做采样数据, 这样每个通道可以 8K 的采样存储.
2. 采样通道: 通常高速 ADC 采样要求信号源的阻抗不能太大. 为了避免使用高速运放. 决定利用内部 PGA 作为采样的前级运放. 因为 PGA 可选 2,4,8,16 倍放大, 这样还可以纯软件实现 4 级 Y 方向的放大倍率.
3. 界面: 手头有个 7 寸 TFT 屏, 有了它就完全可以做到细致的波形显示. 但最大的缺陷是缺少输入接口. 如果时间充足的话, 可以将 LCD 的触摸屏功能调出来做手触控制波形显示. 不过第一步先连上本人的现成键盘数码板, 以提供上下左右这些最基本的按键输入.
4. 软件方案: 首先是控制 ADC 采样, 采用定时器触发是最节省软件资源的办法. 为了实现5M 和 2M 的采样率. 定时器的时钟要求是 10MHz 的整数倍. 考虑 8MHz 的晶振不想去更换, 40MHz 的主频太低了, 决定将主频稍做提升到 80MHz. 可以8分频后给 TIM1 提供时钟. ADC 用 1 通道的规则转换, 非连续转换方式. 根据手册 RM316, TIM1 有好多信号可以自动触发 ADC 转换, 先考虑由 TIM1 的 TRGO 信号来触发. 然后通过 DMA 方式将转换结果保存做采样存储器. 分别由 DMA1 通道1, DMA2 通道1, DMA2 通道5, DMA2 通道2 来完成. 最后由 DMA 中断关闭定时器 TIM1, 通知主程序更新 LCD 显示. 如果是触发方式, 也可以通过 ADC 看门狗来触发延时关闭定时器 TIM1, 再通知主程序更新 LCD 显示.
回头检查一下, 对照数据手册, 感觉方案里没有什么缺陷. 于是开始动手搭硬件平台, 找来大把杜邦线来连接 STM32F3DISCOVERY 和 LCD 和键盘数码板. 连接完成, 先还是运行之前的 ADC 测试程序. 咦, 怎么按键没有反应? 一会儿忽然飘来一股焦味, 还在迟疑间 LCD 的屏幕暗了, 赶紧拔下 STM32F3DISCOVERY 的 USB 连线! 拆掉所有线再上电, STM32F3DISCOVERY 没有反应, 拔下, 插上 U 盘. 还好, 灯闪烁, u 盘正常, 电脑口没有坏. 再检查 STM32F3DISCOVERY 发现 D2 烧毁了. 小问题, 修理一下继续.
几个晚上下来, LCD 的显示很顺利的完成了. 但是后来的 ADC 采样部分颇费周折. 这个定时器 TRGO 触发 ADC 怎么都不好使. 验证通过软件触发 ADC, 然后由 DMA 完成数据的存储, 完成. 但是在自动触发上, 不知是 TRGO 生成的问题, 还是 ADC 接受触发信号的问题. 采用 Update 触发, 或者各个 OCxREF 触发 TRGO, 都不能触发 ADC, 更换定时器 TIM3 的 TRGO , 也没有能触发 ADC. 由于 TRGO 是个内部信号, 无法检测, 又让 TIM1 的 OC2 生成 PWM 信号, 输出通过 PE11 检测到波形, 再选择 TIM1 的 OC2REF, 也没有触发 ADC. 再试用 PE11 的信号生成 EXTI11, EXTI 中断验证完成, 改设成事件, 还是没有触发 ADC. 这已经是最后一个晚上了, 时间过于仓促. 不得已先采用定时中断里软件触发 ADC 的办法, 让系统先跑起来. 先上个离散点方式的采样图形. 等以后有空再完善这个示波器.
体会: STM32F3DISCOVERY 由于搭载 STM32F303, 由于增加了很多模拟功能, 在应用中可以做很灵活的设计. 但是在编程中发现参考资料严重不足. 遇到问题, 发现编程手册 RM316 并没有说得很清楚 (象遇到的这个 ADC 触发问题), 而外设库里面带的例子也过于简单, 对于深入一些的应用基本没有啥帮助. 另外 STM32F303 一些内部信号功能的确强大 (比如 TRGO), 单对其的调试和验证却缺乏手段, 一则没有办法引出来让示波器捕捉, 二则不能通过寄存器软件捕捉, 导致这个信号很难捉摸. 对软件的调试验证带来了很大的不确定性. |
|