Правильно думаетеVladislavS писал(а):или будет неэффективная команда записи в память? Я думаю второе.
Спойлер
На 64 бита, с возможностью выбора 8-16-32-64, в любой последовательности пинов.Не знаю поддерживает ли GCC uint128_t?
Код: Выделить всё
#define k_bit uint64_t//64бита uint32_t-32бита uint16_t-16бита uint8_t-8бита
typedef struct{
volatile uint32_t * port;
k_bit or;
} port_pin;
#define PORTA (GPIOA->ODR)
#define PORTB (GPIOB->ODR)
#define PORTC (GPIOC->ODR)
#define pn(p,b) {&PORT ## p, (1<<b)}
const port_pin pins[] = {
pn(A,3),
pn(A,5),
pn(A,4),
pn(A,1),
pn(A,2),
pn(A,0),
pn(A,7),
pn(A,8),
pn(A,12),
pn(A,13),
pn(A,14),
pn(A,15),
pn(C,4),
pn(C,6),
pn(C,3),
pn(C,5),
pn(C,2),
pn(C,7),
pn(C,8),
pn(C,12),
pn(C,13),
pn(C,14),
pn(B,3),
pn(B,5),
pn(B,4),
pn(B,6),
pn(B,1),
pn(B,2),
pn(B,7),
pn(B,0),
pn(B,8),
pn(B,9),
pn(B,12),
pn(B,13),
pn(B,14)
};
const port_pin pin_ns[] = {
pn(C,1)
};
void port_write (volatile const port_pin *p, uint8_t a, k_bit data)
{ k_bit s=1;
for(uint8_t i=0; i<a; i++, s<<=1){
if (data & s)
*p->port |= p->or;
else
*p->port &= ~(p->or);
p++;
}
}
int main(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN;
GPIOA->CRL &= ~GPIO_CRL_CNF;
GPIOA->CRL |= GPIO_CRL_MODE;
GPIOA->CRH &= ~GPIO_CRH_CNF;
GPIOA->CRH |= GPIO_CRH_MODE;
GPIOB->CRL &= ~GPIO_CRL_CNF;
GPIOB->CRL |= GPIO_CRL_MODE;
GPIOB->CRH &= ~GPIO_CRH_CNF;
GPIOB->CRH |= GPIO_CRH_MODE;
GPIOC->CRL &= ~GPIO_CRL_CNF;
GPIOC->CRL |= GPIO_CRL_MODE;
GPIOC->CRH &= ~GPIO_CRH_CNF;
GPIOC->CRH |= GPIO_CRH_MODE;
port_write (pins, sizeof(pins)/sizeof(port_pin), 0b00100001001001000001000010000100100);
port_write (pins, sizeof(pins)/sizeof(port_pin), 0b00100101101001001000001010010100100);
port_write (pins, sizeof(pins)/sizeof(port_pin), 0);
port_write (pin_ns, sizeof(pin_ns)/sizeof(port_pin), 1);
port_write (pin_ns, sizeof(pin_ns)/sizeof(port_pin), 0);
while(1)
{
}
}
Честно говоря, до последнего не думал что будет работать.
Пусть это и далеко не эффективный код, но он работает, и прекрасно работает.
На F103
Код: Выделить всё
Program Size:
text data bss dec hex filename
1456 0 1024 2480 9b0 port_103.elf

