IAR C + STM32 Interrupções

Software e Hardware para uC STM

Moderadores: andre_luis, 51

Re: IAR C + STM32 Interrupções

Mensagempor ze » 31 Jul 2019 08:45

updates autoreflexvos...
A interrupt sempre cai em HardFault_Handler ... não estou sabendo programar corretamente pra a que eu quero...
e + ... ao colocar o mesmo nome da função da interrupt p.ex. TIM2_IRQHandler() ela "desaparece" da tabela. Vejo isso no debug
Não estou conseguindo entender a função exata dos registros nvic...
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: IAR C + STM32 Interrupções

Mensagempor denis » 31 Jul 2019 16:53

Se você está falando da família STM32F103, veja na imagem abaixo, que são todos da mesma família.
Muda apenas a quantidade de pinos, encapsulamento e memória, o resto é tudo igual.

Aquela placa da China que vende de balde, usa o STM32F103C8T6 que é a mesma família do seu.
O código vai rodar sem mudar provavelmente nada.

Imagem
https://ibb.co/tCbKFWP

https://wwcomponentes.com.br/index.php? ... duct_id=65
denis
Byte
 
Mensagens: 257
Registrado em: 06 Mar 2007 12:29
Localização: Americana - SP

Re: IAR C + STM32 Interrupções

Mensagempor ze » 01 Ago 2019 14:24

Update:
O código roda exceto pela interrupt. coloquei o ci de verdade no debuger. Agora sim o timer2 conta certin mas não gera a interrupt. Ou seja, cada hora um desafio diferente. O keyl até que tenta explicar a função mastigada
Código: Selecionar todos
void NVIC_EnableIRQ ( IRQn_Type     IRQn) 

mas não fala em qual registros e bits ela mexe
https://www.keil.com/pack/doc/CMSIS/Cor ... ecfe80591f
Ah sim, o f103 é pro simulador proteus. O que rodo na placa é o f051x... o que faz ainda mais desafiador.

Resumindo, preciso de um exemplo de código c IAR que gere interrupção de um timer mas quero a nível de hw e não apenas sw... Como não achei na net (ainda) estou a tentar criar na unha

De novo, não estou só...
https://stackoverflow.com/questions/499 ... ce-routine
...curiosamente a resposta é equivalente a que me déreis
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: IAR C + STM32 Interrupções

Mensagempor denis » 01 Ago 2019 14:52

É o mesmo processador da STM32F0DISCOVERY.

AN4062
STM32F0DISCOVERY peripheral firmware examples


Tem vários exemplos de configuração dos periféricos prontos para o IAR, Keil, etc....
denis
Byte
 
Mensagens: 257
Registrado em: 06 Mar 2007 12:29
Localização: Americana - SP

Re: IAR C + STM32 Interrupções

Mensagempor ze » 02 Ago 2019 16:19

denis escreveu:AN4062
STM32F0DISCOVERY peripheral firmware examples

Vou googlar... de fato já googlei algo do gênero. Esta AN4062 parece ser só um folder.

Atualização: fiz ainda mais acertos na vector table pro stm32f051 e tentei rodar no chip de verdade que está na placa. Até que roda e pula pra interrupt mas desta vez não está escrevendo nada nos ports ....
Código: Selecionar todos
#define led GPIOA_ODR_bit.ODR11

