Вот, человек пишет, что ему удалось получить прерывание при доступе к ячейке памяти: https://electronics.stackexchange.com/q ... a-debugger
Нет времени, чтобы проверить самому. Но мысль интересная.
Код: Выделить всё
#define PIN_CFG(PIN, MODE) ((uint64_t)(MODE) << ((PIN) * 4))
#define I_ANALOG (0ULL << 2)
#define I_FLOAT (1ULL << 2)
#define I_PULL (2ULL << 2)
#define O_PP (0ULL << 2)
#define O_OD (1ULL << 2)
#define O_AF (2ULL << 2)
#define O_10MHZ (1ULL)
#define O_2MHZ (2ULL)
#define O_50MHZ (3ULL)
*(uint64_t *) GPIOA = (
PIN_CFG(0, O_AF + O_OD + O_10MHZ) | /* TIM2_CH1 PWM (OUTPUT, OPEN DRAIN, MEDIUM SPEEED) */
PIN_CFG(1, I_PULL) | /* EXTI1 (INPUT, PULL-DOWN) */
PIN_CFG(2, I_PULL) | /* USART2 RX (INPUT, PULL-UP) */
PIN_CFG(3, O_AF + O_2MHZ) | /* USART2 TX (OUTPUT, PUSH-PULL, LOW SPEED) */
PIN_CFG(4, I_ANALOG) | /* - unused - */
PIN_CFG(5, I_ANALOG) | /* - unused - */
PIN_CFG(6, I_ANALOG) | /* - unused - */
PIN_CFG(7, I_ANALOG) | /* - unused - */
PIN_CFG(8, O_2MHZ) | /* GPIO (OUTPUT, PUSH-PULL, LOW SPEEED) */
PIN_CFG(9, I_ANALOG) | /* - unused - */
PIN_CFG(10, I_ANALOG) | /* - unused - */
PIN_CFG(11, I_ANALOG) | /* - unused - */
PIN_CFG(12, I_ANALOG) | /* - unused - */
PIN_CFG(13, I_PULL) | /* SWDIO (INPUT, PULL-UP) */
PIN_CFG(14, I_PULL) | /* SWCLK (INPUT, PULL-DOWN) */
PIN_CFG(15, I_ANALOG) /* - unused - */
);
Код: Выделить всё
4A0A ldr r2, =0x40010800
F64A038D movw r3, #0xA88D
4C09 ldr r4, =0x08800002
E9C23400 strd r3, r4, [r2, #0]Код: Выделить всё
GPIOA->BSRR = ( /* Configure pulled-up pins */
GPIO_BSRR_BS2 | /* Set PA2(USART2 RX) pull-up mode */
GPIO_BSRR_BS13 /* Set PA13 (SWDIO) pull-up mode */
);На F1 работает.ПростоНуб писал(а):Вот, человек пишет, что ему удалось получить прерывание при доступе к ячейке памяти
Даже с выключенной оптимизацией компилятор GCC приводит этот пример к виду:
Код: Выделить всё
4A0A ldr r2, =0x40010800 F64A038D movw r3, #0xA88D 4C09 ldr r4, =0x08800002 E9C23400 strd r3, r4, [r2, #0]
Желаю слышать критику, чем вышеозначенный подход плох, если он действительно плох.
Код: Выделить всё
-0
0x08002A0A F64A008D MOVW r0,#0xA88D
0x08002A0E 49FE LDR r1,[pc,#1016] ; @0x08002E08
0x08002A10 4AFE LDR r2,[pc,#1016] ; @0x08002E0C
0x08002A12 C203 STM r2!,{r0-r1}
-3
0x08001FC6 4AAF LDR r2,[pc,#700] ; @0x08002284
0x08001FC8 49AD LDR r1,[pc,#692] ; @0x08002280
0x08001FCA F64A008D MOVW r0,#0xA88D
0x08001FCE E9C20100 STRD r0,r1,[r2,#0]Код: Выделить всё
GPIOA->CRL = GPIO_CRL_MODE0_0 | GPIO_CRL_CNF0 | GPIO_CRL_CNF1_1 | GPIO_CRL_CNF2_1 | GPIO_CRL_MODE3_1 | GPIO_CRL_CNF3_1;
GPIOA->CRH = GPIO_CRH_MODE8_1 | GPIO_CRH_CNF13_1 | GPIO_CRH_CNF14_1;
Тут не так давно обсуждалось. Генератор LSE у STM32 рассчитан на кварцы с load capacitance (CL) <=7 пФ. Подробности в даташите на конкретный камень, в разделе External clock source characteristics, во второй половине раздела (в первой идут материалы по HSE).isx писал(а):Использую в STM32 часовой кварц.
Код: Выделить всё
GPIOA->CRL = GPIO_CRL_MODE0_0 | GPIO_CRL_CNF0 | GPIO_CRL_CNF1_1 | GPIO_CRL_CNF2_1 | GPIO_CRL_MODE3_1 | GPIO_CRL_CNF3_1;
GPIOA->CRH = GPIO_CRH_MODE8_1 | GPIO_CRH_CNF13_1 | GPIO_CRH_CNF14_1;
Код: Выделить всё
;GPIOA->CRL = GPIO_CRL_MODE0_0 | GPIO_CRL_CNF0 | GPIO_CRL_CNF1_1 | GPIO_CRL_CNF2_1 | GPIO_CRL_MODE3_1 | GPIO_CRL_CNF3_1;
4B06 ldr r3, =0x40010800
F64A028D movw r2, #0xA88D
601A str r2, [r3]
;GPIOA->CRH = GPIO_CRH_MODE8_1 | GPIO_CRH_CNF13_1 | GPIO_CRH_CNF14_1;
4B04 ldr r3, =0x40010800
4A04 ldr r2, =0x08800002
605A str r2, [r3, #4]Протрите глаза и сравните оба варианта:Через некоторое время забудете свой код и будете вспоминать как же вы там придумали конфигурировать,
Код: Выделить всё
/* 1. ================ */
GPIOA->CRL = GPIO_CRL_MODE0_0 | GPIO_CRL_CNF0 | GPIO_CRL_CNF1_1 | GPIO_CRL_CNF2_1 | GPIO_CRL_MODE3_1 | GPIO_CRL_CNF3_1;
GPIOA->CRH = GPIO_CRH_MODE8_1 | GPIO_CRH_CNF13_1 | GPIO_CRH_CNF14_1;
/* 2. ================ */
*(uint64_t *) GPIOA = (
PIN_CFG(0, O_AF + O_OD + O_10MHZ) |
PIN_CFG(1, I_PULL) |
PIN_CFG(2, I_PULL) |
PIN_CFG(3, O_AF + O_PP + O_2MHZ) |
PIN_CFG(8, O_2MHZ) |
PIN_CFG(13, I_PULL) |
PIN_CFG(14, I_PULL)
);
Постарайтесь за себя говорить, а то выглядит, будто вы сами сомневаетесь в убедительности своих доводов.и в сети вас не поймут.
Не припоминаю, чтобы спрашивал у вас, чего мне лучше поучить и почитать. Держите ваши сверхценные советы при себе. Вам нужнее.Вы лучше аппаратуру, OS, драйверы изучайте и пишите хорошо. Книжки почитайте.
Код: Выделить всё
4A0A ldr r2, =0x40010800
F64A038D movw r3, #0xA88D
4C09 ldr r4, =0x08800002
E9C23400 strd r3, r4, [r2, #0]Код: Выделить всё
GPIOA->CRL =
PIN_CFG(0, O_AF + O_OD + O_10MHZ) | /* TIM2_CH1 PWM (OUTPUT, OPEN DRAIN, MEDIUM SPEEED) */
PIN_CFG(1, I_PULL) | /* EXTI1 (INPUT, PULL-DOWN) */
PIN_CFG(2, I_PULL) | /* USART2 RX (INPUT, PULL-UP) */
PIN_CFG(3, O_AF + O_2MHZ) | /* USART2 TX (OUTPUT, PUSH-PULL, LOW SPEED) */
PIN_CFG(4, I_ANALOG) | /* - unused - */
PIN_CFG(5, I_ANALOG) | /* - unused - */
PIN_CFG(6, I_ANALOG) | /* - unused - */
PIN_CFG(7, I_ANALOG) ; /* - unused - */
GPIOA->CRH =
PIN_CFG(0, O_2MHZ) | /* GPIO (OUTPUT, PUSH-PULL, LOW SPEEED) */
PIN_CFG(1, I_ANALOG) | /* - unused - */
PIN_CFG(2, I_ANALOG) | /* - unused - */
PIN_CFG(3, I_ANALOG) | /* - unused - */
PIN_CFG(4, I_ANALOG) | /* - unused - */
PIN_CFG(5, I_PULL) | /* SWDIO (INPUT, PULL-UP) */
PIN_CFG(6, I_PULL) | /* SWCLK (INPUT, PULL-DOWN) */
PIN_CFG(7, I_ANALOG) ; /* - unused - */
Код: Выделить всё
LDR.N R0,??PinCfg1_0 ;; 0x40010800
LDR.N R2,??PinCfg1_0+0x4 ;; 0x8800002
MOVW R1,#+43149
STR R1,[R0, #+0]
STR R2,[R0, #+4]
Код: Выделить всё
/*-- FSMC Configuration ------------------------------------------------------*/
p.FSMC_AddressSetupTime = 3;
p.FSMC_AddressHoldTime = 2;
p.FSMC_DataSetupTime = 3;
p.FSMC_BusTurnAroundDuration = 1;
p.FSMC_CLKDivision = 1;
p.FSMC_DataLatency = 0;
p.FSMC_AccessMode = FSMC_AccessMode_A;
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; //8-bit Wiznet DATA line
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
/*!< Enable FSMC Bank1_SRAM Bank */
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
Код: Выделить всё
#define SHAR_M (0x60000008)
*(uint16_t *)SHAR_M = 0xFFFF;
Я бы на вашем месте не слишком доверял подобным нелокализуемым "подсказкам". У кортекса-м3 обе названных команды 32-битные, где первая выполняется 2 цикла, а вторая 3.Размер кода такой же (команда STR 16-битная, а STRD 32-битная). Скорость исполнения по тактам посчитать (с учётом работы конвейера и разных шин) не берусь, но что-то мне подсказывает...Код: Выделить всё
LDR.N R0,??PinCfg1_0 ;; 0x40010800 LDR.N R2,??PinCfg1_0+0x4 ;; 0x8800002 MOVW R1,#+43149 STR R1,[R0, #+0] STR R2,[R0, #+4]
Код: Выделить всё
void main(void) {
RCC->APB1ENR = RCC_APB1ENR_TIM2EN;
RCC->APB2ENR = RCC_APB2ENR_IOPCEN;
TIM2->ARR = GPIO_ODR_ODR13 * 2;
TIM2->PSC = SystemCoreClock / (GPIO_ODR_ODR13 * 2) - 1;
TIM2->CR1 = TIM_CR1_CEN;
GPIOC->CRH = GPIO_CRH_MODE13_0;
for(__O int *i = &GPIOC->ODR;; *i = TIM2->CNT & GPIO_ODR_ODR13);
}