Перейти к содержанию
    

B-L475E-IOT01A

взял код с готового примера

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 регистре не подымается. в чем может быть проблема? на плате внешний осцилятор не поставлен. инициализация с внутреннего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

После сброса МК итак тактируется от MSI.

 

2 часа назад, jenya7 сказал:

...бит  MSIRDY BIT в CR регистре не подымается...

Не может быть такого. Вы контроллер в проекте точно тот выбрали?

ИМХО, проблема не в коде а где-то в настройках самого проекта.

После сброса МК, что показывает отладчик в регистре CR?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 hours ago, Arlleex said:

После сброса МК итак тактируется от MSI.

 

Не может быть такого. Вы контроллер в проекте точно тот выбрали?

ИМХО, проблема не в коде а где-то в настройках самого проекта.

После сброса МК, что показывает отладчик в регистре CR?

Я открыл демо проект для этой платы который они дают и сравнил - тот же  STM32L475VC.

в начале CR выглядит так

rcc_cr.png.fc391052b5bd65547734f954b8333d02.png

до 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;

никакого криминала не вижу. не могу понять почему не запускается внутренний осцилятор.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А пошагать под отладчиком по этим самым LL-функциям?

А лучше руками согласно даташиту установить MSI и проверить его Ready.

Раз под отладчиком заходит, значит MSI все-таки работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

обнаружил такую фигню

сначала я включаю клоки

    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

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сейчас такая проблема с 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);

 

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На плате есть модуль 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] не абсолютный адрес. серьезный фак со стороны разработчиков С.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, jenya7 сказал:

...вот как. array[index] не абсолютный адрес. серьезный фак со стороны разработчиков С.

Чего-чего?:wacko2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, Arlleex said:

Чего-чего?:wacko2:

это как минимум путает. нужно держать в голове что pData[0] это уже не нулевой индекс, а первый индекс текущего указателя. выстрел в ногу может мягко перейти в выстрел в голову. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, jenya7 сказал:

это как минимум путает. нужно держать в голове что pData[0] это уже не нулевой индекс, а первый индекс текущего указателя. выстрел в ногу может мягко перейти в выстрел в голову. :)

А причем тут разработчики Си?

Примеров нелогичных конструкций предостаточно можно придумать.

Как видно в данном случае, одно и то же можно написать несколькими способами:smile:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, Arlleex said:

А причем тут разработчики Си?

Примеров нелогичных конструкций предостаточно можно придумать.

Как видно в данном случае, одно и то же можно написать несколькими способами:smile:

разработчики Си могли бы запретить такие финты. сделать array[index] - абсолютный указатель. передача имени - array - всегда указатель на нулевой индекс. кто то же позаботился чтоб это было так а не иначе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, jenya7 сказал:

разработчики Си могли бы запретить такие финты. сделать array[index] - абсолютный указатель. передача имени - array - всегда указатель на нулевой индекс. кто то же позаботился чтоб это было так а не иначе.

Передавайте type *const ptr. В этом случае в функции указатель прямо поменять будет нельзя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...