В си-коде, для проверки состояния порта используется вставка на ассемблере, приведенная ниже.
Но где-то что-то идет не так задумано, и в буфере, что передается в функцию по ссылке, ничего кроме нулей не обнаруживается.
Возможно, я что-то недопонимаю и делаю не так, как надо.
Хотелось бы услышать идеи, с помощью которых можно было бы починить код...
CODE
void f(unsigned int* peg)
{
__ASM volatile
(
".equ PERIPH_BASE, 0x40000000 \n \t"
".equ AHB1PERIPH_BASE, 0x00020000 \n \t"
".equ GPIOD_BASE, 0x0C00 \n \t"
".equ GPIOB_BASE, 0x0400 \n \t"
".equ GPIO_IDR, 0x10 \n \t"
".equ GPIO_BSRRL, 0x18 \n \t"
".equ GPIO_BSRRH, 0x1A \n \t"
".equ GPIO_BSRR_BS_5, 0x20 \n \t"
"LDR r0, =(GPIO_BSRR_BS_5) \n \t"
"LDR r1, =(PERIPH_BASE + AHB1PERIPH_BASE + GPIOB_BASE + GPIO_BSRRH) \n\t"
"LDR r2, =(PERIPH_BASE + AHB1PERIPH_BASE + GPIOB_BASE + GPIO_BSRRL) \n\t"
"LDR r3, =(PERIPH_BASE + AHB1PERIPH_BASE + GPIOD_BASE + GPIO_IDR) \n\t"
"LDR r4, [%[data_ptr], 0x00] \n \t"
//0
"STRH r0, [r2, 0x00] \n \t" // set clock
"LDR r5, [r3, 0x00] \n \t" // считываем GPIOD->IDR
"STRH r0, [r1, 0x00] \n \t" // reset clock
"STR r5, [r4, 0] \n \t" // записываем то, что было в GPIOD->IDR, в память со смещением
//1
"STRH r0, [r2, 0x00] \n \t"
"LDR r5, [r3, 0x00] \n \t"
"STRH r0, [r1, 0x00] \n \t"
"STR r5, [r4, 4] \n \t"
//2
"STRH r0, [r2, 0x00] \n \t"
"LDR r5, [r3, 0x00] \n \t"
"STRH r0, [r1, 0x00] \n \t"
"STR r5, [r4, 8] \n \t"
/* Множество раз повторяется. */
//681
"STRH r0, [r2, 0x00] \n \t"
"LDR r5, [r3, 0x00] \n \t"
"STRH r0, [r1, 0x00] \n \t"
"STR r5, [r4, #2724] \n \t"
:
: [data_ptr] "r" (peg)
:
);
}