unsigned int i;
__irq void TIM2_IRQHandler(void)
{
//  TIM2_CR1_bit.URS=0;//reset da interrupt
TIM2_SR_bit.TIF=0;//reset da interrupt
//TIM2_SR_bit.UIF=0;//reset da interrupt 
led^=1;
i++;
}
... pois ...
Código: Selecionar todos
void setupports()
{
//stm051c8
#ifdef f051
GPIOA_OSPEEDR=GPIOB_OSPEEDR=0; //velocidade
GPIOA_OTYPER=GPIOB_OTYPER=0; //push pull
GPIOA_ODR=GPIOB_ODR=0; //saida
GPIOA_MODER=0x55555555; //tudo
GPIOB_MODER=0x55555555; //saída

... desta vez ele simplesmente se recusa a escrever no GPIOx_MODER permanecendo este no valor default do reset 0x28000000 e 0x00000000. Isso só ocorre no debug do mc de verdade - análise via stlink, rodo passo a passo e observo os registros. Nos registros do timer2 ele escreve direitinho. Nestes MODER e em outros registros dos GPIO's o fdp num escreve nada nem a pau. Sim já liberei o clock pra tudo...
Código: Selecionar todos
    RCC_APB2ENR=0xffffffff; //clock em tudo
//    RCC_APB1ENR_bit.TIM2EN=1; //clock no timer 2 ... quase tudo
    RCC_APB1ENR=0xffffffff; //agora sim .. tudo mesmo

não sei se ele tem mais registros p.ex de reset
Já no modo simulator ele escreve certin, afinal não é o mc real propriamente dito: é tudo virtual. Não penso ser falha de comunicação pois ele nem avisa nada e em alguns registros escreve certin...
SACO!!!!!
Ah sim pra liberar a interrupt do timer2 fiz isso...
Código: Selecionar todos
SETENA0|=(1<<(NVIC_TIM2-16));//de fato coloquei 0xffffffff pra liberar geral

...depois de uma análise de alguns arquivos. Portanto, busca e definição pessoal que provavelmente não tem na net.. bom .. agora tem
abçs
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: IAR C + STM32 Interrupções

Mensagempor ze » 04 Ago 2019 19:37

Através da dica do amigo @Guri no tópico https://www.asm51.com.br/phpbb/viewtopic.php?f=13&t=18512, baixei o mikcro c do arm e compilei o exemplo com ligeiras adaptações abaixo...
Código: Selecionar todos
void Timer2_interrupt() iv IVT_INT_TIM2 {
  TIM2_SR.UIF = 0;
  GPIOB_ODR ^= 0xffff;// ~GPIOB_ODR;      // Toggle PORTE led's
}

void main() {
  GPIO_Digital_Output(&GPIOB_BASE, _GPIO_PINMASK_ALL);  // Enable digital output on PORTE
  GPIO_Digital_Output(&GPIOA_BASE, _GPIO_PINMASK_ALL);  // Enable digital output on PORTE
//  GPIOB_CRL=GPIOB_CRH=0x232323;
//  GPIOA_CRL=GPIOA_CRH=0x232323;
//  GPIOB_MODER=0x55555555;
//  GPIOA_MODER=0x55555555;
  GPIOB_ODR = 0x5555;
  GPIOA_ODR = 0xaaaa;

  RCC_APB1ENR.TIM2EN = 1;       // Enable clock gating for timer module 2
  RCC_APB1ENR=0xffffffff;
  RCC_APB2ENR=0xffffffff;
  TIM2_CR1.CEN = 0;             // Disable timer
  TIM2_PSC = 2;              // Set timer prescaler.
  DIR_TIM2_CR1_bit =1;//down-up count
  TIM2_ARR = 5;
  NVIC_IntEnable(IVT_INT_TIM2); // Enable timer interrupt
  TIM2_DIER.UIE = 1;            // Update interrupt enable
  TIM2_CR1.CEN = 1;             // Enable timer

  while(1)
  {
   GPIOA_ODR ^= 0xffff;
  }  ;


Apesar de ter ocupado infinitos quase 2KB, quase funcionou...QUASE pois vejo o 0x5555 e 0xaaaa nos ports. Pena que no proteus deu a mensagem
Código: Selecionar todos
Access to register of unclocked peripheral at 0x40000000 cause BUS_FAULT [U1_CM3CORE]

... e aparentemente trava ou não cai na interrupção.
Pior que me lembro que quando no IAR C dava isso também mas não me lembro o que fiz que deu certo...
Amigo Guri, se achar que deve, me dê dicas de como rodar a simulação no proprio IDE do mikroc... Quase consegui mas ...

Eu vou entrar pro livro guines como o cara com a pior memória do mundo . Eu vou entrar pro livro guines como o cara com a pior memória do mundo
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: IAR C + STM32 Interrupções

Mensagempor eletroinf » 05 Ago 2019 07:28

Segue um código que eu já utilizei para gerar interrupção por meio do Timer 3, quem sabe ajude.
Eu trabalho direto nos registradores, sem usar estas funções prontas.
Este código compilou no Keil 4.72

Código: Selecionar todos
#include "stm32f10x.h"
/********************************************************************
Configuração do TIM3 - > CH2 -> PA7 PWM output
Saída PWM: Alternate function Push-pull.
Frequência: aproximadamente 3516 Hz.
Config: init 14/01/2016
      Fonte de clock: APB2 = 36 MHz.
********************************************************************/
void TIM3_Config(void)
{
   // enable interrupt Overflow TIM3.
   NVIC->ISER[0] |= (1 << TIM3_IRQn);   // Necessário #define   STM32F10X_MD em "stm32f10x.h"

   // Configuro os pinos de saída como função alternativa      
   /* PA4 saída Alt. func. PWM TIM3 CH2 push-pull output */
   GPIOA -> CRL &= ~(BIT_30 + BIT_28);
   GPIOA -> CRL |= (BIT_31 + BIT_29);      // PA7 Alt. Func. push-pull

   RCC->APB1ENR |= BIT_1;       // Ligo clock do TIM3
   
   /* Prescale de clock do timer, <13:11> PPRE2 = 0bxxx : APB2 prescaler  clock = 72/xxx = yy MHz */
   //RCC -> CFGR |= BIT_13;     // Já configurado na inicialização de clock.
   //RCC -> CFGR &= ~(BIT_12 + BIT_11);

   TIM3 -> PSC = 4;               // Prescaler 1:5 (1+PSC), entrada 72 MHz, clock TIM1 = 14,4 MHz.

   // O módulo será configurado de "main.c", mas inicializo ele para 4 ms de Ts.
   TIM3 -> ARR = 4095;            // Auto reload; 14,4 MHz/4095 = 3516 Hz

   TIM3 -> SR &= ~BIT_0;         // Limpo o flag de interrupção por update (UIE).
   TIM3 -> DIER |= BIT_0;      // Ligo a interrupção de Update.

   TIM3 -> CCR2 = 0;               // Razão cíclica zero no início.   

   TIM3 -> CCMR1 |= (BIT_14 + BIT_13 + BIT_11);      // PWM MODE 1 ch2, OC2PE pre-load CCP2 enab.
   
   TIM3 -> CCER |= BIT_4;      // Habilito pino de saída CH2 TIM3   

   //TIM3 -> BDTR |= BIT_15;      // Main output En


   /* Config. Dead Time: p. 333 (CR1 <9:8>), p. 356 */
   /*
   TIM3 -> CR1 &= ~BIT_9;
   TIM3 -> CR1 |= BIT_8;         // tDTS = 2*tCK_INT (tCK_INT = clock timer = 72 MHz).
   TIM3 -> BDTR |= (BIT_2 + BIT_0);      // Dead time = 5*tDTS = 5*27 ns.
   TIM3   -> BDTR &= ~(BIT_7 + BIT_6 + BIT_5 + BIT_4 + BIT_3 + BIT_1);   //Limpo os demais bits.
   */

   TIM3 -> CR1 |= BIT_0;   // Ligo o Timer.
   
   TIM3 -> CCR2 = duty;      // Ajusto o ciclo ativo inicial.
   
   TIM3 -> CR1   |= BIT_2;         // Only overflow update:
   
   TIM3 -> CR1 |= BIT_0;         // Ligo o Timer.
}

/********************************************************************
Interrupção TIM3
Acontece quando o timer transborda - 3.5 kHz
********************************************************************/
void TIM3_IRQHandler(void)
{
                
   TIM3 -> SR &= ~BIT_0;      // Limpo o flag de interrupção por update (UIE).   

}
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: IAR C + STM32 Interrupções

Mensagempor ze » 05 Ago 2019 10:43

eletroinf escreveu:Segue um código que eu já utilizei para gerar interrupção por meio do Timer 3, quem sabe ajude.

Ajuda sim amigo obrigado :D

Mas agora ... Este fdp do stm32f051 tem uma tal de protection level 2 que "mata" o chip. Se ativa, "no more communication is possible". E o fdp do programador do mikroc programa com este nível 2... E ele sai rasgando sem avisar!! é mole? tnc! :x Ou é algum bug no sistema que deixa ele ativo por default .. não sei como desativar no mikroc e nem no programador dele. Se vc souber, queira me avisar. Agora se vc souber como recuperar o chip "queimado", me fale também. O google não está ajudando muito... :(

Agradeço
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: IAR C + STM32 Interrupções

Mensagempor denis » 05 Ago 2019 15:46

Não conheço este gravador que você está utilizando.
Eu vi que no STM32 ST-LINK tem como desabilitar o RDP (Flash memory read protection level).
http://www.haoyuelectronics.com/Attachm ... 262073.pdf

Este gravador da mikroc não tem nenhuma configuração?
denis
Byte
 
Mensagens: 257
Registrado em: 06 Mar 2007 12:29
Localização: Americana - SP

Re: IAR C + STM32 Interrupções

Mensagempor ze » 05 Ago 2019 17:13

Pior que já tinha baixado o pdf amigo, obrigado. De fato é comando pra inibir a confirmação do fdp rdp o que piora ainda +.
Mas vamo lá...mais reflexões lacrimais ...
-de fato ndv com o fdp rdp...mas ele me assustou. É que no afã de ver led piscar, configurei todos os ports como saída. Por intuição, descobri que não pode. PA13 e PA14 são as entradas programadoras. Se saídas, zoa o barraco: o programador não acessa + nada pois dá colisão (vulgo conflito de interesses). Não vi este warning na net. Mas agora tem. Na etapa inicial da programação destes stm32, vale a pena perder 2 míseros pinos como saída. Mas se precisar deles meeessssmmoo, tem solução mas não é o foco do momento.

Voltando à minha realidadedezinha...
denis escreveu:este gravador que você está utilizando.
sim é o stlink mesmo amigo. Agora no debug do mikro c, não há meio do danado do mc fazer PORTA=saída (exceto PA14,13 hein!)
Código: Selecionar todos
GPIOB_MODER=0b01010101010101010101010101010101; // tudo bem, o debug mostra direitin mas
GPIOA_MODER=0b01000001010101010101010101010101;  // pqp.. tnc.. num vai.. só fica no default mesmo 0x280000000000
//PA14,13       ^^^^ --> prestenção!
Semelhante ao debuger do IAR mesmo...
Estou levando surra de bits afff!
Devo estudar o que a função
GPIO_Digital_Output(&GPIOA_BASE, _GPIO_PINMASK_ALL); // Enable digital output
faz nos registros. Quiçá algo + do que só escrever no MODER FÔQUER!!
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: IAR C + STM32 Interrupções

Mensagempor eletroinf » 05 Ago 2019 19:59

Devo estudar o que a função
GPIO_Digital_Output(&GPIOA_BASE, _GPIO_PINMASK_ALL); // Enable digital output


Pois éh, entender essas funções é algo sinistro.
É muito mais fácil olhar no datasheet os registradores e escrever diretamente neles, a exemplo do código que eu postei aí em cima.
Pelo menos é o que eu acho.
Além disso, se tu usar um debug, vai ver que estas funções chamam funções e defines no meio de uma montanha de includes, totalmente ridículo isso aí.
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: IAR C + STM32 Interrupções

Mensagempor ze » 06 Ago 2019 10:37

eletroinf escreveu:Pois éh, entender essas funções é algo sinistro.
É muito mais fácil olhar no datasheet os registradores e escrever diretamente neles, a exemplo do código que eu postei aí em cima.
Pelo menos é o que eu acho.
Além disso, se tu usar um debug, vai ver que estas funções chamam funções e defines no meio de uma montanha de includes, totalmente ridículo isso aí.

100% de concórdia... apesar que as funções que teu exemplo não necessariamente mostra o acesso ao hw do mc mas deu pra entender. Sim meu "nível é baixo" mesmo :)

finalmente (minúsculo ainda)
Código: Selecionar todos

#define led GPIOB_ODRbits.ODR2

void Timer2_interrupt() iv IVT_INT_TIM2 {
TIM2_SR.UIF = 0;
led ^= 1;  // não funciona
}

void delay (unsigned int dl)
{
 while (dl--);
}

void main() {
  GPIO_Digital_Output(&GPIOB_BASE, _GPIO_PINMASK_ALL);  // Enable digital output on PORT
  GPIO_Digital_Output(&GPIOA_BASE, _GPIO_PINMASK_15|_GPIO_PINMASK_12|_GPIO_PINMASK_11|_GPIO_PINMASK_10|\
                                   _GPIO_PINMASK_9|_GPIO_PINMASK_8|_GPIO_PINMASK_7|_GPIO_PINMASK_3|\
                                   _GPIO_PINMASK_2|_GPIO_PINMASK_1|_GPIO_PINMASK_0);//
  GPIOB_MODER=0b01010101010101010101010101010101;
//  GPIOA_MODER=0b01000001010101010101010101010101;


Ok.. o nível não é tão baixo como escovação de bits mas foi a forma que aplacou minhas inquietações. Não sei se vale a pena mas pela adrenalina talvez eu analise quais registros envolvidos na função quasi arduína GPIO_Digital_Output(). O mikcroc tenta explicar da maneira dele que não é "de macho tchê"
Apesar de programar pisca leds em c desde o século passado (milênio), este lance de ponteiros, vetores e afins ainda me são perturbadores e inquietantes (não necessariamente nesta ordem). Pra mim ainda têm 6,99999 cabeças

Enfim pisquei um led! Partir pra dominar mundo!...

enquanto digitava isso me deu uma intuição de olhar o esquema... acho que estou a fazer uma cagadinha .. quase certeza... Se eu decidir passar vergonha, faço nova publicação... por hora fica assim mesmo... :oops: :D
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: IAR C + STM32 Interrupções

Mensagempor eletroinf » 06 Ago 2019 12:17

apesar que as funções que teu exemplo não necessariamente mostra o acesso ao hw do mc


Basicamente está tudo no arquivo "stm32f10x.h" que tu podes ver aqui:
http://www.keil.com/dd/docs/arm/st/stm3 ... tm32f10x.h

Aquelas define de Bits são nesse estilo:

Código: Selecionar todos
#define BIT_0    1
#define BIT_1    2
#define BIT_2    4 (...)
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: IAR C + STM32 Interrupções

Mensagempor ze » 06 Ago 2019 14:15

eletroinf escreveu:Aquelas define de Bits são nesse estilo:

entendido.
Falando em bits, intuí (não verifiquei) que a função GPIO_Digital_Output() faz algo mais do que apenas configurar os pinos como saída. Ela também libera o clock dos ports e talvez alguns etc. Algo como faz a as irritantes digitalwrite() arduína ou outputhigh() ccs

Código: Selecionar todos
  GPIO_Digital_Output(&GPIOB_BASE, _GPIO_PINMASK_ALL);  // Enable digital output on PORT
  GPIO_Digital_Output(&GPIOA_BASE, _GPIO_PINMASK_11|_GPIO_PINMASK_10|_GPIO_PINMASK_9|_GPIO_PINMASK_8|\
                                   _GPIO_PINMASK_7|_GPIO_PINMASK_3|_GPIO_PINMASK_2|_GPIO_PINMASK_1);

Há também uma função pra habilitar o clock
Código: Selecionar todos
GPIO_Clk_Enable(&GPIOB_BASE);
GPIO_Clk_Enable(&GPIOA_BASE);
mas como gosto de sofrer lendo o d.s., preferi
Código: Selecionar todos
RCC_AHBENR|=((1<<18)|(1<<17));//0b0000000000001100000000000000000 //clk PORTB, PORTA

Que no fundo é a lesma lerda mas talvez ocupando uma fração de memória. Sou do tempo em que cada byte valia uma fortuna.

Falta um detalhezinho que me incomoda 1 pouco: quando escrevo direto nos registros no quais acho ser suficiente, não consigo mais gravar de forma rápida. Parece que dá o tal conflito nos pinos. Parece que o mc prefere a função mastigada mesmo que mexe com mais registros. Outra hora dou mais uma marretadas nos bits pra avaliar isso.
O contorno quando ocorre é simples: dar um curtinho no capacitor de reset quando o programador não achar o mc. mas tem que ser durante a procura.
Fica registrado também: jamais programe a proteção rdp pra nível 2. O resumo é ... o fdp do rdp faz do mc um otp... pqp .. tnc

Realmente fizera uma cagadinha definindo o led no pino errado. Mas não era só este problema de B.I.O.S. Haviam sim os tropeços dos bits, idade e etc. O lado bom, um calozinho a+ daqui e dali pra coleção e sei lá... parece até que to quase vendo um tanquinho na barriga de chop...

Agradeço a valiosa contribuição dos amigos e fica a saga registrada pra quem for percorrer por estas veredas.

Abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: IAR C + STM32 Interrupções

Mensagempor eletroinf » 06 Ago 2019 16:35

Agora que eu tive acesso segue o arquivo "bits.h"

Código: Selecionar todos
#define   BIT_0   1
#define   BIT_1   2
#define   BIT_2   4
#define   BIT_3   8
#define   BIT_4   16
#define   BIT_5   32
#define   BIT_6   64
#define   BIT_7   128
#define   BIT_8   256
#define   BIT_9   512
#define   BIT_10   1024
#define   BIT_11   2048
#define   BIT_12   4096
#define   BIT_13   8192
#define   BIT_14   16384
#define   BIT_15   32768
#define   BIT_16   65536
#define   BIT_17   131072
#define   BIT_18   262144
#define   BIT_19   524288
#define   BIT_20   1048576
#define   BIT_21   2097152
#define   BIT_22   4194304
#define   BIT_23   8388608
#define   BIT_24   16777216
#define   BIT_25   33554432
#define   BIT_26   67108864
#define   BIT_27   134217728
#define   BIT_28   268435456
#define   BIT_29   536870912
#define   BIT_30   1073741824
#define   BIT_31   2147483648
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

AnteriorPróximo

Voltar para STMicroelectronics

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x