Skocz do zawartości

Protektor28

Użytkownicy
  • Zawartość

    16
  • Rejestracja

  • Ostatnio

Reputacja

1 Neutralna

O Protektor28

  • Ranga
    2/10

Ostatnio na profilu byli

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

  1. Cześć Wszystkim ! Mam pewien problem z modułem Arduino GSM800L. Nie potrafię znaleźć informacji, jak sprawdzić status połączenia. Chodzi dokładnie o to, że w momencie gdy dzwonię z tego modułu na inny telefon, nie wiem co dzieje się z połączeniem, a chciałbym wiedzieć czy zostało odebrane czy odrzucone. Uprzejmie proszę o pomoc i pozdrawiam.
  2. Witajcie Potrzebuję porady. Próbuję wysłać 16 bitową wartość przez USART i wyświetlić ją w czasie rzeczywistym na komputerze na wykresie. Moje pytanie to jak to najłatwiej zrobić? Jak przesłać to z mikro-kontrolera STM32 (USART jest 8 bitowy) i w jakim programie mogę to wykreślić ? Domyślam się, że wartość 16 bitową dzielę na dwie paczki po 8 bitów, ale jak to dokładnie zrobić? Potrzebuję konkretnego (możliwie najprostszego rozwiązania) wraz z programem. Uprzejmie proszę o pomoc . Z wszystkie odpowiedzi serdeczne dzięki !
  3. Serdecznie dziękuję za odpowiedź Treker. USART nie przesyła żadnych danych do komputera. Dane są zbierane po stronie PC przez Realterm, ale program nie wychwytuje kompletnie nic. Postanowiłem sprawdzić co się dzieje na pinie TX. Jedyne co widać na oscyloskopie to to, że pin TX jest w stanie wysokim, nic poza tym.
  4. Cześć, mam problem z komunikacją USART na stm32L452RE, poniżej zamieszczam kody, które napisałem przy pomocy znalezionych przykładów. Nie mam pojęcia czego tu jeszcze brakuje. Kod inicjalizacji USART: static void MX_USART2_UART_Init(void) { LL_USART_InitTypeDef USART_InitStruct; LL_GPIO_InitTypeDef GPIO_InitStruct; /* Peripheral clock enable */ LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2); /**USART2 GPIO Configuration PA2 ------> USART2_TX PA3 ------> USART2_RX */ GPIO_InitStruct.Pin = USART_TX_Pin|USART_RX_Pin; GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; GPIO_InitStruct.Alternate = LL_GPIO_AF_7; LL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USART2 interrupt Init */ NVIC_SetPriority(USART2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0)); NVIC_EnableIRQ(USART2_IRQn); USART_InitStruct.BaudRate = 115200; USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; USART_InitStruct.StopBits = LL_USART_STOPBITS_1; USART_InitStruct.Parity = LL_USART_PARITY_NONE; USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX; USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE; USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16; LL_USART_Init(USART2, &USART_InitStruct); LL_USART_ConfigAsyncMode(USART2); LL_USART_Enable(USART2); } Kod ciała przerwania USARTA: void USART2_IRQHandler(void) { /* USER CODE BEGIN USART2_IRQn 0 */ if(LL_USART_IsEnabledIT_TXE(USARTx_INSTANCE) && LL_USART_IsActiveFlag_TXE(USARTx_INSTANCE)) { /* TXE flag will be automatically cleared when writing new data in TDR register */ /* Call function in charge of handling empty DR => will lead to transmission of next character */ USART_TXEmpty_Callback(); } if(LL_USART_IsEnabledIT_TC(USARTx_INSTANCE) && LL_USART_IsActiveFlag_TC(USARTx_INSTANCE)) { /* Clear TC flag */ LL_USART_ClearFlag_TC(USARTx_INSTANCE); /* Call function in charge of handling end of transmission of sent character and prepare next charcater transmission */ USART_CharTransmitComplete_Callback(); } if(LL_USART_IsEnabledIT_ERROR(USARTx_INSTANCE) && LL_USART_IsActiveFlag_NE(USARTx_INSTANCE)) { /* Call Error function */ Error_Callback(); } /* USER CODE END USART2_IRQn 0 */ /* USER CODE BEGIN USART2_IRQn 1 */ /* USER CODE END USART2_IRQn 1 */ } Funkcje wykorzystane w powyższym przerwaniu: void USART_TXEmpty_Callback(void) { if(ubSend == (ubSizeToSend - 1)) { /* Disable TXE interrupt */ LL_USART_DisableIT_TXE(USARTx_INSTANCE); /* Enable TC interrupt */ LL_USART_EnableIT_TC(USARTx_INSTANCE); } /* Fill TDR with a new char */ LL_USART_TransmitData8(USARTx_INSTANCE, aStringToSend[ubSend++]); } void USART_CharTransmitComplete_Callback(void) { if(ubSend == sizeof(aStringToSend)) { ubSend = 0; /* Disable TC interrupt */ LL_USART_DisableIT_TC(USARTx_INSTANCE); /* Turn LED1 On at end of transfer : Tx sequence completed successfully */ //LED_On(); } } void Error_Callback(void) { __IO uint32_t isr_reg; /* Disable USARTx_IRQn */ NVIC_DisableIRQ(USARTx_IRQn); /* Error handling example : - Read USART ISR register to identify flag that leads to IT raising - Perform corresponding error handling treatment according to flag */ isr_reg = LL_USART_ReadReg(USARTx_INSTANCE, ISR); if (isr_reg & LL_USART_ISR_NE) { /* case Noise Error flag is raised : ... */ //LED_Blinking(LED_BLINK_FAST); } else { /* Unexpected IT source : Set LED to Blinking mode to indicate error occurs */ //LED_Blinking(LED_BLINK_ERROR); } } Na koniec użycie funkcji do wysłania danych w przerwaniu o low power LPTIM: void LPTIM1_IRQHandler(void) { /* USER CODE BEGIN LPTIM1_IRQn 0 */ /* Start USART transmission : Will initiate TXE interrupt after TDR register is empty */ LL_USART_TransmitData8(USARTx_INSTANCE, aStringToSend[ubSend++]); /* Enable TXE interrupt */ LL_USART_EnableIT_TXE(USARTx_INSTANCE); LL_LPTIM_ClearFLAG_ARRM(LPTIM1); LL_LPTIM_ClearFLAG_CMPM(LPTIM1); LL_LPTIM_ClearFlag_ARROK(LPTIM1); /* USER CODE END LPTIM1_IRQn 0 */ /* USER CODE BEGIN LPTIM1_IRQn 1 */ /* USER CODE END LPTIM1_IRQn 1 */ } Uprzejmie proszę o pomoc, bo nie mam pojęcia co tu jest nie tak. Za wszystkie odpowiedzi serdeczne dzięki.
  5. Niestety w przypadku L452 uVision nie jest pomocne. Nie wiem wciąż, czym są zmienne w kodzie, który podałeś.
  6. FlyingDutch Hej , wciąż wyskakuje, że ubAdcGrpRegularUnitaryConvStatus jest niezadeklarowana, to ma być jakieś makro? Również funkcja ConversionStartPoll_ADC_GrpRegular(); nie jest znana. Mógłbyś powiedzieć co trzeba doinstalować do Keil, aby zobaczyć przykłady w LL? Nie mogę nic takiego znaleźć.
  7. FlyingDutch, bardzo dziękuję za odpowiedź Nie wiem czy dobrze rozumiem, czym jest VAR_CONVERTED_DATA_INIT_VALUE oraz ubAdcGrpRegularUnitaryConvStatus = 1; ? Kompilator pokazuje, że nie są zadeklarowane
  8. Witaj Ostatnia wersja przerwania jaką zapisałem wygląda następująco: uint32_t Sample; void ADC1_IRQHandler(void) { /* USER CODE BEGIN ADC1_IRQn 0 */ LL_ADC_Enable(ADC1); Sample=LL_ADC_REG_ReadConversionData32 (ADC1); /* USER CODE END ADC1_IRQn 0 */ /* USER CODE BEGIN ADC1_IRQn 1 */ /* USER CODE END ADC1_IRQn 1 */ }
  9. Dobrze, rozumiem , bardzo dziękuję za wskazówki Treker
  10. Czołem, mam pewien problem. Czytając reference manuala STM'a nie do końca rozumiem jak uruchomić przetwornik analogowo-cyfrowy pisząc na poziomie Low Layer ( założeniem projektu jest nie korzystać z bibliotek HAL'a). Jestem początkujący w programowaniu "bez HAL", dlatego proszę o wyrozumiałość i o pomoc/rady. Ustawienia ADC jakie wygenerowałem przy użyciu Cube'a wyglądają następująco: static void MX_ADC1_Init(void) { LL_ADC_InitTypeDef ADC_InitStruct; LL_ADC_REG_InitTypeDef ADC_REG_InitStruct; LL_ADC_CommonInitTypeDef ADC_CommonInitStruct; LL_GPIO_InitTypeDef GPIO_InitStruct; /* Peripheral clock enable */ LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC); /**ADC1 GPIO Configuration PC0 ------> ADC1_IN1 PC4 ------> ADC1_IN13 */ GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_4; GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; LL_GPIO_Init(GPIOC, &GPIO_InitStruct); /* ADC1 interrupt Init */ NVIC_SetPriority(ADC1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0)); NVIC_EnableIRQ(ADC1_IRQn); /**Common config */ ADC_InitStruct.Resolution = LL_ADC_RESOLUTION_12B; ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT; ADC_InitStruct.LowPowerMode = LL_ADC_LP_MODE_NONE; LL_ADC_Init(ADC1, &ADC_InitStruct); ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_SOFTWARE; ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE; ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE; ADC_REG_InitStruct.ContinuousMode = LL_ADC_REG_CONV_SINGLE; ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_LIMITED; ADC_REG_InitStruct.Overrun = LL_ADC_REG_OVR_DATA_PRESERVED; LL_ADC_REG_Init(ADC1, &ADC_REG_InitStruct); LL_ADC_SetOverSamplingScope(ADC1, LL_ADC_OVS_DISABLE); ADC_CommonInitStruct.CommonClock = LL_ADC_CLOCK_ASYNC_DIV1; LL_ADC_CommonInit(__LL_ADC_COMMON_INSTANCE(ADC1), &ADC_CommonInitStruct); LL_ADC_EnableIT_EOC(ADC1); LL_ADC_DisableIT_EOS(ADC1); /**Configure Regular Channel */ LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_1); LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_1, LL_ADC_SAMPLINGTIME_2CYCLES_5); LL_ADC_SetChannelSingleDiff(ADC1, LL_ADC_CHANNEL_1, LL_ADC_SINGLE_ENDED); } A ciało przerwania ADC tak: void ADC1_IRQHandler(void) { /* USER CODE BEGIN ADC1_IRQn 0 */ /* USER CODE END ADC1_IRQn 0 */ /* USER CODE BEGIN ADC1_IRQn 1 */ /* USER CODE END ADC1_IRQn 1 */ } Wstawiłem tylko wygenerowane fragmenty kodu, gdyż stwierdziłem że nie ma sensu wstawiać tu kodów wszystkich moich prób. Bardzo proszę o wskazanie mi, co mam gdzie wpisać, bądź jakich funkcji użyć, lub jeśli to nie problem napisać fragmenty uzupełniając powyższy kod, bo już sam nie wiem jak to mam zrobić. Za wszystkie odpowiedzi i pomoc bardzo dziękuję.
  11. Dziękuję Wam za szybką odpowiedź Jestem początkujący, przepraszam za zbyt ogólne pytanie. Elvis , zdaje się, że masz racje. Mam problem z tym, jak czytać dokumentacje techniczną STM32. Nie wiem jak się za to zabrać, na przykład jak skonfigurować zegar uC oraz peryferia. Wcześniej wszystko robiłem w HALu, lecz projekty generowane w HALu, za dużo ważą, stąd chciałbym przejść na LL, a najbardziej pisać na samych rejestrach. Czy jest jakiś odtwórczy schemat pracy na stm32? Moja wersja to STM32L452RE-P. Potrzebuje jakiś wskazówek na co patrzeć by uruchomić na przykład USART. Nie mam też czasu na to by czytać cały reference manual, dlatego prosiłbym Was o pomoc, jak korzystać z dokumentacji STM i jak ją rozumieć.
  12. Cześć Chciałbym dowiedzieć się jak programować stm32 w LL. Jak do tego podejść?
  13. Cześć Mam pytanie odnośnie GPIO. Jakie parametry muszę wprowadzić na pin by był on w stanie wysokiej impedancji? Pozdrawiam
  14. Witajcie, chciałem uruchomić odczyt z ADC1 z kanału 0 na STM32F401RE. Niestety program nie działa. Kod: ADC_InitTypeDef adc; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_StructInit(&adc); adc.ADC_ContinuousConvMode = ENABLE; //adc.ADC_NbrOfChannel = 1; adc.ADC_NbrOfConversion=1; adc.ADC_ScanConvMode=1; adc.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None; ADC_Init(ADC1, &adc); ADC_RegularChannelConfig(ADC1, ADC_Channel_0,1,ADC_SampleTime_28Cycles); //ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 1, ADC_SampleTime_71Cycles5); ADC_Cmd(ADC1, ENABLE); //ADC_ResetCalibration(ADC1); //while (ADC_GetResetCalibrationStatus(ADC1)); //ADC_StartCalibration(ADC1); //while (ADC_GetCalibrationStatus(ADC1)); ADC_TempSensorVrefintCmd(ENABLE); ADC_SoftwareStartConv(ADC1); Czy ktoś jest w stanie mi powiedzieć co jest źle, bądź co zapomniałem uwzględnić? Uprzejmie proszę o pomoc, Pozdrawiam
  15. Bardzo dziękuję Nawyk ! Program działa. Jedyną rzecz (czego nie rozumiem) jaką należy zmienić to USART_BaudRate . Jeśli chcę by nadawał z wartością 115200 to muszę wpisać (przynajmniej w moim wypadku) wartość trzy razy większą: USART_BaudRate = 345600. Doszedłem do tego sprawdzając po kolei wszystkie możliwe prędkości po stronie komputera, bo pojawiały się "krzaczki". Jestem ogromnie wdzięczny i jeszcze raz bardzo dziękuję. Pozdrawiam :)))
×
×
  • Utwórz nowe...