Цитата(scifi @ Jun 23 2016, 12:13)

Кстати, сишный код неоптимальный. К примеру, вместо
GPIOA->ODR = (GPIOA->ODR & ~0xFF) | data;
лучше написать
GPIOA->BSRR = 0x00FF0000 | data;
Ну и ещё что-то там наверняка есть.
Да, этот момент я упустил. Сомневался нормально ли отработает установка/сброс одних и тех же битов. Перечитал мануал и переделал:
CODE
68: {
0x08000240 B410 PUSH {r4}
69: uint_fast16_t db = GPIOC->IDR & 0x1FFF;
70: uint_fast8_t data/* = db & 0xFF*/;
71:
0x08000242 481A LDR r0,[pc,#104] ; @0x080002AC
0x08000244 8A00 LDRH r0,[r0,#0x10]
72: GPIOB->BSRR = GPIO_BSRR_BS_12;
73:
0x08000246 4A1A LDR r2,[pc,#104] ; @0x080002B0
0x08000248 04C1 LSLS r1,r0,#19
0x0800024A 0CC9 LSRS r1,r1,#19
0x0800024C 2001 MOVS r0,#0x01
0x0800024E 0300 LSLS r0,r0,#12
0x08000250 6190 STR r0,[r2,#0x18]
74: data = db & 0xFF;
75:
0x08000252 B2C8 UXTB r0,r1
76: if (!(db & (0x01 << 12))) {
0x08000254 04CB LSLS r3,r1,#19
68: {
69: uint_fast16_t db = GPIOC->IDR & 0x1FFF;
70: uint_fast8_t data/* = db & 0xFF*/;
71:
72: GPIOB->BSRR = GPIO_BSRR_BS_12;
73:
74: data = db & 0xFF;
75:
76: if (!(db & (0x01 << 12))) {
0x08000256 D423 BMI 0x080002A0
77: switch (db & (0x03 << 9)) {
78: case 0x0000:
0x08000258 2303 MOVS r3,#0x03
0x0800025A 025B LSLS r3,r3,#9
0x0800025C 4019 ANDS r1,r1,r3
79: GPIOA->BSRR = (0xFF << 16) | data;
0x0800025E 4B15 LDR r3,[pc,#84] ; @0x080002B4
0x08000260 D008 BEQ 0x08000274
0x08000262 39FF SUBS r1,r1,#0xFF
0x08000264 39FF SUBS r1,r1,#0xFF
0x08000266 1E89 SUBS r1,r1,#2
0x08000268 D009 BEQ 0x0800027E
0x0800026A 39FF SUBS r1,r1,#0xFF
0x0800026C 39FF SUBS r1,r1,#0xFF
0x0800026E 2902 CMP r1,#0x02
0x08000270 D116 BNE 0x080002A0
0x08000272 E00A B 0x0800028A
0x08000274 21FF MOVS r1,#0xFF
0x08000276 0409 LSLS r1,r1,#16
0x08000278 4308 ORRS r0,r0,r1
0x0800027A 6198 STR r0,[r3,#0x18]
80: break;
81: case 0x0200:
0x0800027C E010 B 0x080002A0
82: GPIOB->BSRR = (0x03 << 21) | (data & (0x03 << 5));
0x0800027E 2160 MOVS r1,#0x60
0x08000280 4008 ANDS r0,r0,r1
0x08000282 0409 LSLS r1,r1,#16
0x08000284 1840 ADDS r0,r0,r1
0x08000286 6190 STR r0,[r2,#0x18]
83: break;
84: case 0x0400:
0x08000288 E00A B 0x080002A0
85: GPIOA->BSRR = (0x0F << 24) | ((uint16_t)HINIBBLE(data) << 8);
0x0800028A 0301 LSLS r1,r0,#12
0x0800028C 0C09 LSRS r1,r1,#16
0x0800028E 020C LSLS r4,r1,#8
0x08000290 210F MOVS r1,#0x0F
0x08000292 0609 LSLS r1,r1,#24
0x08000294 1864 ADDS r4,r4,r1
0x08000296 619C STR r4,[r3,#0x18]
86: GPIOB->BSRR = (0x0F << 24) | ((uint16_t)LONIBBLE(data) << 8);
87: break;
88: }
89: }
0x08000298 0700 LSLS r0,r0,#28
0x0800029A 0D00 LSRS r0,r0,#20
0x0800029C 1840 ADDS r0,r0,r1
0x0800029E 6190 STR r0,[r2,#0x18]
90: EXTI->PR = EXTI_PR_PR8;
0x080002A0 20FF MOVS r0,#0xFF
0x080002A2 4905 LDR r1,[pc,#20] ; @0x080002B8
0x080002A4 3001 ADDS r0,r0,#0x01
0x080002A6 6148 STR r0,[r1,#0x14]
91: }
0x080002A8 BC10 POP {r4}
0x080002AA 4770 BX lr
0x080002AC 0800 DCW 0x0800
0x080002AE 4800 DCW 0x4800
0x080002B0 0400 DCW 0x0400
0x080002B2 4800 DCW 0x4800
0x080002B4 0000 DCW 0x0000
0x080002B6 4800 DCW 0x4800
0x080002B8 0400 DCW 0x0400
0x080002BA 4001 DCW 0x4001
Цитата(Forger @ Jun 23 2016, 12:26)

Лишних команд не бывает, а бывают деньги, заплаченные закачиком на разработку впустую
Заказчику как правило совершенно до лампочки как внутри реализована задача
Заказчику действительно все равно как будет реализована задача, но в данном конкретном случае требование заказчика состоит в реализации задачи на имеющейся аппаратной базе, а дальше крутись как хочешь.
Цитата(Forger @ Jun 23 2016, 12:26)

Сколько всего прерываний в коде?
В данный момент в коде включена обработка только ОДНОГО прерывания.