WiseLord писал(а):Но ведь это на 8-битном AVR происходило, вот в чём прикол.
Компилятору виднее. Так, глядя на результат инверсии, sizeof(int) небось 2 рапортует.
WiseLord писал(а):Но ведь это на 8-битном AVR происходило, вот в чём прикол.
Код: Выделить всё
#include "stm32f2xx_hal.h"
CAN_HandleTypeDef hcan1;
static void MX_CAN1_Init(void);
int main(void)
{
while (1)
{
//Смотрю значения до присваивания и вывожу в UART. Результат следующий: по идее, там - мусор)
hcan1.pTxMsg->DLC = 0xF5;
hcan1.pTxMsg->Data[0] = 0xE1;
hcan1.pTxMsg->Data[1] = 0x01;
hcan1.pTxMsg->Data[2] = 0x00;
hcan1.pTxMsg->Data[3] = 0x08;
hcan1.pTxMsg->Data[4] = 0x1B;
hcan1.pTxMsg->Data[5] = 0x19;
hcan1.pTxMsg->Data[6] = 0x00;
hcan1.pTxMsg->Data[7] = 0x08;
//Присваиваю значения членам структуры pTxMsg
hcan1.pTxMsg->DLC = 0x08;
hcan1.pTxMsg->Data[0] = 0x00;
hcan1.pTxMsg->Data[1] = 0x01;
hcan1.pTxMsg->Data[2] = 0x02;
hcan1.pTxMsg->Data[3] = 0x03;
hcan1.pTxMsg->Data[4] = 0x04;
hcan1.pTxMsg->Data[5] = 0x05;
hcan1.pTxMsg->Data[6] = 0x06;
hcan1.pTxMsg->Data[7] = 0x07;
//Смотрю значения членов структуры после присваивания и вывожу в UART. Результат - тот же самый мусор
hcan1.pTxMsg->DLC = 0xF5;
hcan1.pTxMsg->Data[0] = 0xE1;
hcan1.pTxMsg->Data[1] = 0x01;
hcan1.pTxMsg->Data[2] = 0x00;
hcan1.pTxMsg->Data[3] = 0x08;
hcan1.pTxMsg->Data[4] = 0x1B;
hcan1.pTxMsg->Data[5] = 0x19;
hcan1.pTxMsg->Data[6] = 0x00;
hcan1.pTxMsg->Data[7] = 0x08;
}
}
/* CAN1 init function */
void MX_CAN1_Init(void)
{
hcan1.Instance = CAN1;
hcan1.Init.Prescaler = 5;
hcan1.Init.Mode = CAN_MODE_NORMAL;
hcan1.Init.SJW = CAN_SJW_1TQ;
hcan1.Init.BS1 = CAN_BS1_6TQ;
hcan1.Init.BS2 = CAN_BS2_5TQ;
hcan1.Init.TTCM = DISABLE;
hcan1.Init.ABOM = DISABLE;
hcan1.Init.AWUM = DISABLE;
hcan1.Init.NART = DISABLE;
hcan1.Init.RFLM = DISABLE;
hcan1.Init.TXFP = DISABLE;
HAL_CAN_Init(&hcan1);
}
Код: Выделить всё
* @file stm32f2xx_hal_can.h
typedef struct
{
CAN_TypeDef *Instance; /*!< Register base address */
CAN_InitTypeDef Init; /*!< CAN required parameters */
CanTxMsgTypeDef* pTxMsg; /*!< Pointer to transmit structure */
CanRxMsgTypeDef* pRxMsg; /*!< Pointer to reception structure */
__IO HAL_CAN_StateTypeDef State; /*!< CAN communication state */
HAL_LockTypeDef Lock; /*!< CAN locking object */
__IO uint32_t ErrorCode; /*!< CAN Error code */
}CAN_HandleTypeDef;
typedef struct
{
uint32_t Prescaler; /*!< Specifies the length of a time quantum.
This parameter must be a number between Min_Data = 1 and Max_Data = 1024 */
uint32_t Mode; /*!< Specifies the CAN operating mode.
This parameter can be a value of @ref CAN_operating_mode */
uint32_t SJW; /*!< Specifies the maximum number of time quanta
the CAN hardware is allowed to lengthen or
shorten a bit to perform resynchronization.
This parameter can be a value of @ref CAN_synchronisation_jump_width */
uint32_t BS1; /*!< Specifies the number of time quanta in Bit Segment 1.
This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_1 */
uint32_t BS2; /*!< Specifies the number of time quanta in Bit Segment 2.
This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_2 */
uint32_t TTCM; /*!< Enable or disable the time triggered communication mode.
This parameter can be set to ENABLE or DISABLE. */
uint32_t ABOM; /*!< Enable or disable the automatic bus-off management.
This parameter can be set to ENABLE or DISABLE */
uint32_t AWUM; /*!< Enable or disable the automatic wake-up mode.
This parameter can be set to ENABLE or DISABLE */
uint32_t NART; /*!< Enable or disable the non-automatic retransmission mode.
This parameter can be set to ENABLE or DISABLE */
uint32_t RFLM; /*!< Enable or disable the receive FIFO Locked mode.
This parameter can be set to ENABLE or DISABLE */
uint32_t TXFP; /*!< Enable or disable the transmit FIFO priority.
This parameter can be set to ENABLE or DISABLE */
}CAN_InitTypeDef;
typedef struct
{
uint32_t StdId; /*!< Specifies the standard identifier.
This parameter must be a number between Min_Data = 0 and Max_Data = 0x7FF */
uint32_t ExtId; /*!< Specifies the extended identifier.
This parameter must be a number between Min_Data = 0 and Max_Data = 0x1FFFFFFF */
uint32_t IDE; /*!< Specifies the type of identifier for the message that will be transmitted.
This parameter can be a value of @ref CAN_Identifier_Type */
uint32_t RTR; /*!< Specifies the type of frame for the message that will be transmitted.
This parameter can be a value of @ref CAN_remote_transmission_request */
uint32_t DLC; /*!< Specifies the length of the frame that will be transmitted.
This parameter must be a number between Min_Data = 0 and Max_Data = 8 */
uint8_t Data[8]; /*!< Contains the data to be transmitted.
This parameter must be a number between Min_Data = 0 and Max_Data = 0xFF */
}CanTxMsgTypeDefКод: Выделить всё
t_i2c_status i2c_wr_reg(unsigned char address, unsigned char reg_addr, char * data, unsigned char length);Код: Выделить всё
const char init_sequence[] = {
// Init sequence for 128x64 OLED module
SSD1306_DISPLAYOFF,
....
SSD1306_DISPLAYON //--turn on oled panel
}Код: Выделить всё
main.c(178): error: #167: argument of type "const char *" is incompatible with parameter of type "char *"
i2c_wr_reg(SD1306_I2C_ADDRESS, 0x00, init_sequence, sizeof(init_sequence));
main.c: 0 warnings, 1 errorКод: Выделить всё
i2c_wr_reg(SSD1306_I2C_ADDRESS, 0x00, "start_sequence", sizeof(init_sequence)); uldemir писал(а):Потом, почему-то, не позволет объявление этого массива сделать непосредственно рядом с вызовом этой функции (хотя IAR на это не возражал).
uldemir писал(а):Самое интересное, если бы инициализационные коды были бы печатные, то конструкция
uldemir писал(а):пороходит, несмотря на то, что ему в данном случае передаётся константная строка.
uldemir писал(а):Вопрос собственно и состоит, как эту инициализационную последовательность изящно засунуть в память программ не куроча функцию.
Siarzhuk писал(а):А что говорит?
Код: Выделить всё
main.c(211): error: #268: declaration may not appear after executable statement in block
char start_col[] = {SSD1306_COLUMNADDR, 0, SSD1306_LCDWIDTH-1, SSD1306_PAGEADDR, 0, 7};
main.c: 0 warnings, 1 errorСпособ интересный, но тогда снова придётся делать два комплекта дефайнов - для констант и для строк. Ладно, попробую обойтись.Siarzhuk писал(а):В строковый литерал можно запихать всё что угодно: "\x00\xFFHalli\xCCHallo!\x1F",
О! это хорошо решает проблему. Спасибо. жаль только, не могу найти хорошую библиотеку для мастера I2C для stm32f0. Приходится дёргать огрызки из разных источников.Siarzhuk писал(а):У прожжёного дизайнера библиотек в определении отдаваемого на передачу буфера обязательно const будет.
Код: Выделить всё
#ifndef _DRIVER_H_
#define _DRIVER_H_
....сам х-файл
#endif
uldemir писал(а):declaration may not appear after executable statement in block [....] т.е. совершенно это неприемлет. Хотя, помнится, в IARе такое делал.
Код: Выделить всё
int i = 0;
[...]
i = 9;
{ // <- огораживаемся, огораживаемся
int u = 5; // и никто больше не ругается на это объявление
send (u);
} // ну вот и всё - окончен блок, беру шинель иду домой ...
uldemir писал(а):Способ интересный, но тогда снова придётся делать два комплекта дефайнов - для констант и для строк.
Код: Выделить всё
#define S(_code) "\0" _S(_code)
#define _S(_code) #_code
#define OGO 000 // decimal 0
#define AGA 050 // decimal 40
const char* ppd = S(OGO) S(AGA); // const char* ppd = "\0" "000" "\0" "050";
Apparatchik писал(а):ARV писал(а):Есче интересно знать, битовые поля применяются когда оперативной памяти мало или просто для удобства. На сколько это выгоднее конструкции типа var |= 1 << 4;
Код: Выделить всё
RCC_CFGR->HPRE = presc;
Код: Выделить всё
RCC->CFGR = RCC->CFGR & ~RCC_CFGR_HPRE | (presc << 4);
ARV писал(а):на сколько я в курсе, подобным образом вся периферия ARM описана в соответствующих хедерах, и вся работа с нею ведется подобным образом
Хм, по ошущениям львиная доля применений f-суффикса - затыкать предупреждения компилятора на "возможную потерю точности" при приведении double литерала к типу float. Т.е. компилятор в сомнениях - или мы явно хотим использовать double константу, но почему-то втискиваем её во float, или просто неряшливо пишем код [без f-суффиксов] и тоже заслуживаем "фе" с его стороны. Но, с другой стороны, если преобразование 7.5 <-> 7.5f происходит без потери точности - отчего-бы и не соптимизировать.WiseLord писал(а):во втором случае он бы сгенерировал более сложный машинный код с приведением типов.
Код: Выделить всё
switch(f){
case 0 ... 5 : break;
case 6 ... 155: break;
default:
break;
}