Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 HAL
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Cosworth
Всем доброго. Две структуры:
Код
RCC_OscInitTypeDef *oscSelector;
RCC_ClkInitTypeDef *clkSelector;

Заполняю поля:
Код
clkSelector->SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
clkSelector->ClockType = RCC_CLOCKTYPE_SYSCLK;
...
oscSelector->OscillatorType = RCC_OSCILLATORTYPE_HSE;
oscSelector->HSEState = RCC_HSE_ON;
...

В результате в отладчике, clkSelector заполняется как положено, oscSelector даже не меняется. Почему так? Если объявить RCC_OscInitTypeDef oscSelector; и заполнять так: oscSelector.ClockType = ... то все ок.
skripach
Память то под структуры выделена или указатель в никуда?
Cosworth
Цитата(skripach @ Feb 5 2015, 15:14) *
Память то под структуры выделена или указатель в никуда?

Ни для одной ни для другой ничего не выделял, собственно вот такой код:
Код
void systemClockInit()
{
    RCC_OscInitTypeDef *oscSel;
    RCC_ClkInitTypeDef *clk;
    GPIO_InitTypeDef *mco;
        
    oscSel->OscillatorType = RCC_OSCILLATORTYPE_HSE;
    oscSel->HSEState = RCC_HSE_ON;
    oscSel->PLL.PLLSource = RCC_PLLSOURCE_HSE;
    oscSel->PLL.PLLState = RCC_PLL_ON;
    oscSel->PLL.PLLM = 8;
    oscSel->PLL.PLLN = 192;
    oscSel->PLL.PLLP = RCC_PLLP_DIV4;
    oscSel->PLL.PLLQ = 4;
    HAL_RCC_OscConfig(oscSel);
    
    clk->SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    clk->ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
    clk->AHBCLKDivider = RCC_SYSCLK_DIV1;
    clk->APB1CLKDivider = RCC_HCLK_DIV2;
    clk->APB2CLKDivider = RCC_HCLK_DIV2;
    HAL_RCC_ClockConfig(clk, FLASH_LATENCY_1);
    
    mco->Pin = GPIO_PIN_9;
    mco->Mode = GPIO_MODE_AF_PP;
    mco->Pull = GPIO_NOPULL;
    mco->Speed = GPIO_SPEED_HIGH;
    mco->Alternate = GPIO_AF0_MCO;
    HAL_GPIO_Init(GPIOC, mco);
    HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_1);
}

А разве объявление переменной TypeDef *q автоматически не резервирует область памяти с размером TypeDef? Никогда с таким не сталкивался.. Что характерно oscSel действительно указывает вникуда (0х00000000).
Golikov A.
здрасти приехали

int a;
int* b = (int *)&a;
int* c = (int *)&a;
int* e = (int *)&a;

и сколько по вашем переменных типа int создалось в памяти?

указатель - это указатель, это 32 битное значение с адресом, и если вы не сделаете структуры на которую он указывает он так и будет ничем...

надо
Код
RCC_OscInitTypeDef oscSelector;
RCC_ClkInitTypeDef clkSelector;


а передавать их надо

Код
&oscSelector;
&clkSelector;
skripach
Код
RCC_OscInitTypeDef *oscSelector;

Это объявление указателя на структуру, сама структура должна быть объявлена отдельно.
Цитата
А разве объявление переменной TypeDef *q автоматически не резервирует область памяти с размером TypeDef?

Разумеется нет, объявление переменной TypeDef *q резервирует ровно 4 байта которые занимает указатель q (применительно к STM32). В этот указатель нужно положить адрес структуры потом можно пользоваться указателем.
Смотрите любой букварь по Си, раздел указатели.
Cosworth
Ага, благодарю sm.gif Уже посыпал голову пеплом, даже на википедии об этом написано..
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.