Skocz do zawartości

niezly_patyk

Użytkownicy
  • Zawartość

    5
  • Rejestracja

  • Ostatnio

Informacje

  • Płeć
    Mężczyzna

Osiągnięcia użytkownika niezly_patyk

Młodszy odkrywca

Młodszy odkrywca (3/19)

  • Za 5 postów
  • To już rok!
  • To już 5 lat!

Odznaki

0

Reputacja

  1. Bawię się na STM32f0xx - także mam z tym problem. Wydaje mi się że koledze @JFranko chodziło o uruchamianie zegara dla AF "RCC_APB2Periph_AFIO". Dla f103: RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); W STM32f0xx nie ma czegoś takiego jak Periph_AFIO - zapewne wynika to z budowy uC, ale najważniejsze pytanie: Gdzie znajdę informację na temat tego jakie szyny danych uruchomić przy kolejnych interfejsach? Dla przykładu STM32F103xx performance line block diagram - dokumentacja STM32F103, widzę że jest to linia APB1 lub APB2 (to już sprawdzę sobie w lib) ale nie widzę wzmianki o załączaniu AFIO. Tu także pytanie odnośnie poprawności konfiguracji SPI na stm32f070. Poniżej zamieszczam kod dla SPI1, mam problem z jego uruchomieniem. Czy coś pomieszałem? void spi_init(void){ SPI_InitTypeDef SPI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; //Enable SPI1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_0); GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0); GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_0); // Configure SPI1 pins: PA5 = SCK | PA6 = MISO| PA7 = MOSI GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(GPIOA, &GPIO_InitStructure); //Configure SPI1 pin: PA4 = CS - soft GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_Init(GPIOA, &GPIO_InitStructure); // SPI1 configuration SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); SPI_CalculateCRC(SPI1, DISABLE); // Enable SPI1 SPI_Cmd(SPI1, ENABLE); }
  2. Witam, mam dość dziwny problem z komunikacją. Do uC podłączony mam enkoder liniowy, cały zakres enkodera to 1900 impulsów. Chcę wysyłać pozycję po USART do PC i w terminalu ją odczytywać (docelowo w Matlabie). Informację o położeniu chcę wysyłać w jednym bajcie czyli 0-255, daje mi to wystarczającą dokładność. Przemnażam więc odpowiednio pozycję. Problem polega na tym że jeśli impulsy zbierane są w prawo informacja jest wysyłana bez zarzutu, ale gdy zaczynam poruszać enkoder w lewo to informacja do terminala przychodzi z 2s opóźnieniem. Bardzo spowalnia mi to program. Czy ktoś miał coś podobnego i wie jak to rozwiązać? Konfiguracja USART: void init_USART(void) { /* USART out/in * PA2 -TX */ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); //Conect USART2 pin to AF2 - Tx = PA2 GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); USART_InitStructure.USART_BaudRate = 256000; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx; USART_Init(USART2, &USART_InitStructure); USART_Cmd(USART2, ENABLE); } Zliczanie impulsów odbywa się w przerwaniu, tam też impulsy są odpowiednio przeliczane: Kod przerwania: void EXTI2_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line2) != RESET) { extern int imp_l; extern int pozycja; //right if (GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == Bit_SET) { imp_l++; } //left if (GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == Bit_RESET) { imp_l--; } pozycja = (int) (((float) 255 * (float) imp_l) / (float) 1900); USART_SendData(USART2, pozycja); } EXTI_ClearITPendingBit(EXTI_Line2); }
  3. Witam, mam podobny problem z tym samym mostkiem. Trochę inny schemat. Podłączam wszystko zgodnie ze schematem: Zasilanie logiczne 5V. Zasilanie silników 11V. GND wspólne. PWM_A z uC (sprawdzony działa dobrze) Silnik podłączony do odpowiednich wyjść. Problem podobny jak u poprzednika. Gdy podaje stany IN1 IN2 (niski/wysoki) silnik brzęczy i nie rusza. Jeśli odłączę oba stany i przyłożę jeden z nich (bez różnicy czy niski czy wysoki) do jednego z wejść silnik rusza. Jeśli przyłożę go do drugiego wejścia kręci się w drugą stronę. Wszystkie ze stanów oraz PWM w tym samy czasie podaje na diody więc wiem że program działa dobrze. Proszę o radę. Układ podłączony zgodnie ze schematem: __________ Komentarz dodany przez: Treker
  4. Cześć, mam problem z przerwaniami w stm32f4 na płytce discovery. Napisałem swoją konfiguracje przerwań bazując na książce K.Paprockiego "uC STM32 w praktyce". Problem polega na tym że w momencie wystąpienia przerwania uC w nim zostaje/zawiesza się - zostaje wywołana f-cja z pliku startup_stm32f4xx.s /** * @brief This is the code that gets called when the processor receives an * unexpected interrupt. This simply enters an infinite loop, preserving * the system state for examination by a debugger. * @param None * @retval None */ .section .text.Default_Handler,"ax",%progbits Default_Handler: Infinite_Loop: b Infinite_Loop .size Default_Handler, .-Default_Handler Zdesperowany szukałem kodów na st.com, co nie przyniosło większych rezultatów. Ostatecznie przedstawiam czyjś kod który (podobno) działa poprawnie - u mnie dalej te same objawy. źródło void EXTILine3_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; /* Enable GPIOA clock */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); /* Enable SYSCFG clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); /* Configure PA3 pin as input floating */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Connect EXTI Line3 to PA3 pin */ SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource3); /* Configure EXTI Line3 */ EXTI_InitStructure.EXTI_Line = EXTI_Line3; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Enable and set EXTI Line3 Interrupt to the lowest priority */ NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } while (1) { GPIO_SetBits(GPIOD, GPIO_Pin_14); Delay(0x3FFFFF); GPIO_ResetBits(GPIOD, GPIO_Pin_14); if (EXTI_GetITStatus(EXTI_Line3) != RESET) { GPIO_SetBits(GPIOD, GPIO_Pin_13); EXTI_ClearITPendingBit(EXTI_Line3); } GPIO_SetBits(GPIOD, GPIO_Pin_15); Delay(0x3FFFFF); GPIO_ResetBits(GPIOD, GPIO_Pin_15 | GPIO_Pin_13); } Objaw wygląda następująco: Po zdebugowaniu program działa poprawnie (na przemian zapalają się ledki 14 i 15). Przy wystąpieniu przerwania program wpada w nieskończoną pętle o której pisałem wyżej. Jeśli 'trafie' z przerwaniem na chwile w której świeci się led 14 to pozostaje ona zapalona. Led 13 która powinna zaświecić po wystąpieniu przerwania nie zapala się. Co mogłem pokręcić? Jak doprowadzić do poprawnego działania programu?
×
×
  • 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.