zheka 1 30 ноября, 2012 Опубликовано 30 ноября, 2012 · Жалоба Господа, есть библиотека, написанная на ногодрыге под AVR. В ней полно строк типа CS=1;CS=0; DOUT=1; DOUT=0; Я хочу ее переделать под STM32F103. Допустим я хочу прилепить CS на PA0; Как мне дописать строку #define CS чтобы CS=1; включало единичку на PA0 ? Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maksimp 0 30 ноября, 2012 Опубликовано 30 ноября, 2012 · Жалоба Два варианта: - Можно объявить структуру из 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". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 1 декабря, 2012 Опубликовано 1 декабря, 2012 · Жалоба Господа, есть библиотека, написанная на ногодрыге под 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 - нет) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 1 декабря, 2012 Опубликовано 1 декабря, 2012 · Жалоба Если использовать раздельные макросы типа LOW_CS() HIGH_CS(), то не будет никаких проблем с переносимостью между семействами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться