STM32F103C8T6 - os primeiros passos. Comece a fazer um osciloscópio

Sobre as alegrias e dificuldades do primeiro contato com o STM32 após o AVR. Como eu implementei a tarefa mais simples - transferir dados para um PC.


Tendo alguma experiência com o AVR, quero comparar os controladores que chegaram (que custam individualmente US $ 1,7 / unidade ) com os mais próximos ao preço do ATMEGA328 ( US $ 1,4 / unidade ).
ATMEGA328STM32F103C8T6Ganhar vezes
Flash, kB32.642
RAM, kB2vinte10
Frequência máxima, MHzvinte723.6.
Velocidade ADC, kSPSquinze2 * 1000 (pode ser feito com overclock)133

No contexto de um aumento nos indicadores de desempenho de 10 a 100 vezes, o Flash aumentou apenas 2 vezes. Além disso, esses 64 kB são consumidos quase mais rapidamente que 32 no AVR. É lógico usar esses controladores onde é necessário alto desempenho, mas não existem algoritmos com uso intensivo de código ... por exemplo, um osciloscópio.

Aparência das placas de depuração: da esquerda para a direita:
imagem

  • UNO do Arduino (ATmega328P), US $ 3,59 ;
  • Nosso conselho, que atormentaremos (STM32F103C8T6), US $ 4,97 ;
  • Outra placa de depuração em STM32F103C8T6, US $ 3,92 ;
  • Arduino Nano (ATmega328P), 2,23 - US $ 2,56 .


Como programar


Existem muitos ambientes de programação STM32 - IAR, Keil, Coocox ... a princípio, parece que é bom e você definitivamente encontrará algo adequado. Depois vem a compreensão de como esse zoológico foi formado. Apenas alguém fez um IDE não muito bom. Os outros olharam para ele e decidiram o que poderiam fazer melhor. E eles fizeram. De certa forma, ficou melhor, em algo pior. Depois de ler os comentários e experimentar o IAR, decidi pela Coocox.

Há outro programa - STM32CubeMX. O fato é que existem muito mais periféricos no STM32 do que no AVR. Inicializar é muito mais difícil. O STM32CubeMX permite selecionar um controlador, cutucar com o mouse e gerar um código de inicialização. Mesmo se não quisermos usar esse código gerado, no STM32CubeMX, é conveniente olhar para o esquema de pinagem e relógio, selecionar os divisores, fatores e registrá-los manualmente em seu código! Altamente recomendado para todos os iniciantes!

STMStudio é um programa que permite o monitoramento em tempo real de valores variáveis ​​no MK.

Como programador, decidi usar o ST-Link V2 barato por US $ 2,6 .
Tudo está conectado de maneira muito simples. Pegue a pinagem JTAG,


veja a imagem no ST-Link e conecte os fios (ST-LINK -> JTAG):



  • GND -> Pino 20;
  • 3.3V -> Pino 1;
  • RST -> Pino 15;
  • SWCLC -> Pino 9;
  • SWDIO -> Pino 7.

Execute CoIDE, escreva
Piscar
#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 .

compile, flash ... e tudo funcionou imediatamente! Sem dançar com pandeiro! Até o depurador no circuito funcionou! Iniciamos o STMStudio - e funciona. Constrói gráficos de variáveis ​​durante a operação MK! Existem jumpers no quadro, mas você não precisa mudar nada para programar / iniciar o MK! Assim como com um Arduino! Bem, não pode ser tão bom ... mas não pode.

Comece a fazer um osciloscópio


Nos meus sonhos, o osciloscópio deve funcionar da seguinte maneira: Os
dois ADCs processam simultaneamente o sinal a uma velocidade de 1-2 MSPS. Próximas 2 opções:
  1. Tudo isso é transmitido em tempo real para o PC via USB e é tomada uma decisão sobre o que fazer com ele (lembre-se, construa um gráfico, processe-o de alguma forma, ...);
  2. . : (, , , ). .

