Skocz do zawartości

dzami97

Użytkownicy
  • Zawartość

    4
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O dzami97

  • Ranga
    1/10

Informacje

  • Płeć
    Mężczyzna
  1. Podpinam się do pytania kolegi dejmieno. Czy biblioteka HAL zmienia konfiguracje zegarów? Czy może jest to kwestia podłączenia niskiej częstotliwości przy konfiguracji pinu?
  2. 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ę?
  3. Treker, Ok, czyli mam rozumieć że GPIOx_SetBits(GPIOC ,1) ustawia pin zero portu x w stan wysoki, (GPIOx,"10") pin pierwszy, "100" pin drugi itd? Oczywiście jest to zapis binarny więc pewnie nie można go użyć w kompilatorze tak jak ja to zrobiłem czyli "10000" lub "10" stąd ta funkcja przesunięcia bitowego od "1" czyli jedynki na najmłodszym bicie. Z czego to wynika? Czy jest to odwołanie do rejestru? Kiedyś czytałem o rejestrze GPIOx_ODR. Czy on działa właśnie tak tzn jedynka na odpowiednim miejscu 16bitowego rejestru wyzwala stan wysoki w przypadku skonfigurowania portu wcześniej jako wyjście? Pytanie jeszcze o dokumentacje, gdzie najlpiej szukać opisu pinów i ich funkcji alternatywnych(który dokumnet ew. strona)? Czy w Eclipsie da się rozwinąć liste funkcji biblioteki na pasku po prawej lub lewej stronie? W Keilu była taka możliwość, w zakładce GPIO po rozwinięciu miałeś wszystkie funkcje dotyczące portów. dzięki i pozdrawiam
  4. Witam serdecznie Prośba do autora o wyjaśnienie: GPIO_ResetBits(GPIOC, 1 << led) Pozdrawiam
×
×
  • Utwórz nowe...