[Solved]Опять кругами хожу. Мне нужен ModeA или ModeD. Засада была в том, что у них в корпусах с меньшим количеством ножек не все сигналы выводятся. И для режима SRAM 8 бит без мультиплексирования это младшие разряды адресной шины!
Поэтому надо использовать расширенный режим с таймингами BTR1 и BWTR1 ( bank 1 for NOR/PSRAM).
Опрелеяю структуру для работы с IO:
#define M_BASE ((uint32_t)(0x60000000))
#define MADDR ((uint32_t)((0x60000000 | 0x100)-4))
#define M_ADDR ((Modem_TypeDef *) MADDR)
Теперь можем писать:
for (i=0;i<8;i++) {
M_ADDR->data[i] = i;
}
порождаемый листинг:
80004a8: 2300 movs r3, #0
for (i=0;i<8;i++) {
M_ADDR->data[i] = i;
80004aa: 4a07 ldr r2, [pc, #28] ; (80004c8 <main+0x88>)
80004ac: b2d9 uxtb r1, r3
80004ae: 54d1 strb r1, [r2, r3]
80004b0: 3301 adds r3, #1
for (i=0;i<8;i++) {
80004b2: 2b08 cmp r3, #8
80004b4: d1f9 bne.n 80004aa <main+0x6a>
80004b6: e7ef b.n 8000498 <main+0x58>
80004c8: 600000fc .word 0x600000fc
Для работы нужно предварительно подать тактирование, инициализировать gpio и подключить их к "альтернативной функции". Уже и от библиотеки отказался во избежание неожиданностей.
void initFSMC( void)
{
FSMC_NORSRAMInitTypeDef modemInit_str;
FSMC_NORSRAMTimingInitTypeDef modemTimings;
// --- initialization FSMC ---
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOB, ENABLE); //clock for FSMC
RCC_AHB3PeriphClockCmd( RCC_AHB3Periph_FSMC, ENABLE);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource7, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource8, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource9, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource10, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource11, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource12, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource13, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource14, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource15, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource7, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_FSMC);
// configure GPIOE [4:8]
gpio.GPIO_Mode = GPIO_Mode_AF;
gpio.GPIO_OType = GPIO_OType_PP;
//gpio.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
gpio.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | \
GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
gpio.GPIO_PuPd = GPIO_PuPd_UP;
gpio.GPIO_Speed = GPIO_Speed_25MHz;
GPIO_Init( GPIOE, &gpio);
// configure GPIOD [0,1,4,5,7,14,15]
gpio.GPIO_Mode = GPIO_Mode_AF;
gpio.GPIO_OType = GPIO_OType_PP;
//gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_14 | GPIO_Pin_15;
gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_14 | GPIO_Pin_15 | \
GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
gpio.GPIO_PuPd = GPIO_PuPd_UP;
gpio.GPIO_Speed = GPIO_Speed_25MHz;
GPIO_Init( GPIOD, &gpio);
// configure GPIOB [7]
gpio.GPIO_Mode = GPIO_Mode_AF;
gpio.GPIO_OType = GPIO_OType_PP;
gpio.GPIO_Pin = GPIO_Pin_7;
gpio.GPIO_PuPd = GPIO_PuPd_UP;
gpio.GPIO_Speed = GPIO_Speed_25MHz;
GPIO_Init( GPIOB, &gpio);
// over Register
// Timings MODE A
//ACCMOD BUSTURN DATAST ADDHLD
// || |||| | | | | ADDSET
// 33 22 2222 2222 1111 111111 | | |
// 10 98 7654 3210 9876 54321098 7654 3210
// oo 00 oooo oooo 0000 00000101 oooo 0011 BTR1,BWTR=0x00000503
FSMC_Bank1E->BWTR[0]=(uint32_t) 0x0503; //WriteMode timings
FSMC_Bank1->BTCR[1]=(uint32_t) 0x0503; //ReadMode timings
// EXTMOD WREN MTYP[SRAM|PSRAM|NOR]
// | | MWID[8|16] || MUXEN
// 332222222222 1 111 1 1 1 1 1 1 || || | MBKEN
// 109876543210 9 876 5 4 3 2 1 0 9 8 7 6 54 32 1 0
// oooooooooooo.0 000.0 1 0 1.o 0 o 0.l o 00.01 0 1 BCR1=0x0000 5085
FSMC_Bank1->BTCR[0]=(uint32_t) 0x5085;
}
Не работает полностью! Как я понимаю, пин PE11 ( служит DA8) должен быть выходом при MUXEN=0x0 and MWID=0x0 (не мультиплексировать, 8 бит). Верно? но получаю такую фигню:
Блин, этот FSMC не умеет с 8 битным устройством работать? Только через битбанг?