|
|
  |
проблемы с байтовым инструкциями, stm32f767 |
|
|
|
Feb 14 2017, 09:33
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Alechek @ Feb 13 2017, 18:34)  Раньше пользовал. Сейчас стараюсь использовать заголовочники под процессор в с стиле CMSIS. Так более универсальней получается и меньше кода если несколько бит одновременно изменить надо. Слушайте, ну незнание не освобождает и далее по тексту.... Там имеется и то и другое... Цитата(KRS @ Feb 13 2017, 20:20)  IAR - делает! но у него запись битовых полей в 32 разрядные регистры не приводит к байтовым операциям! ну да. Не сталкивался... )) Цитата(klen @ Feb 14 2017, 01:02)  например теперь невозможно записать в поля номера канала регистра DMAx_STREAMy.channel канал которого нет - его не будет в перечислении  И это тоже сделано за вас, заметьте... )) Причём я не предлагаю вам пользоваться IAR. Возьмите хидер готовый... ))
|
|
|
|
|
Feb 14 2017, 09:34
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Сергей Борщ @ Feb 14 2017, 11:00)  Да ладно? Если underlying type у битового поля объявлен как uint32_t - это как раз прямое указание использовать 32-битный доступ, а volatile в объявлении структуры - "и не фантазировать". Ну, это примерно такая же гарантия, что и переменная, объявленная как register, будет размещена в регистре Можете надеяться, конечно, но стандарт на этот счёт молчит, как рыба об лёд. Может быть, я что-то пропустил, тогда прошу привести цитату из стандарта.
|
|
|
|
|
Feb 14 2017, 09:40
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Вот хидер на 407 камень вот первое попавшиеся ... Код typedef struct { __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ uint32_t RESERVED2; /*!< Reserved, 0x208 */ __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ uint32_t RESERVED3; /*!< Reserved, 0x210 */ __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ uint32_t RESERVED4; /*!< Reserved, 0x218 */ __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ } CAN_TypeDef; Ну и далее по тексту для любителей якобы CMSIS Код /*!<CAN control and status registers */ /******************* Bit definition for CAN_MCR register ********************/ #define CAN_MCR_INRQ ((uint32_t)0x00000001) /*!<Initialization Request */ #define CAN_MCR_SLEEP ((uint32_t)0x00000002) /*!<Sleep Mode Request */ #define CAN_MCR_TXFP ((uint32_t)0x00000004) /*!<Transmit FIFO Priority */ #define CAN_MCR_RFLM ((uint32_t)0x00000008) /*!<Receive FIFO Locked Mode */ #define CAN_MCR_NART ((uint32_t)0x00000010) /*!<No Automatic Retransmission */ #define CAN_MCR_AWUM ((uint32_t)0x00000020) /*!<Automatic Wakeup Mode */ #define CAN_MCR_ABOM ((uint32_t)0x00000040) /*!<Automatic Bus-Off Management */ #define CAN_MCR_TTCM ((uint32_t)0x00000080) /*!<Time Triggered Communication Mode */ #define CAN_MCR_RESET ((uint32_t)0x00008000) /*!<bxCAN software master reset */ #define CAN_MCR_DBF ((uint32_t)0x00010000) /*!<bxCAN Debug freeze */ /******************* Bit definition for CAN_MSR register ********************/ #define CAN_MSR_INAK ((uint32_t)0x0001) /*!<Initialization Acknowledge */ #define CAN_MSR_SLAK ((uint32_t)0x0002) /*!<Sleep Acknowledge */ #define CAN_MSR_ERRI ((uint32_t)0x0004) /*!<Error Interrupt */ #define CAN_MSR_WKUI ((uint32_t)0x0008) /*!<Wakeup Interrupt */ #define CAN_MSR_SLAKI ((uint32_t)0x0010) /*!<Sleep Acknowledge Interrupt */ #define CAN_MSR_TXM ((uint32_t)0x0100) /*!<Transmit Mode */ #define CAN_MSR_RXM ((uint32_t)0x0200) /*!<Receive Mode */ #define CAN_MSR_SAMP ((uint32_t)0x0400) /*!<Last Sample Point */ #define CAN_MSR_RX ((uint32_t)0x0800) /*!<CAN Rx Signal */ Ну и так далее .... Обращаю внимание, что в битовой маске сразу указаны и устройство и регистры...
|
|
|
|
|
Feb 14 2017, 09:45
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(SasaVitebsk @ Feb 14 2017, 12:40)  Вот хидер на 407 камень Все вполне наглядно и читаемо. Сложно что-то напутать. И главное - что это уже написано и проверено самим производителем проца! Грех не воспользоваться такой халявой
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Feb 14 2017, 09:55
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (AHTOXA @ Feb 14 2017, 11:38)  Напомню про моё решение этой проблемы: вот. Я его помню, но это "гора писанины на шаблонах". QUOTE (SasaVitebsk @ Feb 14 2017, 11:40)  Обращаю внимание, что в битовой маске сразу указаны и устройство и регистры... Что не мешает ее записать не туда. Вот чесслово, сам у себя не так давно подобную описку нашел.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 14 2017, 14:07
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(SasaVitebsk @ Feb 14 2017, 14:33)  Слушайте, ну незнание не освобождает и далее по тексту.... Там имеется и то и другое... Цитата(SasaVitebsk @ Feb 14 2017, 14:40)  Вот хидер на 407 камень вот первое попавшиеся ... И где такое интересно дают? IAR 7.7 inc/ST файлов stm*.h вообще не наблюдаю есть только вида iostm*.h
|
|
|
|
|
Feb 14 2017, 15:06
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(Alechek @ Feb 14 2017, 17:53)  речь про IAR шла. Неужели в IAR не С/C++, а что-то свое, нестандартное?  оффффф. В свое время пытался по-юзать IAR, он мне оказался жутко нестандатной IDE (вот уж стоило где изобретать лисапет), поплевался, поматерился и в итоге удалил ... не жалею ни разу ))) Keil тоже не конфетка, но под нетолстые ARMы это пока что самое нормальное с привычным интерфейсом (имхо!), особенно после кроссворкса ...
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Feb 15 2017, 04:18
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(Forger @ Feb 14 2017, 20:06)  Неужели в IAR не С/C++, а что-то свое, нестандартное?  Примерно так Код /* Clock configuration register (RCC_CFGR) */ typedef struct { __REG32 SW : 2; __REG32 SWS : 2; __REG32 HPRE : 4; __REG32 PPRE1 : 3; __REG32 PPRE2 : 3; __REG32 ADC_PRE : 2; __REG32 PLLSRC : 1; __REG32 PLLXTPRE : 1; __REG32 PLLMUL : 4; __REG32 USBPRE : 1; __REG32 : 1; __REG32 MCO : 3; __REG32 : 5; } __rcc_cfgr_bits;
.... __IO_REG32_BIT(RCC_CFGR, 0x40021004,__READ_WRITE ,__rcc_cfgr_bits); Использовать как Код RCC_CFGR_bit.PLLMUL = 2;
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|