Jump to content

    

Помогите с синтаксисом

Создал структуру

typedef struct
  {
    float K_Ves;        // 4 byte Вес/значение АСП 
    float Giray;        // 4 byte Калибровочный вес
  } Kalibr_Par;

Создаю указатель на структуру

uint32_t* AddressSrc = (void *)&Kalibr_Par;

На эту строчку Keil ругается. Что не так? Используется в функции 

HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, AddressDes, *(uint32_t *)AddressSrc)

 

Share this post


Link to post
Share on other sites
2 minutes ago, Юрий48 said:

Создал структуру

Вы создали не структуру, а тип. Или уберите typedef или создайте объект:

Kalibr_Par cal;

uint32_t* AddressSrc = (void *)&cal;

Share this post


Link to post
Share on other sites
Kalibr_Par cal;

Kalibr_Par * p_cal = &cal;

p_cal->K_Ves = 0.0f;

Share this post


Link to post
Share on other sites

Спасибо всем. Не то, что бы полноценно осмыслил, но вот так заработало.

 typedef struct
  {
    float K_Ves;        // 4 byte Вес/значение АСП 
    float Giray;        // 4 byte Калибровочный вес
  } tpKalibr_Par;
  tpKalibr_Par Kalibr_Par;

И задавать параметры можно так

Kalibr_Par.K_Ves = 1.0;
Kalibr_Par.Giray = 10.0;

Раз уж коснулся вопросов чайника, то вот эта строка

 HAL_GPIO_WritePin(GPIOC,  GPIO_PIN_13, ! HAL_GPIO_ReadPin (GPIOB, GPIO_PIN_0)); 

работает нормально. Но Keil выдаёт предупреждение на счёт восклицательного знака. А, вот, как же правильно надо записать эту конструкцию, что бы предупреждений не было.

Share this post


Link to post
Share on other sites

if((GPIOB->IDR)&(1<<0)) GPIOC->BSRR = (1<<(13+(1)*16)); else  GPIOC->BSRR = (1<<(13+(0)*16));

Share this post


Link to post
Share on other sites

Вот так получше будет

GPIOC->BSRR = (1 << 13) << (GPIOB-IDR & 1)*16;

Share this post


Link to post
Share on other sites
8 часов назад, Юрий48 сказал:

Но Keil выдаёт предупреждение на счёт восклицательного знака.

Совремнная наука отрицает существование телепатии, поэтому было бы очень полезно приводить полный текст этого предупреждения. Если, конечно, вы хотите получить ответ именно на свой вопрос, а не как два предыдущих.

Share this post


Link to post
Share on other sites
4 hours ago, mcheb said:

if((GPIOB->IDR)&(1<<0)) GPIOC->BSRR = (1<<(13+(1)*16)); else  GPIOC->BSRR = (1<<(13+(0)*16));

Это, простите, настоящий код с настоящего боевого проекта? Можно только позавидовать Вашей внимательности и усидчивости.

Share this post


Link to post
Share on other sites
3 hours ago, Сергей Борщ said:

Совремнная наука отрицает существование телепатии, поэтому было бы очень полезно приводить полный текст этого предупреждения. Если, конечно, вы хотите получить ответ именно на свой вопрос, а не как два предыдущих.

Извините. Хочу получить ответ именно на свой вопрос, поэтому исправляюсь и вот полный текст этого предупреждения

../Src/stm32f1xx_it.c(295): warning:  #188-D: enumerated type mixed with another type

     HAL_GPIO_WritePin(GPIOC,  GPIO_PIN_13, ! HAL_GPIO_ReadPin (GPIOB, GPIO_PIN_0)); 

Share this post


Link to post
Share on other sites
1 hour ago, esaulenka said:

Это, простите, настоящий код с настоящего боевого проекта? Можно только позавидовать Вашей внимательности и усидчивости.

Я пользуюсь макросами типа

/**BUTTON GPIO Configuration
    PB15     ------> BUTTON
*/
#define BUTTON_IS_PRESSED     !((GPIOB->IDR)&(1<<15))
#define BUTTON_NOT_PRESSED     ((GPIOB->IDR)&(1<<15))
#define BUTTONFREQ LEDFREQ
/**LED GPIO Configuration
    PC6     ------>   RED_LED
    PC7     ------> GREEN_LED
*/
#define Gled(x)         GPIOC->BSRR = (1<<(7+(1-(x))*16))
#define Rled(x)         GPIOC->BSRR = (1<<(6+(1-(x))*16))

Share this post


Link to post
Share on other sites
2 hours ago, Юрий48 said:

../Src/stm32f1xx_it.c(295): warning:  #188-D: enumerated type mixed with another type

Подозреваю, что 3й параметр в HAL_GPIO_WritePin  какой то enum. '!' возвращает bool (или int - в зависимости от версии языка)

Явно приведите тип

 

Share this post


Link to post
Share on other sites
2 часа назад, Юрий48 сказал:

../Src/stm32f1xx_it.c(295): warning:  #188-D: enumerated type mixed with another type

     HAL_GPIO_WritePin(GPIOC,  GPIO_PIN_13, ! HAL_GPIO_ReadPin (GPIOB, GPIO_PIN_0)); 

Вероятно, функция HAL_GPIO_WritePin ожидает в качестве третьего параметра какой-то свой велосипедный enum, в котором закодированы значения true и false. Про стандартный stdbool.h разработчики куба, скорее всего, не слышали. Попробуйте так:

HAL_GPIO_WritePin(GPIOC,  GPIO_PIN_13, (enum_type)(!HAL_GPIO_ReadPin (GPIOB, GPIO_PIN_0))); 

вместо enum_type подставьте тот тип, который ожидает функция HAL_GPIO_WritePin. Его вы можете увидеть в описании или в прототипе функции.

Share this post


Link to post
Share on other sites

Конечно телепаты уехали.

Но всегда есть книги. Когда товарищ пишет !, какую операцию он имеет в своей голове ?

И к какому выражению он её хочет применить.

Что такое ! 5 ? Пять минут подумать и ответ будет сам собой (5 это просто для примера, можно подставить 135).

Хотя 135 это тоже не просто так.

Share this post


Link to post
Share on other sites

Отрывок из stm32f1xx_hal_gpio.h:

typedef enum
{
  GPIO_PIN_RESET = 0U,
  GPIO_PIN_SET
}GPIO_PinState;

...

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);

...

Проще 

HAL_GPIO_WritePin(GPIOC,  GPIO_PIN_13, ! HAL_GPIO_ReadPin (GPIOB, GPIO_PIN_0));

переписать через IF...ELSE и не морочить себе голову:

state = HAL_GPIO_ReadPin (GPIOB, GPIO_PIN_0);

if (state == .... )
   HAL_GPIO_WritePin(GPIOC,  GPIO_PIN_13, .... );
else
   HAL_GPIO_WritePin(GPIOC,  GPIO_PIN_13, .... );

 

Share this post


Link to post
Share on other sites
1 hour ago, Сергей Борщ said:

Попробуйте так:


HAL_GPIO_WritePin(GPIOC,  GPIO_PIN_13, (enum_type)(!HAL_GPIO_ReadPin (GPIOB, GPIO_PIN_0))); 

вместо enum_type подставьте тот тип, который ожидает функция HAL_GPIO_WritePin. Его вы можете увидеть в описании или в прототипе функции.

Спасибо больше. Именно в таком духе и ожидал ответ. Ещё раз прошу извинений за несобранность и благодарю за снисхождение к чайникам. 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now