jenya7 0 21 января, 2020 Опубликовано 21 января, 2020 · Жалоба взял код с готового примера void SystemClock_Config(void) { /* MSI configuration and activation */ LL_FLASH_SetLatency(LL_FLASH_LATENCY_4); LL_RCC_MSI_Enable(); while(LL_RCC_MSI_IsReady() != 1) { }; /* Main PLL configuration and activation */ LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_MSI, LL_RCC_PLLM_DIV_1, 40, LL_RCC_PLLR_DIV_2); LL_RCC_PLL_Enable(); LL_RCC_PLL_EnableDomain_SYS(); while(LL_RCC_PLL_IsReady() != 1) { }; /* Sysclk activation on the main PLL */ LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) { }; /* Set APB1 & APB2 prescaler*/ LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); /* Set systick to 1ms in using frequency set to 80MHz */ /* This frequency can be calculated through LL RCC macro */ /* ex: __LL_RCC_CALC_PLLCLK_FREQ(__LL_RCC_CALC_MSI_FREQ(LL_RCC_MSIRANGESEL_RUN, LL_RCC_MSIRANGE_6), LL_RCC_PLLM_DIV_1, 40, LL_RCC_PLLR_DIV_2)*/ LL_Init1msTick(80000000); /* Update CMSIS variable (which can be updated also through SystemCoreClockUpdate function) */ LL_SetSystemCoreClock(80000000); } затыкается на while(LL_RCC_MSI_IsReady() != 1). бит MSIRDY BIT в CR регистре не подымается. в чем может быть проблема? на плате внешний осцилятор не поставлен. инициализация с внутреннего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 21 января, 2020 Опубликовано 21 января, 2020 · Жалоба После сброса МК итак тактируется от MSI. 2 часа назад, jenya7 сказал: ...бит MSIRDY BIT в CR регистре не подымается... Не может быть такого. Вы контроллер в проекте точно тот выбрали? ИМХО, проблема не в коде а где-то в настройках самого проекта. После сброса МК, что показывает отладчик в регистре CR? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 22 января, 2020 Опубликовано 22 января, 2020 (изменено) · Жалоба 14 hours ago, Arlleex said: После сброса МК итак тактируется от MSI. Не может быть такого. Вы контроллер в проекте точно тот выбрали? ИМХО, проблема не в коде а где-то в настройках самого проекта. После сброса МК, что показывает отладчик в регистре CR? Я открыл демо проект для этой платы который они дают и сравнил - тот же STM32L475VC. в начале CR выглядит так до SystemClock_Config вызывается SystemInit в которой инициализируется RCC /* Set MSION bit */ RCC->CR |= RCC_CR_MSION; /* Reset CFGR register */ RCC->CFGR = 0x00000000U; /* Reset HSEON, CSSON , HSION, and PLLON bits */ RCC->CR &= 0xEAF6FFFFU; /* Reset PLLCFGR register */ RCC->PLLCFGR = 0x00001000U; /* Reset HSEBYP bit */ RCC->CR &= 0xFFFBFFFFU; /* Disable all interrupts */ RCC->CIER = 0x00000000U; никакого криминала не вижу. не могу понять почему не запускается внутренний осцилятор. Изменено 22 января, 2020 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 22 января, 2020 Опубликовано 22 января, 2020 · Жалоба А пошагать под отладчиком по этим самым LL-функциям? А лучше руками согласно даташиту установить MSI и проверить его Ready. Раз под отладчиком заходит, значит MSI все-таки работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 28 января, 2020 Опубликовано 28 января, 2020 (изменено) · Жалоба обнаружил такую фигню сначала я включаю клоки LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC); LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOD); LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOE); LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOH); LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG); и я вижу GPIOA->AFRL = 0 GPIOA->AFRH = 0 Но после #define UART4_PORT GPIOA #define UART4_TX_PIN LL_GPIO_PIN_0 #define UART4_RX_PIN LL_GPIO_PIN_1 LL_GPIO_SetAFPin_8_15(UART4_PORT, UART4_TX_PIN, LL_GPIO_AF_8); LL_GPIO_SetAFPin_8_15(UART4_PORT, UART4_RX_PIN, LL_GPIO_AF_8); в регистрах остаются нули. GPIOA->AFRL = 0 GPIOA->AFRH = 0 Изменено 28 января, 2020 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 2 февраля, 2020 Опубликовано 2 февраля, 2020 (изменено) · Жалоба Сейчас такая проблема с UART. В начале int main(void) { /* Configure the system clock to 80 MHz */ SystemClock_Config(); GPIO_Setup(); USART_Setup(UART4, 115200); USART_SendInt(UART4, 1234, 1); USART_SendInt(UART4, 0, 1); while (1) { if (uart4_rx_ready) { uart4_rx_ready = 0; PARSER_ParseCommand(uart4_rx_buf); } } } ну и функции вывода void USART_SendString(USART_TypeDef *USARTx, const char *string) { uint32_t timeout; while (*string) { timeout = USART_TIMEOUT; while ( (USARTx->ISR & USART_ISR_TXE) == 0) { if(!timeout--) break; } USARTx->TDR = *string++; } } void USART_SendInt(USART_TypeDef *USARTx, int num, int cr) { uint32_t timeout; char str[10]; int i = 0; uint32_t sign = 0; if (num<0) { num *= -1; sign = 1; } do str[i++] = num % 10 + '0'; while ((num /= 10) > 0); if (sign) USART_SendString(USARTx,"-"); for (i--; i >= 0; i--) { timeout = USART_TIMEOUT; while( !(USARTx->ISR & USART_ISR_TXE) ) { if(!timeout--) break; } USARTx->TDR = str[i]; } if (cr) USART_SendString(USARTx, "\r"); } при вызове USART_SendInt вначале вижу 1234 0 все честно. Потом в ран тайм если я вызываю USART_SendInt - не печатает ничего, хотя я вижу что заходит внутрь и посылает каждый символ. USART_SendString работает нормально. С другими камнями, скажем STM32F3xx, USART_SendInt работает без проблем. Стою на строчке USARTx->TDR = str; и вот что вижу в начале UART адрес 0x40004C00. при последующих вызовах USART_SendInt он меняется на 0x40013800. причем когда вызываю USART_SendString адрес правильный - 0x40004C00. первый аргумент одинаковый во всех вызовах #define SYS_USART UART4 USART_SendString (SYS_USART, "Hello\r"); USART_SendInt (SYS_USART, 1234, 1); Изменено 2 февраля, 2020 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 6 февраля, 2020 Опубликовано 6 февраля, 2020 (изменено) · Жалоба На плате есть модуль WIFI. Под него есть готовые библиотеки. Такая вот функция int16_t SPI_WIFI_ReceiveData(uint8_t *pData, uint16_t len, uint32_t timeout) { int16_t length = 0; uint8_t tmp[2]; while (WIFI_IS_CMDDATA_READY()) { if((length < len) || (!len)) { spi_rx_event=1; if (HAL_SPI_Receive_IT(&hspi, tmp, 1) != HAL_OK) { WIFI_DISABLE_NSS(); UNLOCK_SPI(); return ES_WIFI_ERROR_SPI_FAILED; } wait_spi_rx_event(timeout); pData[0] = tmp[0]; pData[1] = tmp[1]; length += 2; pData += 2; } } я выкинул из нее куски не относящиеся к вопросу. они продвигают указатель pData += 2; но данные кладут всегда в начальные индексы pData[0] = tmp[0]; pData[1] = tmp[1]; я что то не понимаю? по моему должно быть так *pData++ = tmp[0]; *pData++ = tmp[1]; вот как. array[index] не абсолютный адрес. серьезный фак со стороны разработчиков С. Изменено 6 февраля, 2020 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 6 февраля, 2020 Опубликовано 6 февраля, 2020 · Жалоба 3 часа назад, jenya7 сказал: ...вот как. array[index] не абсолютный адрес. серьезный фак со стороны разработчиков С. Чего-чего? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 6 февраля, 2020 Опубликовано 6 февраля, 2020 · Жалоба 2 minutes ago, Arlleex said: Чего-чего? это как минимум путает. нужно держать в голове что pData[0] это уже не нулевой индекс, а первый индекс текущего указателя. выстрел в ногу может мягко перейти в выстрел в голову. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 6 февраля, 2020 Опубликовано 6 февраля, 2020 · Жалоба 11 минут назад, jenya7 сказал: это как минимум путает. нужно держать в голове что pData[0] это уже не нулевой индекс, а первый индекс текущего указателя. выстрел в ногу может мягко перейти в выстрел в голову. :) А причем тут разработчики Си? Примеров нелогичных конструкций предостаточно можно придумать. Как видно в данном случае, одно и то же можно написать несколькими способами Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 6 февраля, 2020 Опубликовано 6 февраля, 2020 · Жалоба 4 minutes ago, Arlleex said: А причем тут разработчики Си? Примеров нелогичных конструкций предостаточно можно придумать. Как видно в данном случае, одно и то же можно написать несколькими способами разработчики Си могли бы запретить такие финты. сделать array[index] - абсолютный указатель. передача имени - array - всегда указатель на нулевой индекс. кто то же позаботился чтоб это было так а не иначе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 6 февраля, 2020 Опубликовано 6 февраля, 2020 · Жалоба 1 час назад, jenya7 сказал: разработчики Си могли бы запретить такие финты. сделать array[index] - абсолютный указатель. передача имени - array - всегда указатель на нулевой индекс. кто то же позаботился чтоб это было так а не иначе. Передавайте type *const ptr. В этом случае в функции указатель прямо поменять будет нельзя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться