Witam panowie, niestety straciłem już siłę do zadania domowego. 🙁 Dlaczego program nie wchodzi w obsługę przerwania? Komunikacja z komputerem jest ok, funkcje przykładowe z main działają. Sprawdziłem debugerem że program w ogóle nie wchodzi w przerwanie. Gdzie popełniam błąd?
#include "stm32f10x.h"
void USART2_IRQHandler(void)
{
if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE)!= RESET)
{
char c = USART_ReceiveData(USART2);
switch(c)
{ case 'a':
if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_4))
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
else
GPIO_SetBits(GPIOA,GPIO_Pin_4);
break;
case 'b':
if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5))
GPIO_ResetBits(GPIOA, GPIO_Pin_5);
else
GPIO_SetBits(GPIOA,GPIO_Pin_5);
break;
case 'c':
if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_6))
GPIO_ResetBits(GPIOA, GPIO_Pin_6);
else
GPIO_SetBits(GPIOA,GPIO_Pin_6);
break;
case 'd':
if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_7))
GPIO_ResetBits(GPIOA, GPIO_Pin_7);
else
GPIO_SetBits(GPIOA,GPIO_Pin_7);
break;
}
}
USART_ClearITPendingBit(USART2, USART_FLAG_RXNE);
}
void wyslijznak(char z)
{
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
USART_SendData(USART2, z);
}
void wyslijslowo(const char* s)
{
while (*s)
{
wyslijznak(*s++);
}
}
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
GPIO_InitTypeDef port;
USART_InitTypeDef uart;
NVIC_InitTypeDef przerwanie;
GPIO_StructInit(&port);
port.GPIO_Pin = GPIO_Pin_2;
port.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &port);
port.GPIO_Pin=GPIO_Pin_3;
port.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &port);
port.GPIO_Pin= GPIO_Pin_4 | GPIO_Pin_5 |GPIO_Pin_6 |GPIO_Pin_7 ;
port.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&port);
USART_StructInit(&uart);
uart.USART_BaudRate = 9600;
uart.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2, &uart);
USART_Cmd(USART2, ENABLE);
przerwanie.NVIC_IRQChannel = USART2_IRQn;
przerwanie.NVIC_IRQChannelPreemptionPriority = 0;
przerwanie.NVIC_IRQChannelSubPriority = 0;
przerwanie.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&przerwanie);
wyslijslowo("Hello");
while(1)
{ if (USART_GetFlagStatus(USART2, USART_FLAG_RXNE))
{
char c = USART_ReceiveData(USART2);
switch (c)
{
case 'a':
wyslijslowo("Odebrano komunikat A!\r\n");
break;
case 'b':
wyslijslowo("Odebrano komunikat B!\r\n");
break;
default:
wyslijslowo("Nieznany komunikat:(\r\n");
break;
}
}
}
}
Co wywołuje to "globalne przerwanie USART2"? Wydaje mi się że pojawienie się bitu startu na Rx kontrolera, a może się mylę?