реклама на сайте
подробности

 
 
> STM32 HAL, ...и чудеса
Cosworth
сообщение Feb 5 2015, 11:51
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-12-10
Пользователь №: 61 886



Всем доброго. Две структуры:
Код
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 = ... то все ок.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
skripach
сообщение Feb 5 2015, 12:14
Сообщение #2


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Память то под структуры выделена или указатель в никуда?


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
Cosworth
сообщение Feb 5 2015, 12:26
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-12-10
Пользователь №: 61 886



Цитата(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).
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 5 2015, 12:30
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



здрасти приехали

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

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

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

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


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

Код
&oscSelector;
&clkSelector;
Go to the top of the page
 
+Quote Post
skripach
сообщение Feb 5 2015, 12:36
Сообщение #5


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Код
RCC_OscInitTypeDef *oscSelector;

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

Разумеется нет, объявление переменной TypeDef *q резервирует ровно 4 байта которые занимает указатель q (применительно к STM32). В этот указатель нужно положить адрес структуры потом можно пользоваться указателем.
Смотрите любой букварь по Си, раздел указатели.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
Cosworth
сообщение Feb 5 2015, 12:37
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-12-10
Пользователь №: 61 886



Ага, благодарю sm.gif Уже посыпал голову пеплом, даже на википедии об этом написано..

Сообщение отредактировал IgorKossak - Feb 5 2015, 19:00
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 16:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01403 секунд с 7
ELECTRONIX ©2004-2016