Связать структуру драйвера CMSIS с периферийным устройством CMSIS Cortex-M4

#c #arm #cortex-m #texas-instruments #cmsis

#c #arm #cortex-m #texas-instruments #cmsis

Вопрос:

Мне было интересно, как я могу связать драйвер CMSIS, например структуру данных драйвера I2C, с его физическим периферийным устройством?

Итак, вот структура в Driver_I2C.h

 typedef struct _ARM_DRIVER_I2C {
  ARM_DRIVER_VERSION   (*GetVersion)     (void);                                                                ///< Pointer to ref ARM_I2C_GetVersion : Get driver version.
  ARM_I2C_CAPABILITIES (*GetCapabilities)(void);                                                                ///< Pointer to ref ARM_I2C_GetCapabilities : Get driver capabilities.
  int32_t              (*Initialize)     (ARM_I2C_SignalEvent_t cb_event);                                      ///< Pointer to ref ARM_I2C_Initialize : Initialize I2C Interface.
  int32_t              (*Uninitialize)   (void);                                                                ///< Pointer to ref ARM_I2C_Uninitialize : De-initialize I2C Interface.
  int32_t              (*PowerControl)   (ARM_POWER_STATE state);                                               ///< Pointer to ref ARM_I2C_PowerControl : Control I2C Interface Power.
  int32_t              (*MasterTransmit) (uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending); ///< Pointer to ref ARM_I2C_MasterTransmit : Start transmitting data as I2C Master.
  int32_t              (*MasterReceive)  (uint32_t addr,       uint8_t *data, uint32_t num, bool xfer_pending); ///< Pointer to ref ARM_I2C_MasterReceive : Start receiving data as I2C Master.
  int32_t              (*SlaveTransmit)  (               const uint8_t *data, uint32_t num);                    ///< Pointer to ref ARM_I2C_SlaveTransmit : Start transmitting data as I2C Slave.
  int32_t              (*SlaveReceive)   (                     uint8_t *data, uint32_t num);                    ///< Pointer to ref ARM_I2C_SlaveReceive : Start receiving data as I2C Slave.
  int32_t              (*GetDataCount)   (void);                                                                ///< Pointer to ref ARM_I2C_GetDataCount : Get transferred data count.
  int32_t              (*Control)        (uint32_t control, uint32_t arg);                                      ///< Pointer to ref ARM_I2C_Control : Control I2C Interface.
  ARM_I2C_STATUS       (*GetStatus)      (void);                                                                ///< Pointer to ref ARM_I2C_GetStatus : Get I2C status.
} const ARM_DRIVER_I2C;
  

Я создаю переменную, которая использует эту структуру в моем main.c :

 ARM_DRIVER_I2C Driver_I2C0; //Create a instance of I2C0
  

Но как мне связать эту переменную с периферийным устройством I2C0 CMSIS Cortex M4? (TM4C123GH6PM.h)

  typedef struct {                                    /*!< I2C0 Structure                                                        */
  __IO uint32_t  MSA;                               /*!< I2C Master Slave Address                                              */

  union {
    __IO uint32_t  MCS_I2C0_ALT;                    /*!< I2C Master Control/Status                                             */
    __IO uint32_t  MCS;                             /*!< I2C Master Control/Status                                             */
  };
  __IO uint32_t  MDR;                               /*!< I2C Master Data                                                       */
  __IO uint32_t  MTPR;                              /*!< I2C Master Timer Period                                               */
  __IO uint32_t  MIMR;                              /*!< I2C Master Interrupt Mask                                             */
  __IO uint32_t  MRIS;                              /*!< I2C Master Raw Interrupt Status                                       */
  __IO uint32_t  MMIS;                              /*!< I2C Master Masked Interrupt Status                                    */
  __O  uint32_t  MICR;                              /*!< I2C Master Interrupt Clear                                            */
  __IO uint32_t  MCR;                               /*!< I2C Master Configuration                                              */
  __IO uint32_t  MCLKOCNT;                          /*!< I2C Master Clock Low Timeout Count                                    */
  __I  uint32_t  RESERVED0;
  __IO uint32_t  MBMON;                             /*!< I2C Master Bus Monitor                                                */
  __I  uint32_t  RESERVED1[2];
  __IO uint32_t  MCR2;                              /*!< I2C Master Configuration 2                                            */
  __I  uint32_t  RESERVED2[497];
  __IO uint32_t  SOAR;                              /*!< I2C Slave Own Address                                                 */

  union {
    __IO uint32_t  SCSR_I2C0_ALT;                   /*!< I2C Slave Control/Status                                              */
    __IO uint32_t  SCSR;                            /*!< I2C Slave Control/Status                                              */
  };
  __IO uint32_t  SDR;                               /*!< I2C Slave Data                                                        */
  __IO uint32_t  SIMR;                              /*!< I2C Slave Interrupt Mask                                              */
  __IO uint32_t  SRIS;                              /*!< I2C Slave Raw Interrupt Status                                        */
  __IO uint32_t  SMIS;                              /*!< I2C Slave Masked Interrupt Status                                     */
  __O  uint32_t  SICR;                              /*!< I2C Slave Interrupt Clear                                             */
  __IO uint32_t  SOAR2;                             /*!< I2C Slave Own Address 2                                               */
  __IO uint32_t  SACKCTL;                           /*!< I2C Slave ACK Control                                                 */
  __I  uint32_t  RESERVED3[487];
  __IO uint32_t  PP;                                /*!< I2C Peripheral Properties                                             */
  __IO uint32_t  PC;                                /*!< I2C Peripheral Configuration                                          */
} I2C0_Type;
  

Вопрос: Есть ли в шаблоне CMSIS способ обработки этой ссылки или мне нужно сделать это самостоятельно, добавив указатель на эту структуру M4 Cortex, например?

Спасибо 🙂

Комментарии:

1. Я не могу понять, какое отношение одно имеет к другому. Один из них — это регистры, которым нужен драйвер, если вы хотите, чтобы они работали, другой связан с некоторой библиотекой высокого уровня (/ driver). Поэтому вам нужно заполнить пробел кодом, специфичным для чипа / периферийного устройства. Которое ti должен был предоставить. Просто используйте изолированную среду ti, если вы не хотите настраивать периферийное устройство самостоятельно.

2. Ну, если я правильно понимаю, я должен заполнить пробел в Driver_I2C.c, где указаны функции keil.com/pack/doc/cmsis/driver/html/Driver__I2C_8c.html Но если мне нужно сделать эту библиотеку переносимой, мне нужно указать где-нибудь периферийное устройство для правильного использования?

3. Зачем заново изобретать колесо, если вы чувствуете необходимость использовать CMSIS, просто используйте код из ti, включая любую изолированную среду и примеры. Или избегайте CMSIS и используйте периферийное устройство напрямую, или используйте библиотеку pre-cmsis (от ti, конечно).

4. Что не так с решением ti, что вы пытаетесь сделать что-то еще? Что насчет того, что у вас это не сработает?

5. Мне просто было любопытно, как работают CMSIS: D, поэтому я сделал небольшой проект, чтобы лучше ознакомиться со встроенным программированием. Спасибо за ответы, если у вас есть какой-нибудь полезный веб-сайт о встроенном программировании / ARM, мне действительно интересно!