STM32F103C8T6-第一步。开始制作示波器

关于AVR之后首次接触STM32的喜悦和困难。当我执行最简单的任务时-将数据传输到PC。


有一些AVR的经验,我想比较一下到达的控制器(价格分别为1.7美元/单位)和价格接近的控制器,价格为ATMEGA328(1.4美元/单位)。
ATMEGA328STM32F103C8T6胜利,时代
闪光灯,kB32642
内存,kB2二十10
最大频率,MHz二十723.6
ADC速度,kSPS十五2 * 1000(可以超频)133

在性能指标增加10到100倍的背景下,闪存仅增加了2倍。此外,这64 kB的消耗几乎比AVR上的32 kB消耗更快。在需要高性能但没有代码密集型算法(例如示波器)的地方使用此类控制器是合乎逻辑的。

调试板外观: 从左到右:
图片

  • Arduino UNO(ATmega328P),3.59美元 ;
  • 我们的电路板,我们将要折磨(STM32F103C8T6),4.97美元
  • STM32F103C8T6上的另一个调试板,3.92美元
  • Arduino的纳米(ATMEGA328P),2.23 - $ 2.56


如何编程


STM32有很多编程环境-IAR,Keil,Coocox……起初看起来不错,您肯定会找到合适的东西。然后是对这样一个动物园如何形成的理解。只是有人做了一个不是很好的IDE。其他人看着它,并决定他们可以做得更好。他们做到了。从某些方面来看,结果更好,但更糟。阅读评论并尝试IAR之后,我选择了Coocox。

还有另一个程序-STM32CubeMX。事实是,STM32中的外设比AVR中的要多得多。初始化它要困难得多。STM32CubeMX允许您选择一个控制器,用鼠标戳戳并生成初始化代码。即使我们不想使用此生成的代码,在STM32CubeMX中,也可以方便地查看引脚排列和时钟方案,选择除数,因数并手动在代码中注册它们!强烈推荐给所有初学者!

STMStudio是一个程序,允许实时监视MK中的变量值。

作为程序员,我决定以2.6美元的价格使用便宜的ST-Link V2
一切都非常简单地连接在一起。取得JTAG引脚,


查看ST-Link上的图片, 然后连接导线(ST-LINK-> JTAG):



  • GND->引脚20;
  • 3.3V->引脚1;
  • RST->针15;
  • SWCLC->引脚9;
  • SWDIO->引脚7。

运行CoIDE,编写
#include "stm32f10x.h"
int main(void)
{
	RCC->APB2ENR |= RCC_APB2Periph_GPIOC; //   
	GPIOC->CRH |= (0x3 << 20); //   50 
	GPIOC->CRH &= (~(0xC << 20)); //      -
	volatile long i = 0;
	while(1)
	{
		GPIOC->BSRR = GPIO_BSRR_BR13;
		for(i = 0; i < 1000*1000*5; i++){;};
		GPIOC->BSRR = GPIO_BSRR_BS13;
		for(i = 0; i < 1000*1000*5; i++){;};
	}
}

, AVR, , 2264 Flash… , AVR .
— 2176 .
STDLIB — 1476 .

编译,刷新……一切立即生效!不用铃鼓跳舞!甚至在线调试器也能正常工作!我们启动STMStudio-它可以工作。在MK操作过程中建立变量图!板上有跳线,但您无需切换任何程序即可编程/启动MK!就像使用Arduino!好吧,它不可能那么好……但事实并非如此。

开始制作示波器


在我的梦想中,示波器应按以下方式工作:
两个ADC以1-2 MSPS的速度同时处理信号。接下来的2个选项:
  1. 所有这些都通过USB实时传输到PC,然后决定如何处理它(记住,建立图形,以某种方式处理,...);
  2. . : (, , , ). .

这两个选项都无法实现。
首先是因为我无法启动USB。相反,我只能在STM32CubeMX中生成项目。但是将其导出到CoIDE之后,必须使用跳线更改引导加载程序以进行编程/操作,这并不方便。因此,我拒绝了该选项。好吧,此外,USB速度仅为12 Mb / s。实时高速数据仍然不适合。为了以某种方式将数据传输到计算机,我连接了 当时购买的用于对Arduino Pro Mini进行编程的USB <-> UART转换器 涵盖了第二个选项,因为中断处理程序的持续时间长于ADC。速度仅限于340-500 kSPS,比预期的要低几倍。





唯一有效的高速选项是:当我们需要计量时,ADC连续工作,打开DMA,等待缓冲区填充,关闭DMA并通过USART缓慢将数据传输到PC。此选项超出了所有预期。 MK可以超频,因此通过两个ADC可获得9 MSPS!那些。比文档多4.5倍!在这种情况下,观察频率高达1 MHz的信号非常舒适。与我们之前在Arduino(10 kSPS)上成功实现的结果相比,结果非常好-速度提高了900倍!

但是,通过超频,并不是所有事情都那么快乐。将来,为了使USB工作,必须将频率降低16/9 = 1.8倍,然后只能获得5 MSPS。

在尝试处理USB和其他外围设备时,我意识到这些控制器的显着缺点-互联网上的信息很少。如果AVR有很多功能,那么找到一个以快速交错模式同时运行两个ADC的示例并非易事。

Arduino UNO!被选作示波器测试的信号发生器。不是因为他很好,还是什么。。。只是很快。
写8行:
 void setup() {
  pinMode(2, OUTPUT);  
  long d = 10;
  for(;;){
    PORTD = 255;
    delayMicroseconds(d);
    PORTD = 0;  
    delayMicroseconds(d);
  }
}

void loop() {
  
}


连接USB + 1线(这样3.3伏STM32不会因5伏信号而消失,信号通过2kΩ电阻馈送)就可以了!

结果如下(在每个图像下,在模拟示波器的屏幕​​上都有相同信号的照片): 信号周期0.9μs。1米= 10像素。在示波器上,1个分度= 0.5μs。 信号周期10μs。1米= 5像素。在示波器上,1格= 2μs。顶部被切掉,因为信号超过了ADC参考电压。









下一步是什么


在计划中:
  1. 击败USB放弃USB转换器<-> USART;
  2. 完成模拟部分的工作,以使输入电压范围不是0-3.3 V,而是更合适。
  3. 设为多通道模式;
  4. 通过PC实施控制;
  5. 在这种情况下制作完成的设备。


总之,我提请注意STM32与AVR相比有两个明显的缺点:
  1. 闪存消耗增加;
  2. 外围的复杂初始化,由于缺乏材料而加剧。


我不知道如何做,但是对于这样一个简单的任务,它需要31 kB Flash。
调试板的电路(不容易找到)。

文章的第二部分。

Source: https://habr.com/ru/post/zh-CN384723/


All Articles