Перейти к содержанию
    

Как сделать такой #define ?

Господа, есть библиотека, написанная на ногодрыге под AVR.

В ней полно строк типа CS=1;CS=0; DOUT=1; DOUT=0;

 

Я хочу ее переделать под STM32F103.

Допустим я хочу прилепить CS на PA0;

 

Как мне дописать строку #define CS чтобы CS=1; включало единичку на PA0 ?

 

Спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Два варианта:

- Можно объявить структуру из 16 однобитовых полей и разместить её по адресу GPIOA->ODR. По сути это будет как на AVR. А #define CS сделать на младший бит её.

 

- Можно использовать аппаратную поддержку.

Имеем:

#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */

#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)

#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)

#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)

#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)

#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)

#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)

#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)

#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)

Поэтому например GPIOA_BASE = 0x40010800

Процессор поддерживает

0x40000000-0x400FFFFF Peripheral bit-band region, GPIOA_BASE туда попадает

0x42000000-0x43FFFFFF Peripheral bit-band alias, сюда обращаться

Поробнее как делать см. в документе ST: "PM0056 STM32F10xxx Cortex-M3 programming manual".

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Господа, есть библиотека, написанная на ногодрыге под AVR.

В ней полно строк типа CS=1;CS=0; DOUT=1; DOUT=0;

 

Я хочу ее переделать под STM32F103.

Допустим я хочу прилепить CS на PA0;

 

Как мне дописать строку #define CS чтобы CS=1; включало единичку на PA0 ?

 

Спасибо

#define PER_BASE       0x40000000
#define PER_BB_BASE    0x42000000
#define PER_BIT_ADDR(VarAddr,BitNumber) \
    (*(vu32 *)(PER_BB_BASE|((VarAddr-PER_BASE)<<5)|((BitNumber)<<2)))

#define  WORKLED       (8)     //!< PA8 - Светодиод "РАБОТА".
#define  WORKLED_bit  PER_BIT_ADDR(((DWORD)&GPIOA->ODR), WORKLED)
#define  ON                WORKLED_bit = 1
#define  OFF               WORKLED_bit = 0

В программе используем

ON;
OFF;
WORKLED_bit = 0;  // сброс
WORKLED_bit = 1;  // установка
WORKLED_bit ^= 1; // инверсия

 

На Cortex-M3 работать будет, на C-M0 - нет)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если использовать раздельные макросы типа LOW_CS() HIGH_CS(), то не будет никаких проблем с переносимостью между семействами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...