Entrar    Registrar

IAR C + STM32 Interrupções

Software e Hardware para uC STM

Moderadores: aluis-rcastro, 51

  • Autor
    Mensagem

Re: IAR C + STM32 Interrupções

Mensagempor ze » 06 Ago 2019 20:42

:D
Que tal assim...
Código: Selecionar todos
#define   BIT_0   1<<0
#define   BIT_1   1<<1
#define   BIT_2   1<<2
#define   BIT_3   1<<3
#define   BIT_4   1<<4
#define   BIT_5   1<<5
#define   BIT_6   1<<6
#define   BIT_7   1<<7
#define   BIT_8   1<<8
#define   BIT_9   1<<9
...
#define   BIT_31   1<<31

Fala sério :lol: Por falar em falar sério, sabia que o IAR C não entende a definição de bits 0b01010101 ? Mas algum sem noção com muita noção e sem ter o que fazer criou isso:
Código: Selecionar todos
#define B8__(x) ((x&0x0000000fLU)?1:0) \
+((x&0x000000f0LU)?2:0) \
+((x&0x00000f00LU)?4:0) \
+((x&0x0000f000LU)?8:0) \
+((x&0x000f0000LU)?16:0) \
+((x&0x00f00000LU)?32:0) \
+((x&0x0f000000LU)?64:0) \
+((x&0xf0000000LU)?128:0)
#define HEX__(n) 0x##n##LU
#define b8(d) ((unsigned char)B8__(HEX__(d)))
/* for upto 16-bit binary constants, MSB first */
#define b16(dmsb,dlsb) (((unsigned short)b8(dmsb)<< \
+ b8(dlsb))
/* for upto 32-bit binary constants, MSB first */
#define b32(dmsb,db2,db3,dlsb) (((unsigned long)b8(dmsb)<<24) \
+ ((unsigned long)b8(db2)<<16) \
+ ((unsigned long)b8(db3)<< \
+ b8(dlsb))
/* Sample usage:
b8(01010101) = 85
b16(10101010,01010101) = 43605
b32(10000000,11111111,10101010,01010101) = 2164238933
*/

Agora isso
Código: Selecionar todos
#define BCD2BYTE( b ) ( ( ( ( ( b ) >> 4 ) & 0x0f ) * 10 ) + ( ( b ) & 0x0f ) )
#define BYTE2BCD( b ) ( ( ( ( b ) / 10 ) << 4 ) + ( ( b ) % 10 ) )
unsigned char bcd2byte(unsigned char d)
{
return BCD2BYTE(d);
}
//-----------------------------------------------------
unsigned byte2bcd(unsigned char d)
{
return BYTE2BCD(d);
}

também pode não ser totalmente inútil quando isso...
Código: Selecionar todos
#define setbit(var,bitno) ((var) |= 1 << (bitno))
#define clrbit(var,bitno) ((var) &= ~(1 << (bitno)))
#define xorbit(var,bitno) ((var) ^= 1 << (bitno))

Sei lá ... é pouco mas é o 'pagamento' das lustradas de bits que tenho . A propósito consegui fazer funcionar o stm32 na simulação do proteus... uhhull.
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1617
Registrado em: 05 Jun 2007 14:32

Re: IAR C + STM32 Interrupções

Mensagempor ze » 07 Ago 2019 12:07

Afff... pqp....
quer saber porquê agora funcionou na simulação proteus?
O proteus considera o bit 11 do RCC_APB2ENR como habilitação do TIMER2 e não o bit 0 do RCC_APB1ENR como manda o manual
64.png
http://www.jkelec.co.kr/img/lecture/cortex_app/img/64.png

O código abaixo funciona
Código: Selecionar todos
  RCC_APB2ENR=0x0000080c;//0b100000001100; //TIM1? PORTA PORTB
  RCC_APB1ENR=0x00000000;//0b0001; //timer2!!
//  RCC_APB1ENR.TIM2EN=1;

Basta desabilitar o bit 11 TIMER1 !!!! que o treco nem roda e dá a mensagem
Código: Selecionar todos
Access to register of unclocked peripheral at 0x40000000 cause BUS_FAULT [U1_CM3CORE]

que juro pro 6 que lia unlocked !! carai.. se o treco tá destravado, porquê o aviso pow??!

Não basta escovar bits. Tem que dar uma uma lustrada e mais uma cuspidinha e passar um paninho no bit.. Fala sério!! tnc pow!
Você não está autorizado a ver ou baixar esse anexo.
Avatar do usuário
ze
Dword
 
Mensagens: 1617
Registrado em: 05 Jun 2007 14:32

Re: IAR C + STM32 Interrupções

Mensagempor denis » 07 Ago 2019 12:17

Nada melhor do que rodar no hardware de verdade.
denis
Byte
 
Mensagens: 221
Registrado em: 06 Mar 2007 12:29
Localização: Americana - SP

Re: IAR C + STM32 Interrupções

Mensagempor ze » 07 Jan 2020 20:48

Olá amigo @Guri ou vc que está a ler e tem contato com o compilador mikroc @ st32f0xxx...
Desisti do IAR pouco depois de criar este tópico e fui de mikroc mais mastigadinho. Excelente dica do amigo @guri. aos poucos supero a fase de escovar bits :) .

Estou tentando usar a lib adc do mikroc A minha dificuldade é com a função Adc_Read(canal). Ela trava em si. Algo como espera o bit EOC e ele não vem. Por acaso, isso já vos aconteceu e conseguiu contornar?
http://download.mikroe.com/documents/co ... ibrary.htm
Usei a ADCx_Get_Sample() com relativo sucesso. Mas com ela, aparentemente não posso ler canais aleatórios. O valor do anterior interfere no próximo. Tem que ser sequencial e crescente. Como a seguir...
Sinistramente, agora há pouco na fase de escovação de bit, consegui sucesso programando manualmente os registros
Código: Selecionar todos
double ad[5];

void read_adc(unsigned char channel)
{
unsigned char i;
unsigned int tmout=65000;
ADC_CR.ADEN=1;//liga conversor
while(!ADC_CR.ADRDY);

ADC_CHSELR=(1<<8)|(1<<9)|(1<<16)||(1<<17)|(1<<18);//1<<channel;
ADC_SMPR=0b111; //o mais lento
ADC_CCR|=(1<<24)|(1<<23)|(1<<22);//.TSEN_bit=1;
ADC_CR.ADSTART=1;//inicia conversão
for(i=0;i<5;i++)
  {
  while(!ADC_ISRbits.EOC);//&&(tmout--)); //espera converter
  ad[i]=ADC_DR;
  }
ADC_CR.ADEN=0;
ADC_CR.ADSTART=0;//inibe
}

Mas de um instante pra outro resolveu criar vida própria e travar o bit EOC (por isso o time out que não resolveu pois o dado sai errado)
:x ... :evil:
Percebo também ao fazer...
Código: Selecionar todos
ADC1_Init(); //2x...
ADC1_Init(); //...esta megda trava


Também to com muita vontade usar a V de referência interna. ADC1_Init_Advanced(_ADC_INTERNAL_REF); // set internal reference used
... but...
Not all MCUs support advanced configuration. Please, read the appropriate datasheet before utilizing this library.
:cry:
Avatar do usuário
ze
Dword
 
Mensagens: 1617
Registrado em: 05 Jun 2007 14:32

Re: IAR C + STM32 Interrupções

Mensagempor julian camargo » 17 Jan 2020 15:58

Oh Zéééééééé´....... não vi vc mencionar se esta usando a biblioteca Std_PeriphDriver da ST, parece que não.

Coisas do tipo GPIOB_ODR^=0xffffffff não são nada amigáveis de entender, a primeira vista.

Acredito que teria sido melhor vc ter iniciado esse projeto incluindo a biblioteca Std_PeriphDriver e usando as funções de setup de hardware que estão nela.

Com ela, é muito mais fácil de fazer e entender o que esta acontecendo.

Veja o exemplo abaixo de como criar uma interrupção por pino:

cpp code
void EXTI1Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);

EXTI_InitStructure.EXTI_Line = EXTI_Line1;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}


Depois disso é só incluir a rotina de interrupçao abaixo:

cpp code
void EXTI1_IRQHandler(void) 
{

if (EXTI_GetITStatus(EXTI_Line1) != RESET)
{

// Escreva aqui o que vc quer fazer quando ocorrer a interrupçao.

EXTI_ClearITPendingBit(EXTI_Line1);
}
}


Concorda que fica mais fácil de entender ?
julian camargo
Bit
 
Mensagens: 44
Registrado em: 31 Ago 2019 19:50

Anterior

Voltar para STMicroelectronics

Quem está online

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