А ещё одна страшная тайна- это MAX13487...
Добавлено after 1 minute 40 seconds:
Не вижу твоих обработчиков прерываний. По-идее, в каждом из них должно запрещаться прерывание от другого.
Код: Выделить всё
void USART1_IRQHandler(void) {
if (SymbolCount == 0) {
TIM4->CNT = 0;
TIM4->CR1 |= TIM_CR1_CEN;
}
ReceivedText[SymbolCount++] = USART1->DR;
}
void TIM4_IRQHandler(void) {
TIM4->SR &=~ TIM_SR_UIF;
TIM4->CR1 &=~ TIM_CR1_CEN;
USART_SendStr("Time out!");
SymbolCount = 0;
}Код: Выделить всё
void USART1_IRQHandler(void) {
uint32_t i = 0;
USART1->SR &=~ USART_SR_RXNE; // Clear USART1 RXNE Interrupt flag
GPIOC->ODR |= GPIO_ODR_ODR12; // Enable LED
for (i = 0; i < 65535; i++); // Delay
GPIOC->ODR &=~ GPIO_ODR_ODR12; // Disable LED
for (i = 0; i < 65535; i++); // Delay
}Код: Выделить всё
void PendSV_Handler(void) {
profiler();
}
void profiler(void) {
...
SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk; // перезапуск, чтобы начать двигаться сразу
...
}Код: Выделить всё
// IRQ priorities:
#define SysTick_IRQ_Priority 2
#define I2C_IRQ_PRI 2
#define TIMER0_IRQ_PRI 3
#define TIMER1_IRQ_PRI 3
#define USART0_IRQ_PRI 4
#define USART3_TX_IRQ_PRI 4
#define LDMA_IRQ_PRI 5
#define ADC0_IRQ_Priority 5
#define LETIMER0_IRQ_Priority 5
#define PendSV_IRQ_priority 7
Код: Выделить всё
section size addr
.text 72968 0
.ARM.exidx 8 72968
.stack 8192 536870912
.data 1856 536879104
.bss 173420 536880960
.heap 13136 537054384Это влияет только на предупреждение при компиляции. Физически во время работы МК размер стека не контролируется. Можно посмотреть только в аналитике (Static Stack Analyzer) величину максимального потребления стека функциями. В ОЗУ вот так всё это укладывается:Я увеличил размер стека с 4096 до 8192 байт
Нет, то же самое прерывание имеет тот же самый приоритет и вытеснить само себя не может. Поэтому, флаг запроса будет выставлен, но как только произойдет выход из текущего прерывания, МК снова войдет в это прерывание с его начала. Более подробно о работе прерываний прочтите в Programming Manual.Может ли быть так, что оно вызовется снова не завершив текущее. А как он знает, что текущее завершилось?
Код: Выделить всё
void USART1_IRQHandler(void) {
uint32_t i = 0;
NVIC->ICER[1] |= 0x20 ; // Disable USART1 interrupt.
USART1->SR = 0 ;
GPIOC->ODR |= GPIO_ODR_ODR12 ; // Enable LED.
for (i = 0; i < 65535; i++) ; // Delay
GPIOC->ODR &=~ GPIO_ODR_ODR12 ; // Disable LED.
for (i = 0; i < 65535; i++) ; // Delay
NVIC->ISER[1] |= 0x20 ; // Enable USART1 interrupt.
}Код: Выделить всё
void USART1_IRQHandler(void) {
if ((((USART1->SR & USART_SR_RXNE) >> USART_SR_RXNE_Pos) == 1) & (((USART1->SR & USART_SR_ORE) >> USART_SR_ORE_Pos) != 1)) {
ReceivedText[SymbolCount++] = USART1->DR;
} else {
(void)USART1->DR;
(void)USART1->SR;
}Код: Выделить всё
void USART1_IRQHandler(void) {
uint8_t i = 0;
if ((((USART1->SR & USART_SR_RXNE) >> USART_SR_RXNE_Pos) == 1) & (((USART1->SR & USART_SR_ORE) >> USART_SR_ORE_Pos) != 1) & (((USART1->SR & USART_SR_IDLE) >> USART_SR_IDLE_Pos) != 1)) {
ReceivedText[SymbolCount++] = USART1->DR;
(void)USART1->SR;
} else {
if (((USART1->SR & USART_SR_ORE) >> USART_SR_ORE_Pos) == 1) {
USART_SendStr("Overrun!");
(void)USART1->DR;
(void)USART1->SR;
memset(ReceivedText, 0, sizeof ReceivedText);
SymbolCount = 0;
}
if (((USART1->SR & USART_SR_IDLE) >> USART_SR_IDLE_Pos) == 1) {
if (SymbolCount != 10) {
USART_SendStr("Time out!");
memset(ReceivedText, 0, sizeof ReceivedText);
SymbolCount = 0;
(void)USART1->DR;
(void)USART1->SR;
} else {
SymbolCount = 0;
for (i = 0; i < 11; i++) {
ReceivedCommand[i] = ReceivedText[i];
}
ReceivedCommand[11] = 0;
(void)USART1->DR;
(void)USART1->SR;
}
}
}
}Код: Выделить всё
if ((((USART1->SR & USART_SR_RXNE) >> USART_SR_RXNE_Pos) == 1) & (((USART1->SR & USART_SR_ORE) >> USART_SR_ORE_Pos) != 1) & (((USART1->SR & USART_SR_IDLE) >> USART_SR_IDLE_Pos) != 1))Но, как ни странно, работать будет. Потому что остальные условия тоже по-дурацки написаны и выставляют только младший бит.Код получился %цензор%. Ну что это? Что ещё ща "&"?
Код: Выделить всё
(USART1->SR & USART_SR_RXNE)Где ж вы раньше были? Сейчас-то, когда ТС сам нашел упоминание этого бита (который он вообще не трогал!), легко тыкать в документацию.Даташиты то когда будем читать?
Код: Выделить всё
if (((USART1->SR & USART_SR_ORE) >> USART_SR_ORE_Pos) == 1)Код: Выделить всё
if (USART1->SR & USART_SR_ORE)Код: Выделить всё
void foo1()
{
if (((USART1->ISR & USART_ISR_ORE) >> USART_ISR_ORE_Pos) == 1)
__NOP();
}
void foo2()
{
if (USART1->ISR & USART_ISR_ORE)
__NOP();
}
_Z4foo1v:
LDR.N R0,??DataTable2_2
LDR R1,[R0, #+0]
UBFX R0,R1,#+3,#+1
CBZ.N R0,??foo1_0
Nop
??foo1_0:
BX LR
_Z4foo2v:
LDR.N R0,??DataTable2_2
LDR R1,[R0, #+0]
LSLS R2,R1,#+28
IT MI
NopMI
BX LR
Где ж вы раньше были? Сейчас-то, когда ТС сам нашел упоминание этого бита (который он вообще не трогал!), легко тыкать в документацию.[/uquote]Я где раньше был? Я уже давно скелет прерывания показал. В нём ORE автоматом скидывается. Да и откуда ему возникнуть, если прерывание короткое как полёт пули. Разве что приоритет задушить и сидеть в каком-нибудь другом прерывании. Ну так это ССЗБ.Даташиты то когда будем читать?
Код: Выделить всё
if (((USART1->SR & USART_SR_ORE) >> USART_SR_ORE_Pos) == 1)Код: Выделить всё
if (USART1->SR & USART_SR_ORE)Код: Выделить всё
void foo1()
{
if (((USART1->ISR & USART_ISR_ORE) >> USART_ISR_ORE_Pos) == 1)
__NOP();
}
void foo2()
{
if (USART1->ISR & USART_ISR_ORE)
__NOP();
}
_Z4foo1v:
LDR.N R0,??DataTable2_2
LDR R1,[R0, #+0]
UBFX R0,R1,#+3,#+1
CBZ.N R0,??foo1_0
Nop
??foo1_0:
BX LR
_Z4foo2v:
LDR.N R0,??DataTable2_2
LDR R1,[R0, #+0]
LSLS R2,R1,#+28
IT MI
NopMI
BX LR
Где ж вы раньше были? Сейчас-то, когда ТС сам нашел упоминание этого бита (который он вообще не трогал!), легко тыкать в документацию.[/uquote]Я где раньше был? Я уже давно скелет прерывания показал. В нём ORE автоматом скидывается. Да и откуда ему возникнуть, если прерывание короткое как полёт пули. Разве что приоритет задушить и сидеть в каком-нибудь другом прерывании. Ну так это ССЗБ.[/uquote]Даташиты то когда будем читать?