Skocz do zawartości

juras

Użytkownicy
  • Zawartość

    15
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O juras

  • Ranga
    2/10

Informacje

  • Płeć
    Mężczyzna

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. Witam forumowiczów. Na podstawie kursu STM32 F4 na stronie Forbota staram się napisać program do wykorzystania ADC i DMA do pomiaru napięć. Pomiar napięć bez wykorzystania DMA potrafię wykonać bez problemu, jednak gdy chcę uruchomić DMA, obserwując w STM studio nie otrzymuję żadnych wartości z pomiaru - wartość zmiennej ciągle są równe 0. Dodam też, że okno konfiguracyjne ADC w programie CUBE posiada mniej opcji niż w przypadku konfiguracji procesora F4 wykorzystanego w kursie. Zasadniczą (moim zdaniem) różnicą jest brak opcji "DMA continuous request". Tak wygląda okno konfiguracji ADC w CUBE dla mikrokontrolera F103: Inne różnice to takie, że w opcjach DMA dla swoich potrzeb wybrałem długość danych jako pojedynczy bajt i to, że wykorzystuję 3 zewnętrzne kanały do pomiaru napięcia. Czy ktoś z Was spotkał się już z podobnym problemem, lub wykorzystał prawidłowo DMA w F103? Z góry dziękuję za odpowiedź.
  2. Cześć, Próbuję wykorzystać filtry CAN w trybie ID List mode. Nie mam problemów z zaprogramowaniem ich w trybie Mask mode. Tak wygląda wykorzystany już przeze mnie kod do konfiguracji w trybie Mask mode: sFilterConfig.BankNumber = 0; sFilterConfig.FilterNumber = 0; sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; sFilterConfig.FilterIdHigh = 0x10<<5; sFilterConfig.FilterIdLow = 0; sFilterConfig.FilterMaskIdHigh = 0xff<<5; sFilterConfig.FilterMaskIdLow = 0; sFilterConfig.FilterFIFOAssignment = 0; sFilterConfig.FilterActivation = ENABLE; HAL_CAN_ConfigFilter(&hcan, &sFilterConfig); I tutaj jest wszystko w porządku. Skonfigurować filtry w trybie ID List próbuję za pomocą tego kodu: sFilterConfig.FilterMode = CAN_FILTERMODE_IDLIST; sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; sFilterConfig.BankNumber = 1 sFilterConfig.FilterNumber = 0 sFilterConfig.FilterIdHigh = 0x20<<5; sFilterConfig.FilterIdLow = 0; sFilterConfig.FilterMaskIdHigh = 0; sFilterConfig.FilterMaskIdLow = 0; sFilterConfig.FilterFIFOAssignment = 0; sFilterConfig.FilterActivation = ENABLE; HAL_CAN_ConfigFilter(&hcan, &sFilterConfig); Gdy próbuję użyć powyższej części kodu, węzeł CAN nie odbiera żadnych wiadomości. Gdzie popełniam błąd/co przeoczyłem? Z góry dziękuję za odpowiedź i pozdrawiam.
  3. Witam! Borykam się z pewnym problemem. Wysyłanie i odbiór przez UART wartości 8-bitowych udało mi się zrealizować bez większych problemów. Jednak gdy chciałem zrealizować wysyłanie wartości 16-bitowych, najpierw wysyłając starsze 8 bitów, później młodsze i następnie łącząc je w całość, miałem problemy z odbiorem. Nie zależy mi na wysyłaniu liter, jedynie wartości heksadecymalne, ponieważ chcę wykorzystać opracowaną na własne potrzeby ramkę danych. Próbowałem wykorzystać sposób z funkcjami printf z lekcji UART z kursu STM32F4, również nie osiągnąłem odpowiedniego rezultatu. Do odbioru i wysyłania wykorzystuję przerwania, a dane przesyłam jako elementy tablicy. Czy ktoś zna sposób, w jaki można rozwiązać ten problem?
  4. Witam! Za pomocą bibliotek HAL udało mi się zrealizować komunikację miedzy węzłami za pomocą CAN. Chciałem wysłać ramkę żądania transmisji (remote control frame) i wywołać tym wysłanie danych przez drugi węzeł. Do tego celu w strukturze odpowiadającej za CAN w węźle wysyłającym zapytanie ustawiłem CAN_RTR_REMOTE; , jednak nic to nie dało. Przeszukiwałem dokumentację do bibliotek HAL i nie znalazłem specjalnej funkcji do odbioru lub wysyłania ramek żądania. Szukałem odpowiedzi w internecie i nie znalazłem odpowiedzi. Czy ktoś z Was jest w stanie pomóc rozwiązać ten problem? Z góry dziękuję za odpowiedź.
  5. Znalazłem rozwiązanie problemu, może się komuś przyda. Należało samemu dodać do kodu linijkę aktywującą przerwanie przy odbiorze ramki, w tym celu dopisałem w funkcji main kod: HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn); i podziałało. Zauważyłem tu, że Cube przy generowaniu kodu może nie aktywować wszystkich przerwań, mimo że były wybierane przeze mnie z poziomu Cube. Nie wiem czy jest to mankament programu, czy po prostu tak powinno być. W każdym razie, temat do zamknięcia.
  6. Czy jest możliwe w ogóle wyłączenie filtrowania, aby sprawdzić czy cokolwiek jest wysyłane? Zmieniłem wartość parametru FilterActivation na DISABLE, jednak to nie podziałało. Czy jest inna metoda?
  7. Co do poprawności ustawień filtrów nie miałem pewności i szukając odpowiedzi w internecie doszedłem do wniosku, że powinienem wykorzystać do filtrowania tryb maskowania i użyłem CAN_FILTERMODE_IDMASK zamiast CAN_FILTERMODE_IDLIST, niestety nic to nie dało. Niestety nie mam teraz dostępu do żadnego oscyloskopu ani analizatora stanów logicznych.
  8. Kolejno LED_G_Pin i LED_G_GPIO_Port są to GPIO_PIN_5 i GPIOA. Są to dodane etykiety z poziomu Cube'a do wyprowadzenia zielonej diody LED na płytce Nucleo. Schemat połączeń: __________ Komentarz dodany przez: Sabre
  9. Witam. Próbowałem uruchomić interfejs CAN, ale jednego problemu nie mogę obejść. Na początku chciałem tylko aby pomiędzy dwoma jednakowymi płytkami Nucleo przesyłać dane. Kod konfiguracyjny wygenerowałem w środowisku Cube. Kod z pliku main.c: #include "main.h" #include "stm32f1xx_hal.h" /* USER CODE BEGIN Includes */ #include "stm32f1xx_it.h" /* USER CODE END Includes */ /* Private variables ---------------------------------------------------------*/ CAN_HandleTypeDef hcan; /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ uint8_t x=0; CAN_FilterConfTypeDef sFilterConfig; CanTxMsgTypeDef TxMsg; CanRxMsgTypeDef RxMsg; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); void Error_Handler(void); static void MX_GPIO_Init(void); static void MX_CAN_Init(void); /* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_CAN_Init(); /* USER CODE BEGIN 2 */ hcan.pTxMsg = &TxMsg; hcan.pRxMsg = &RxMsg; //Tx config hcan.pTxMsg->StdId = 0x244; hcan.pTxMsg->IDE = CAN_ID_STD; hcan.pTxMsg->RTR = CAN_RTR_DATA; hcan.pTxMsg->DLC = 1; //filter configs sFilterConfig.FilterNumber = 0; sFilterConfig.FilterMode = CAN_FILTERMODE_IDLIST; sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; sFilterConfig.FilterIdHigh =0; sFilterConfig.FilterIdLow = 0; sFilterConfig.FilterMaskIdHigh = 0; sFilterConfig.FilterMaskIdLow = 0; sFilterConfig.FilterFIFOAssignment = 0; sFilterConfig.FilterActivation = ENABLE; HAL_CAN_ConfigFilter(&hcan,&sFilterConfig); HAL_CAN_Receive_IT(&hcan, CAN_FIFO0); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** System Clock Configuration */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; /**Initializes the CPU, AHB and APB busses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = 16; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /**Initializes the CPU, AHB and APB busses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } /**Configure the Systick interrupt time */ HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); /**Configure the Systick */ HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* SysTick_IRQn interrupt configuration */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } /* CAN init function */ static void MX_CAN_Init(void) { hcan.Instance = CAN1; hcan.Init.Prescaler = 16; hcan.Init.Mode = CAN_MODE_NORMAL; hcan.Init.SJW = CAN_SJW_1TQ; hcan.Init.BS1 = CAN_BS1_3TQ; hcan.Init.BS2 = CAN_BS2_5TQ; hcan.Init.TTCM = DISABLE; hcan.Init.ABOM = DISABLE; hcan.Init.AWUM = DISABLE; hcan.Init.NART = DISABLE; hcan.Init.RFLM = DISABLE; hcan.Init.TXFP = DISABLE; HAL_NVIC_SetPriority(CAN1_RX1_IRQn,0,0); HAL_NVIC_GetActive(CAN1_RX1_IRQn); if (HAL_CAN_Init(&hcan) != HAL_OK) { Error_Handler(); } } /** Configure pins as * Analog * Input * Output * EVENT_OUT * EXTI */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin : PC13 */ GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /*Configure GPIO pin : LED_G_Pin */ GPIO_InitStruct.Pin = LED_G_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(LED_G_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin, GPIO_PIN_RESET); /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI15_10_IRQn, 1, 0); HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @param None * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler */ /* User can add his own implementation to report the HAL error return state */ while(1) { } /* USER CODE END Error_Handler */ } Tutaj jeszcze kod z pliku "stm32f1xx_it.c": #include "stm32f1xx_hal.h" #include "stm32f1xx.h" #include "stm32f1xx_it.h" /* USER CODE BEGIN 0 */ extern uint8_t x; /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ extern CAN_HandleTypeDef hcan; /******************************************************************************/ /* Cortex-M3 Processor Interruption and Exception Handlers */ /******************************************************************************/ /** * @brief This function handles Non maskable interrupt. */ void NMI_Handler(void) { /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ /* USER CODE END NonMaskableInt_IRQn 0 */ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ /* USER CODE END NonMaskableInt_IRQn 1 */ } /** * @brief This function handles Hard fault interrupt. */ void HardFault_Handler(void) { /* USER CODE BEGIN HardFault_IRQn 0 */ /* USER CODE END HardFault_IRQn 0 */ while (1) { } /* USER CODE BEGIN HardFault_IRQn 1 */ /* USER CODE END HardFault_IRQn 1 */ } /** * @brief This function handles Memory management fault. */ void MemManage_Handler(void) { /* USER CODE BEGIN MemoryManagement_IRQn 0 */ /* USER CODE END MemoryManagement_IRQn 0 */ while (1) { } /* USER CODE BEGIN MemoryManagement_IRQn 1 */ /* USER CODE END MemoryManagement_IRQn 1 */ } /** * @brief This function handles Prefetch fault, memory access fault. */ void BusFault_Handler(void) { /* USER CODE BEGIN BusFault_IRQn 0 */ /* USER CODE END BusFault_IRQn 0 */ while (1) { } /* USER CODE BEGIN BusFault_IRQn 1 */ /* USER CODE END BusFault_IRQn 1 */ } /** * @brief This function handles Undefined instruction or illegal state. */ void UsageFault_Handler(void) { /* USER CODE BEGIN UsageFault_IRQn 0 */ /* USER CODE END UsageFault_IRQn 0 */ while (1) { } /* USER CODE BEGIN UsageFault_IRQn 1 */ /* USER CODE END UsageFault_IRQn 1 */ } /** * @brief This function handles System service call via SWI instruction. */ void SVC_Handler(void) { /* USER CODE BEGIN SVCall_IRQn 0 */ /* USER CODE END SVCall_IRQn 0 */ /* USER CODE BEGIN SVCall_IRQn 1 */ /* USER CODE END SVCall_IRQn 1 */ } /** * @brief This function handles Debug monitor. */ void DebugMon_Handler(void) { /* USER CODE BEGIN DebugMonitor_IRQn 0 */ /* USER CODE END DebugMonitor_IRQn 0 */ /* USER CODE BEGIN DebugMonitor_IRQn 1 */ /* USER CODE END DebugMonitor_IRQn 1 */ } /** * @brief This function handles Pendable request for system service. */ void PendSV_Handler(void) { /* USER CODE BEGIN PendSV_IRQn 0 */ /* USER CODE END PendSV_IRQn 0 */ /* USER CODE BEGIN PendSV_IRQn 1 */ /* USER CODE END PendSV_IRQn 1 */ } /** * @brief This function handles System tick timer. */ void SysTick_Handler(void) { /* USER CODE BEGIN SysTick_IRQn 0 */ /* USER CODE END SysTick_IRQn 0 */ HAL_IncTick(); HAL_SYSTICK_IRQHandler(); /* USER CODE BEGIN SysTick_IRQn 1 */ /* USER CODE END SysTick_IRQn 1 */ } /******************************************************************************/ /* STM32F1xx Peripheral Interrupt Handlers */ /* Add here the Interrupt Handlers for the used peripherals. */ /* For the available peripheral interrupt handler names, */ /* please refer to the startup file (startup_stm32f1xx.s). */ /******************************************************************************/ /** * @brief This function handles CAN RX1 interrupt. */ void CAN1_RX1_IRQHandler(void) { /* USER CODE BEGIN CAN1_RX1_IRQn 0 */ /* USER CODE END CAN1_RX1_IRQn 0 */ HAL_CAN_IRQHandler(&hcan); /* USER CODE BEGIN CAN1_RX1_IRQn 1 */ HAL_CAN_Receive_IT(&hcan,CAN_FIFO0); GPIOA->ODR = hcan.pRxMsg->Data[0]<<5; /* USER CODE END CAN1_RX1_IRQn 1 */ } /** * @brief This function handles EXTI line[15:10] interrupts. */ void EXTI15_10_IRQHandler(void) { /* USER CODE BEGIN EXTI15_10_IRQn 0 */ HAL_Delay(50); if (HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==GPIO_PIN_SET) { x++; hcan.pTxMsg->Data[0]=x; HAL_CAN_Transmit(&hcan,1); } /* USER CODE END EXTI15_10_IRQn 0 */ HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13); /* USER CODE BEGIN EXTI15_10_IRQn 1 */ /* USER CODE END EXTI15_10_IRQn 1 */ } Podczas debugowania przy przyciśnięciu przycisku (PC13) zmienna x inkrementuje się, jednak na drugiej płytce stan diody się nie zmienia. Przy wgrywaniu programu dla drugiego procka, oczywiście zmieniłem jego adres (StdId) na inny. Czy ktoś jest w stanie znaleźć źródło problemu? Z góry dziękuję za wszelką pomoc i pozdrawiam. @edit: dodam jeszcze, że wyjścia Tx połączyłem odpowiednio za pomocą diod 1N4148 do wejść Rx drugiego procka.
  10. Cześć, mam problem podobny do paru poprzedników z tematu. Realizując zadanie dodatkowe napisałem kod, który powinien realizować zapalanie i gaszenie kolejnych diod przy wciskaniu przycisku. Co prawda diody się zapalają i gaszą po kolei, jednak przez drgania styków jest to ciężko zauważalne, tzn. na każde wciśnięcie przycisku przez drgania diody zapalają się i gaszą wiele razy, zupełnie inaczej niż na zamieszonym do kursu filmiku. Początkowo myślałem, że to wina kodu jednak jest on analogiczny do kodu zamieszczonego w pliku z zadaniem domowym. Aby mieć pewność, że wina nie leży po stronie kodu inicjującego funkcję przerwania, skopiowałem ten kod i dalej to samo. Czy ktoś wie jak rozwiązać ten problem? Z góry dziękuję za odpowiedź.
  11. Niestety nic to nie dało. Próbowałem też z odsyłaniem pojedynczego znaku z pomocą funkcji "wyslij_znak", również bez rezultatu. Edit: W wolnym czasie poszukałem trochę na necie i dzięki znalezionym informacjom znalazłem rozwiązanie. Dodałem komendy: GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); Temat do zamknięcia.
  12. Witam, próbowałem przećwiczyć moduł USART na zestawie NUCLEO F411RE. O ile wysyłanie ciągu bitów przebiegało bezproblemowo, napotkałem problem z odbieraniem czegokolwiek z terminala. Napisałem prosty program bazując na kursie STM z Forbota do wysyłania i odbierania danych i podczas próby wysłania odpowiednich znaków ("a","b",lub "c") nie otrzymuję oczekiwanej odpowiedzi. Sprawdziłem w karcie katalogowej czy skonfigurowałem odpowiedni bity do odbioru i to się zgadza. Czy ktoś móglby podpowiedzieć mi, lub naprowadzić mnie w czym może znajdować się problem? W załączniku zamieszczam kod programu i link do karty katalogowej z której korzystałęm. Dodam jeszcze, że korzytam z System Workbench for STM32. Z góry dziękuję za odpowiedź i pozdrawiam. datasheet #include "stm32f4xx.h" int main(void) { void wyslij_znak(char c) { while (USART_GetFlagStatus(USART2,USART_FLAG_TXE)== RESET); USART_SendData(USART2, c); } void wyslij_ciag(const char* s) { while(*s) wyslij_znak(*s++); } RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOC, ENABLE); USART_InitTypeDef uart; GPIO_InitTypeDef gpio; GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); GPIO_StructInit(&gpio); gpio.GPIO_Pin = GPIO_Pin_2; gpio.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(GPIOA, &gpio); gpio.GPIO_Pin = GPIO_Pin_3; gpio.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(GPIOA, &gpio); gpio.GPIO_Pin = GPIO_Pin_13; gpio.GPIO_Mode = GPIO_Mode_IN; GPIO_Init(GPIOC, &gpio); USART_StructInit(&uart); uart.USART_BaudRate = 9600; USART_Init(USART2, &uart); USART_Cmd(USART2, ENABLE); while(1) { if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0) { wyslij_ciag("znaki\r\n"); } if (USART_GetFlagStatus(USART2, USART_FLAG_RXNE)){ char c = USART_ReceiveData(USART2); switch (c) { case 'a': wyslij_ciag("komunikat1"); break; case 'b': wyslij_ciag("komunikat2"); break; case 'c': wyslij_ciag("komunikat3"); break; } } } }
  13. Witam Forumowiczów! Postanowiłem w wolnym czasie przerobić kurs STM32. Korzystałem ze wskazówek kursu na stronie Forbota i natknąłem się na pewien problem, gdy chciałem skonfigurować przerwanie zewnętrzne. Aby uruchomić moduł wejść alternatywnych, należy użyć "RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);". Kurs był pisany pod NUCLEO--F103RB, ja posiadam NUCLEO-F411RE, więc przejrzałem kartę katalogowa, i doczytałem się, że EXTI znajduje się również na szynie APB2, jednak program nie widzi argumentu "RCC_APB2Periph_AFIO". Gdy przeglądałem zawartość biblioteki, nie znalazłem niczego, co mówiłoby jak uruchomić ten moduł. W karcie katalogowej są podane graniczne rejestry tego modułu, ale szczerze mówiąc nie wiem jak na podstawie tego mógłbym to skonfigurować. Dlatego mam pytanie, jak skonfigurować to za pomocą rejestrów, lub za pomocą której komendy z biblioteki (być może czegoś nie dopatrzyłem)? Podsyłam jeszcze link do karty katalogowej, z której korzystałem. Z góry dziękuję za odpowiedź i pozdrawiam. datasheet Zapomniałem dodać, że piszę w OpenStm32 i korzystam z bibliotek StdPeriph_Driver, czyli ze standardowych.
  14. Witam Forumowiczów! Mam pytanie co do kursu. Jeden z użytkowników wspomniał, że używa płytki NUCLEO-F411RE. Również taką na dniach zamówiłem. Pierwszy program ze zmiennymi (z 3 lekcji kursu) skompilował się i działał poprawnie, jednak przy konfiguracji portów wystąpiły problemy. Początkowo przepisywałem ręcznie aby lepiej zrozumieć kod, jednak gdy wystąpiły pierwsze błędy, to skopiowałem kod i zmieniłem jedynie nazwę używanych bibliotek tak aby pasowały do używanej przeze mnie płytki, tzn stm32f4xx.h. Rozumiem, że biblioteki mogą się trochę różnić i przez to nie pasują niektóre wartości funkcji podawane przeze mnie. Zaglądałem do bibliotek aby znaleźć poprawne wartości, których mógłbym użyć, jednak nie poradziłem sobie z dwiema wartościami, konkretnie pierwsza wartość funkcji " RCC_APB2PeriphClockCmd" i wartość, za pomocą której podciąga się wyjście przez rezystor do zasilania (program wyświetla komunikat "symbol could not be resolved/first use in this function". Dodam jeszcze, że zainstalowałem program oraz sterowniki zgodnie z instrukcjami na poprzednich lekcjach. Jako załącznik dodaję zdjęcie z okna programu. Nie chciałem zakładać oddzielnego tematu, dlatego dołączyłem się do tego ponieważ jest on pokrewny. Z góry dziękuję za odpowiedź. PS. Znalazłem w karcie katalogowej, że GPIOA jest podpięty do szyny AHB1 i zmieniłem to w odpowiednich miejscach, jednak dalej mam błąd przy komendzie z podciąganiem przez rezystor do zasilania. PS2. Jestem o krok bliżej, bo udało mi się za pomocą bibliotek ustawić gpio.GPIO_Mode = GPIO_Mode_OUT; PS3. Udało mi się skompilować i wgrać program. W bibliotekach doszedłem też do tego, że trzeba użyć parametru "GPIO_PuPd_UP" jeżeli chce się podciągnąć przez rezystor.
×
×
  • Utwórz nowe...