Ambas as opções não puderam ser implementadas.
A primeira é porque eu não consegui iniciar o USB. Em vez disso, eu só poderia gerar o projeto no STM32CubeMX. Porém, após exportá-lo para o CoIDE, foi necessário alterar o gerenciador de inicialização com jumpers para programação / operação, o que não é conveniente. Portanto, eu recusei esta opção. Além disso, a velocidade do USB é de apenas 12 Mb / s. Os dados em alta velocidade em tempo real ainda não se ajustam. Para, de alguma maneira, transferir dados para o computador, conectei um conversor USB <-> UART adquirido na época para programar o Arduino Pro Mini. A segunda opção foi abordada porque o manipulador de interrupção dura mais tempo que o ADC. A velocidade foi limitada a apenas 340-500 kSPS, o que é várias vezes menor que o esperado.





A única opção de trabalho em alta velocidade foi a seguinte: os ADCs funcionam continuamente quando precisamos de medição, ativamos o DMA, esperamos que o buffer seja preenchido, desligamos o DMA e transferimos dados lentamente para o PC via USART. Esta opção excedeu todas as expectativas. O MK pode ser com overclock, de modo a gerar 9 MSPS com dois ADCs! Essa. 4,5 vezes mais do que de acordo com a documentação! Ao mesmo tempo, é bastante confortável observar um sinal com uma frequência de até 1 MHz. Comparado com o que conseguimos alcançar anteriormente no Arduino (10 kSPS), o resultado é muito bom - a velocidade aumentou 900 vezes!

No entanto, com overclocking, nem tudo é tão alegre. No futuro, para que o USB funcione, a frequência terá que ser reduzida em 16/9 = 1,8 vezes e somente 5 MSPS serão obtidos.

Ao tentar lidar com USB e outros periféricos, percebi uma desvantagem significativa desses controladores - há muito pouca informação na Internet. Se o AVR tem um monte de tudo, não foi tão fácil encontrar um exemplo de operação simultânea de dois ADCs no modo Intercalado rápido .

O Arduino UNO! Foi escolhido como gerador de sinal para o teste do osciloscópio. Não porque ele é bom ou algo assim ... é apenas muito rápido.
Escreva 8 linhas:
 void setup() {
  pinMode(2, OUTPUT);  
  long d = 10;
  for(;;){
    PORTD = 255;
    delayMicroseconds(d);
    PORTD = 0;  
    delayMicroseconds(d);
  }
}

void loop() {
  
}


Conecte a fiação USB + 1 (para que o STM32 de 3,3 volts não morra por um sinal de 5 volts, o sinal seja alimentado por um resistor de 2 kΩ) e pronto!

O resultado foi o seguinte (em cada imagem há uma fotografia do mesmo sinal na tela de um osciloscópio analógico): Período do sinal 0,9 μs. 1 metro = 10 pixels. No osciloscópio, 1 divisão = 0,5 μs. Período do sinal 10 μs. 1 metro = 5 pixels. No osciloscópio, 1 divisão = 2 μs. Os topos são cortados porque o sinal excede a tensão de referência ADC.









Qual é o próximo


Nos planos:
  1. Derrote o USB para abandonar o conversor USB <-> USART;
  2. Conclua a parte analógica para que a faixa de tensão de entrada não seja de 0 a 3,3 V, mas mais decente;
  3. Tornar o modo multicanal;
  4. Implementar controle de um PC;
  5. Faça um dispositivo acabado no estojo.


Concluindo, chamo a atenção para duas desvantagens reveladas do STM32 em comparação com o AVR:
  1. Maior consumo de memória Flash;
  2. Inicialização complexa da periferia, exacerbada pela falta de materiais.


Não sei como, mas para uma tarefa tão simples, foram necessários 31 kB de Flash.
O circuito da placa de depuração (não foi fácil de encontrar).

A segunda parte do artigo.

Source: https://habr.com/ru/post/pt384723/


All Articles