реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Как вы работаете с регистрами GPIOx_AFR?
esaulenka
сообщение Oct 22 2015, 06:22
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(Golikov A. @ Oct 21 2015, 16:12) *
а как этот правильный путь поможет задать альтернативные функции LPC? или право делать процы с альтернативными функциями пинов на арм ядре только у СТМsm.gif?


Если мне придётся снова работать с LPC'хами, буду делать библиотеку по образу и подобию.
Когда-то у меня был набор макросов (в принципе, то же самое - задавался порт, пин, режим пина), но эти хитрые шаблоны удобнее.

Варианты ЯadiatoR и AlanDrakes, которые прочитали даташит, явно неудобные. Пусть компилятор нужные смещения считает, он железный.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
adnega
сообщение Oct 22 2015, 07:15
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Инициализирую все выводы в одном месте init_GPIO()
CODE
GPIOA->MODER = 0
| (GPIO_MODE_OUTPUT << GPIO_MODER_PIN0) // ( 6) free
| (GPIO_MODE_OUTPUT << GPIO_MODER_PIN1) // ( 7) free
| (GPIO_MODE_ALTERNATE << GPIO_MODER_PIN2) // ( 8) USART1_TX (console)
| (GPIO_MODE_ALTERNATE << GPIO_MODER_PIN3) // ( 9) USART1_RX (console)
| (GPIO_MODE_OUTPUT << GPIO_MODER_PIN4) // (10) WORKLED
| (GPIO_MODE_OUTPUT << GPIO_MODER_PIN5) // (11) free
| (GPIO_MODE_ALTERNATE << GPIO_MODER_PIN6) // (12) TIM3_CH1
| (GPIO_MODE_OUTPUT << GPIO_MODER_PIN7) // (13) free
| (GPIO_MODE_ALTERNATE << GPIO_MODER_PIN9) // (17) TIM1_CH2
| (GPIO_MODE_OUTPUT << GPIO_MODER_PIN10) // (18) free
| (GPIO_MODE_ALTERNATE << GPIO_MODER_PIN13) // (19) SWDIO (debug)
| (GPIO_MODE_ALTERNATE << GPIO_MODER_PIN14); // (20) SWCLK (debug)

GPIOA->AFR[0] = 0
| (AF_PA2_USART1_TX << GPIO_AFR0_PIN2)
| (AF_PA3_USART1_RX << GPIO_AFR0_PIN3)
| (AF_PA6_TIM3_CH1 << GPIO_AFR0_PIN6);

GPIOA->AFR[1] = 0
| (AF_PA9_TIM1_CH2 << GPIO_AFR1_PIN9)
| (AF_PA13_SWDIO << GPIO_AFR1_PIN13)
| (AF_PA14_SWCLK << GPIO_AFR1_PIN14);
Go to the top of the page
 
+Quote Post
Alechek
сообщение Oct 26 2015, 08:52
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Инициалиация в одном месте хорошо. Но иногда не прокатывает: при работе с встраиваемыми модулями (GSM и прочие) сразу инициализировать ноги нельзя, вначале надо подать на модуль питание. И, соотвественно, иницалиировать в третье состяоние при снятии питания.
Таким образом, инциализация ног происходит не разово, а постоянно в работе.
Для LPC и STM создан "drv_gpio"

Все регистры для установки ног вычиляются внутри функции IO_SetupPin(..)
С одной стороны, лишние накладные расходы, с другой - код намного читабельнее и понятнее.
Единстенное, что никак не стандартизируешь - вариант альтернативной конфиграции ноги. Тут уж придется лезть в даташит.

CODE
#ifndef __DRV_IOPORTS_H
#define __DRV_IOPORTS_H

enum __pindirection {
PIN_IN,
PIN_OUT,
PIN_ALTOUT
};

enum __pullupmode {
ppullINACTIVE = 0,
ppullDOWN,
ppullUP,
ppullREPEATER
};

enum __pinslew {
pslewENABLED = 0,
pslewDISABLED = 1
};

enum __pinmode {
pinNORMAL = 0,
pinOPENDRAIN = 1,
pinANALOG = 2,
};

enum __pinfilter {
pglfENABLED = 0,
pglfDISABLED = 1
};

enum __pinntest_res {
PIN_OK,
PIN_SHORTLOW,
PIN_SHORTHIGH
};

#define pmANALOG 0
#define pmDIGITAL 1

#define PORTA A
#define PORTB B
#define PORTC C
#define PORTD D
#define PORTE E
#define PORTF F

#define PORTABASE ((void*)&GPIOA_CRL)
#define PORTBBASE ((void*)&GPIOB_CRL)
#define PORTCBASE ((void*)&GPIOC_CRL)
#define PORTDBASE ((void*)&GPIOD_CRL)
#define PORTEBASE ((void*)&GPIOE_CRL)

#define _PORTBASE(port) ((void*)&(GPIO ## port ## _CRL))

#define _PORTSET(port) GPIO ## port ## _BSRR
#define _PORTCLR(port) GPIO ## port ## _BRR
#define _PORTPIN(port) GPIO ## port ## _IDR

#define PORTSET(port) _PORTSET(port)
#define PORTCLR(port) _PORTCLR(port)
#define PORTPIN(port) _PORTPIN(port)
#define PINSET(port, pin) _PORTSET(port) = BIT(pin)
#define PINCLR(port, pin) _PORTCLR(port) = BIT(pin)
#define PINREAD(port, pin) (!!(_PORTPIN(port) & BIT(pin)))

#define PINSETUP(port, pin, dir, pu, pm, s, f) \
IO_SetupPin(_PORTBASE(port), pin, dir, pu, pm, s, f)

#define PINMODE(port, pin, mode)

#define PINDIR(dir, port, pin) IO_PinDir(dir, port, (1UL << pin))


#ifdef __cplusplus
extern "C" {
#endif

void IO_Init(void);

void IO_SetupPin(void * portbase,
int pin,
enum __pindirection dir,
enum __pullupmode pumode,
enum __pinmode pinmode,
enum __pinslew slewrate,
enum __pinfilter filter);


enum __pinntest_res
IO_PinTest(int port, int pin);

void IO_PinDir(enum __pindirection dir, int port, unsigned long pinmask);

#ifdef __cplusplus
}
#endif


#endif //__DRV_IOPORTS_H
Go to the top of the page
 
+Quote Post
den_po
сообщение Oct 27 2015, 08:03
Сообщение #19


Частый гость
**

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



Цитата(esaulenka @ Oct 22 2015, 09:22) *
Если мне придётся снова работать с LPC'хами, буду делать библиотеку по образу и подобию.
Когда-то у меня был набор макросов (в принципе, то же самое - задавался порт, пин, режим пина), но эти хитрые шаблоны удобнее.

Года 3 назад делал библиотеку шаблонов для LPC 2119/2368/2468. Кому-то такие объявления могут показаться избыточными, но мне самому пользоваться очень нравилось.
Код
CPU::WATCHDOGTIMER<> wdt( CPU::PLL::PeriodToTicks(10), CPU::WATCHDOGTIMER<>::DEBUG );

CPU::TIMER<0> ustimer( CPU::PLL::FreqToTicks(1000000) );
CPU::CALLBACKTIMER<1, MEASURETIMERCB, IRQP_MEASURETIMER> measuretimer( CPU::PLL::FreqToTicks(FADC) );

CPU::GPIO0::PINGROUP<0,2> _uartusb_rx_tx(1);
USBQUEYECLASS usbq(115200);

CPU::GPIO0::PINGROUP<8,2> _uartrs485_rx_tx(1);
CPU::GPIO0::PIN<10> uartrs485_txen(0, CPU::GPIO0::OUTPUT);
RS485QUEYECLASS rs485q(19200, 8, RS485QUEYECLASS::EVEN, 1);

CPU::GPIO1::PIN<23> disp_d7_busy(0, CPU::GPIO1::OUTPUT);
CPU::GPIO0::PIN<13> disp_rs(0, CPU::GPIO0::OUTPUT);
CPU::GPIO0::PIN<BUTTON1PIN, CPU::GPIO0::PININVERTED> button1_pressed(0, CPU::GPIO0::INPUT);

CPU::GPIO0::PIN<17> spi_sck(2);
CPU::GPIO0::PIN<18> spi_miso(2);
CPU::GPIO0::PIN<19> spi_mosi(2);
CPU::SPI<1> spi(2000000, CPU::SPI<1>::MASTER, CPU::SPI<1>::MSB, 16);

AD7656< CPU::SPI<1>, spi, CPU::GPIO0::PIN<5>, adc_st, CPU::GPIO0::PIN<20>, adc_cs1, CPU::GPIO0::PIN<3>, adc_busy1> adc_gen_out;
AD7656< CPU::SPI<1>, spi, CPU::GPIO0::PIN<5>, adc_st, CPU::GPIO0::PIN<4>, adc_cs2, CPU::GPIO0::PIN<7>, adc_busy2> adc_gen_excitation;

Естественно, пины можно и в рантайме перенастроить.
Сейчас выкладывать библиотеку стыдновато, я уже тогда хотел всё переделать =)
Для тех камней, на которых сейчас сижу, такого не делал - у иаровского оптимизатора глюки наблюдались, а без оптимизации результат очень печальный. Но может и сделаю когда-нибудь.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 27 2015, 08:57
Сообщение #20


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Дам ссылку на уже упомянутую в этой теме мою библиотеку для stm32: stm32tpl.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 16:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016