Skocz do zawartości

[STM32][Problem z USART na przerwaniach]


porousstructure

Chciałbyś liste programów wzorcowych?  

2 użytkowników zagłosowało

Wyniki głosowania są ukryte!

Ankieta jest już zamknięta!


Pomocna odpowiedź

Hej wygląda na to że mój uC wogóle nie wchodzi do przerwania , jaka może być tego przyczyna? Dodam że używam płytki NUCLEO-F103RB, i że temat już nie wiem który raz pojawia się na forum.Fajnie by było gdyby gdzieś w sieci była jakas lista programów wzorcowych na STM z którymi najczęściej początkujący mogą mieć problemy?

Mój kod:

#include "stm32f10x.h"
volatile uint32_t i = 0;


void delay (int time)
{
int c;
for (c = 0; c < time*4000; ++c) {}
}

void send_char (c)
{
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
USART_SendData(USART2, c);
}

int __io_putchar(int c)
{
if(c == '\n')
{
	send_char('\r');
}
send_char(c);
return(c);
}

void USART2_IRQHandler()
{
GPIO_WriteBit(GPIOA, GPIO_Pin_5,(BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5)));
if(USART_GetITStatus(USART2,USART_IT_RXNE))
{


	if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE))
	{
		i = USART_ReceiveData(USART2);
		printf("%d",i);
	}
}
GPIO_WriteBit(GPIOA, GPIO_Pin_5,(BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5)));
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
}

volatile int tabela[64];
int main(void)
{
GPIO_InitTypeDef gpio;
USART_InitTypeDef uart;
NVIC_InitTypeDef nvic;



RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

GPIO_StructInit(&gpio);
gpio.GPIO_Pin = GPIO_Pin_2;
gpio.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &gpio);

gpio.GPIO_Pin = GPIO_Pin_5;
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &gpio);

gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
gpio.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOA, &gpio);

nvic.NVIC_IRQChannel = USART2_IRQn;
nvic.NVIC_IRQChannelPreemptionPriority = 0x00;
nvic.NVIC_IRQChannelSubPriority = 0x00;
nvic.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic);


USART_StructInit(&uart);
uart.USART_BaudRate = 9600;
USART_Init(USART2, &uart);

USART_Cmd(USART2,ENABLE);



while(1)
{


}
}

Link do komentarza
Share on other sites

Uart nie ma domyślnie odblokowanych przerwań i musisz je ustawić, więc linijka

uart.USART_BaudRate = 9600;

raczej nie wystarczy 😉 Poszukaj w necie jest masa przykładów opartych o tę bibliotekę.

A poza tym skąd pewność że nie wchodzi ? Może zdebuguj program daj tam breakpointa i zobacz czy program się zatrzyma.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.