collapse

* Posts Recentes

Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]


Focos LED SMD por almamater
[16 de Dezembro de 2023, 14:12]


I Belive por dropes
[15 de Dezembro de 2023, 13:59]


Carga de corrente eletrónica ZPB30A1 60W por jm_araujo
[11 de Dezembro de 2023, 13:27]

Autor Tópico: STM32 inicio  (Lida 9989 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.032
STM32 inicio
« em: 20 de Fevereiro de 2020, 12:58 »
bom dia,
Mandei vir do ebay um  STM32F103C8T6 bluepill e um st-link v2, para experimentar e conhecer um pouco as coisas.

Acontece que o stm32 veio, já o st-link v2 mudou-se pelo o caminho e chegou stc autoprogrammer usb-ttl que apesar fisicamente serem iguais, os pinos sao diferentes e nao tenho onde ligar SWIO e SWCLK .

Supostamente no lugar  SWIO e SWCLK tenho TCK e RST.




Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.943
  • NERD!
Re: STM32 inicio
« Responder #1 em: 20 de Fevereiro de 2020, 15:41 »
Esquece, nada que ver um com o outro.
O STC é basicamente um conversor USB-série, o st-link tem um micro que trata da interface com o micro (inclusive dá para outros fins, tipo converter noutros "dispositivos", como o Black Magic Probe: https://microcontrollerelectronics.com/how-to-convert-an-stm32f103c8t6-into-a-black-magic-probe/  ou j-link: https://www.embarcados.com.br/convertendo-st-link-em-um-j-link/, interfaces JTAG mais genéricas.

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.032
Re: STM32 inicio
« Responder #2 em: 21 de Fevereiro de 2020, 09:49 »
Já vi que fui enganado, no entanto ja reclamei no ebay.
 
Então por agora, sem um st-link nao vou conseguir usar o STM32CubeIDE ou STM32CubeProgrammer, para fazer upload certo?.

 

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.032
Re: STM32 inicio
« Responder #3 em: 06 de Março de 2020, 18:33 »
Boa tarde,
Após uma luta, consegui o reembolso e mandei  vir outro vendedor o st-link, até paguei mais para vir espanha.

No entanto estou aqui com um problema, e pelo o que li o stm32f103 ser fake.
Ora no  STM32CubeIDE  fiz o projecto do blink tudo  compila sem erros, tudo lindo mas na hora de fazer upload dá-me erro.

Procurei no google pelo erro  conclusão, no STM32CubeIDE  verifica se os stm são verdadeiros.
abri STM32CubeProgrammer peguei o ficheiro upload e o led pisca sem problemas.

Ou seja vim pedir ajuda para que compilador usar e que consiga fazer debugger no stm?
Da vossa experiência o que se recomenda.




Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.032
Re: STM32 inicio
« Responder #4 em: 24 de Março de 2020, 18:00 »
Depois de ter dado aqui umas voltas, acabei por comprar outra bluepill  mas desta vez genuino, no qual ja funciona o ide studio.
Andei a mexer em vários programas e acho que vou pelo o  Keil uVision5.

No entanto ando aqui a fazer uns testes com piscar leds, pwm e agora chegou a vez de  meter o  bma180 accelerometer a falar stm32.

Sorte ou azar já estive hoje o dia todo virar o google  e não apanhei nenhum exemplo, tentei pegar nuns exemplos mas sem sucesso.

Então a ideia seria arranjar uma lib mais parecida possivel com a wire do arduino e depois partir daqui.


Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: STM32 inicio
« Responder #5 em: 24 de Março de 2020, 18:23 »
Porque não usar o TrueStudio(antigo attolic) que é 100% gratuito(pelo menos, antes tudo o que era Keil era pago, versão free estava limitada a 32Kb de código compilado, para além de ter alguma sintaxe diferente do gcc), juntas ao CubeMX para gerar código para os periféricos, e partes dai, aliás ao que parece já é um tudo em um chamado STM32CubeIDE:
https://www.st.com/en/development-tools/stm32cubeide.html

Tambem tens o platformio que suporta N dev boards nativamente, para um ambiente mais simplificado:
https://platformio.org/

Se o BMA estiver a falar i2c, é começar com fazer uma função de scan do bus i2c, assim ficas logo a saber se ele está no bus ou não, e em que endereço anda, dai para a frente, é ler meia duzia de registos e escrever para mais uns quantos, não diria que é preciso uma biblioteca, mas se assim o preferes, bma180 github e tens N projectos com código, trocas as funções de read e write pelas do stm e siga.

Tens aqui um exemplo, só tens de alterar os write e read para as funções que o STM32 usa para falar i2c:
https://github.com/PaulStoffregen/FreeIMU_original/blob/master/libraries/bma180/bma180.cpp

« Última modificação: 24 de Março de 2020, 18:28 por senso »
Avr fanboy

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.032
Re: STM32 inicio
« Responder #6 em: 09 de Abril de 2020, 10:48 »
Bom dia,
Ando as uns dias a explorar o stm32 e já consegui meter bma180 a falar com stm32, já criei o código iniciação, já leio o chip id , consigo confirmar o device adress.

No entanto estou com um problema de interpretação dos valores,e tem haver com a maneira que obtenho  os dados.
Vou-me explicar da melhor forma.

No arduino  tenho:
int n=6;
byte result[5];
readFrom(BMA180, 0x02, n , result);
int x= (( result[0] | result[1]<<8)>>2)+offx ;
float x1=x/4096.0;

Onde o result[0] = x-lsb  result[1] x-msb  result[2] = y-lsb  result[3] y-msb

No stm32 tenho: HAL_I2C_Mem_Read (&hi2c1, (uint16_t) (BMA180 << 1) , (uint16_t) (DATA<< 2)  , 2, READXYZ,8, HAL_MAX_DELAY);

Aqui o que acontece é que é READXYZ[0] = chip-id  READXYZ[1]-version bma READXYZ[2]x-lsb READXYZ[3]x-msb READXYZ[4]y-lsb READXYZ[5]y-msb
Até aqui tudo bem le-me 8 regsitos o ultimo é temperatura ,  como está no datasheet.

Agora ao interpretar para obter o x, pensava que bastava mudar a posição do array,para as correctas mas não,  está-me a dar x1=3.2g
int x= (( READXYZ[2] | READXYZ[3]<<8)>>2)+offx ;
float x1=x/4096.0;

A minha duvida é se o problema não terá haver com Bitwise operation  READXYZ[3<<8)>>2 no qual terei de ajustar uma vez que o tamanho do array é diferente, e para vos ser sinceros  não estou a ver como saber os valores que colocar.
E acho que é aqui que perciso de ajuda.


Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.480
Re: STM32 inicio
« Responder #7 em: 09 de Abril de 2020, 11:50 »
tens de formatar melhor o teu post para perceber o codigo.

no STM32 se tiveres debugger podes aceder aos registos e ver o que esta a acontecer byte a byte.
outra alternativa e' se tiveres porta serie, imprimir os valores
exemplo

Código: [Seleccione]
printf("0x%04X", variableInteger)
imprime uma variavel em formato hexadecimal 0xFFFF
assim ja podes analisar byte a byte / bit a bit

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.943
  • NERD!
Re: STM32 inicio
« Responder #8 em: 09 de Abril de 2020, 12:20 »
Manda para fora o READXYZ[2],  READXYZ[3] e o x .
Fica mais fácil de perceber onde está a falhar.

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.032
Re: STM32 inicio
« Responder #9 em: 09 de Abril de 2020, 23:23 »
Descobri uma diferença que está a provocar que tenha más leituras, e despistar qualquer codigo criei um novo projecto só com o código abaixo.
Usei um codigo simples e pelo debuuger stm e o arduino.

uint8_t READXYZ[2];
READXYZ[0]=0X61;
READXYZ[1]=0XFF ;
x=( READXYZ[0] | READXYZ[1]<<8); // vai pegar 0x61 e 0xff e escrever para  esquerda

No arduino recebo
x_hex=0xFFFFFF61  x_bin=11111111111111111111111101100001

No stm32 exactamente o mesmo codigo copy/paste recebo
x_hex=0xff61   x_bin=1111111101100001
no me preenche os restantes 4bits ff para a esquerda.
Ainda comparei em binario e é a mesma coisa não coloca os restantes 1 para a esquerda



Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.480
Re: STM32 inicio
« Responder #10 em: 10 de Abril de 2020, 00:36 »
Nao estou a entender o problema, qual e' o resultado que esperas ter?
Tambem nao da para perceber porque nao estas a formatar o codigo. Tens de usar o formatador do codigo do forum, se nao aparece simbolos como este:  8)

Os bits, podem ser da maneira como o arduino ou stm faz o print.
num esta a assumir unsigned short (16bits) outro esta a assumir unsigned long int (32 bits)
agora porque estao a 0xFFFF nao sei  :(

Uma nota: estas a usar uint8. e a fazer shifts. Nao sei o tipo da variavel x
mas para ter certeza que funciona correctamente, devias converter os bytes para unsigned int.
Pode as vezes a plataforma e o compilador usarem uint8 e nao dar o resultado esperado.


Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: STM32 inicio
« Responder #11 em: 10 de Abril de 2020, 02:54 »
Eu prefiro usar os tipos que dizem explicitamente qual o tamanho, não deixa ambiguidade.
O tamanho e sinal do char, int, etc, dependem da plataforma e compilador.

Para mim também não é claro qual é o teu problema, mas se queres shiftar à esquerda uma variável mantendo os bits mais à esquerda, 1º tens que extender o tamanho dessa variável, ou seja, copiá-la para outra maior onde caiba o resultado, e só depois shiftar, a maior.
Por exemplo, se queres shiftar uma variável de 8 bits (val) 4 bits à esquerda mantendo os 4 bits que iriam sair, tens que fazer:

uint8_t   val = ...
uint16_t  val16 = val;
val16 = val16 << 4;


O resultado precisa de 12 bits (8 + 4) e portanto uma variável de 16 serve.
Há outras formas de fazer isto (com casts), esta é a maneira mais descomplicada.

Outra coisa é que os shifts para a direita de valores (variáveis) com sinal introduzem sempre um bit a 1 à esquerda. Chamam-se "deslocamentos aritméticos" e é o comportamento correcto para a divisão de um número, em complemento de 2 (como temos hoje em dia nos CPUs), por uma potência de 2.
« Última modificação: 10 de Abril de 2020, 03:08 por Njay »

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.032
Re: STM32 inicio
« Responder #12 em: 12 de Abril de 2020, 15:52 »
Boa tarde,
O codigo colocado na janela do codigo.

O problema é que o resultado obtido na variável final após o deslocamento para a direita  é totalmente diferente entre arduino/avr studio e o stm32. Isto faz com que x1 que é resultado final  o valor correcto é 0.01G e no stm32 da-me 15.69G e o código é exactamente o mesmo.
isto pelo debugger do stm32 variável final é 0xFF61, e o arduino 0xFFFFFF61.

Experimentei o vários tipos de declaração para a variável final mas o resultado é sempre o mesmo.

Código: [Seleccione]
  while (1)
  {
  uint8_t READXYZ[2];
  unsigned long int final;

  READXYZ[0]=0x61;
  READXYZ[1]=0xff;
  final = ( READXYZ[0] | READXYZ[1]<<8);
  float x1=(final/4096.0);

  HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
  HAL_Delay(5000);

}

Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.480
Re: STM32 inicio
« Responder #13 em: 12 de Abril de 2020, 16:51 »
Experimenta assim:
Código: [Seleccione]
   uint8_t READXYZ[2];
   uint32_t final;

   READXYZ[0]=0x61;
   READXYZ[1]=0xff;
   final = ( (uint32_t)READXYZ[0] | (uint32_t)READXYZ[1] << 8);
   float x1=( (float)final / 4096.0f );

Ou com isto:

Código: [Seleccione]
   final = (( (uint32_t)READXYZ[0] | (uint32_t)READXYZ[1] << 8)) & 0xFFFF;

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.032
Re: STM32 inicio
« Responder #14 em: 12 de Abril de 2020, 17:05 »
Boa tarde,
Desde já agradeço pela ajuda.

Experimentei os exemplos que enviou no entanto o resultado em ambos é o mesmo:
Hex:0xff61   Binary:1111111101100001