Извиняюсь за отсутствие, просто думал довести до конца , потом отписать, вообщем так, свел до минимума потери пакетов, около 3% пропадает(длоя верности пробовал подключать как через VCP внешний, СР или ФТДАЙ,так и через реальный КОМ), для этого УАРТ настраиваю на 9600,
проц на 56MHz, чтоб кушал поменьше,
в посылке делаю 2 байта 0xFF. Но эти 3 процента не дают покоя... логику всю уже перемурыжил, все отправки сделал в main(), теперь логика такая, есть 3 прерывания :
А) Прерывание от акс-ра (внешнее)
Б) От УАРТ1 по RX
В) От PB.7 (внешнее).
Одновременно работают А+Б или А+В. Посылки от МК наверх идут в main (по взведенному флагу), прерывание Б и В приоритетом максимальным идут, это тоже проверял на всякий случай, сделал while(true){} в пр-ии от акс-ра, все работает по УАРТ. Смысл таков, сидим в СТОП режиме, прерываем сон по внешним прерываниям, перед входом в сон иниц-ем ногу RX, как внешнее прерывание, как только срабатывает прерывание (любое внешнее), то инициализируем RX как ногу УАРТ, на всяк случай вхожу в сон только после принятия посылки до конца, или при неправильном пакете, для этого сделал флаг дополнительный. Ниже кусочки кода , на мой взгляд самые показательные по проблеме:
//ф-ия настроек системных, шин и т.д. после СТОП, стандартная из файла system_stm32f4xx.c
void SystemInit(void)
{
/* Reset the RCC clock configuration to the default reset state ------------*/
/* Set HSION bit */
RCC->CR |= (uint32_t)0x00000001;
/* Reset CFGR register */
RCC->CFGR = 0x00000000;
/* Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;
/* Reset PLLCFGR register */
RCC->PLLCFGR = 0x24003010;
/* Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF;
/* Disable all interrupts */
RCC->CIR = 0x00000000;
#ifdef DATA_IN_ExtSRAM
SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM */
/* Configure the System clock source, PLL Multiplier and Divider factors,
AHB/APBx prescalers and Flash settings ----------------------------------*/
SetSysClock();
/* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif
}
//прерывание от от акселерометра
void TApplication::HardwareINT2(void)
{
int p ;
static int16_t buf[96] = {0};
Acc->ReadXYZ((uint8_t*)buf,192);
if((*getAcc()) == 1){ //если включен датчик
if( (ms == 1) && (sleep == false)){
SystemInit(); // после режима СТОП попадаем сюда!
// delay_ms(100);
GetGpio()->EXTI7_RX_UART1_Disable(); //инициализация ноги как RX
;
}
....
}
//прерывание от внешнего воздействия EXTI7
void EXTI9_5_IRQHandler (void)
{
irq_count ++;
if(irq_count>1){
SystemInit();
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq(&RCC_Clocks);
App.GetGpio()->EXTI7_RX_UART1_Disable();//инициализация ноги как RX
uint16_t sr = USART1->SR;
uint16_t reset =USART_IT_PE | USART_IT_TXE | USART_IT_TC | USART_IT_RXNE | USART_IT_ORE_RX | USART_IT_IDLE | USART_IT_LBD | USART_IT_CTS | USART_IT_ERR | USART_IT_ORE_ER | USART_IT_NE | USART_IT_FE ;
USART_ClearITPendingBit(USART1, reset);
sr = USART1->SR;
// uint8_t data = App.GetUsart()->U1ReadByte();
sr = USART1->SR;
irq_count = 0;
}
EXTI_ClearITPendingBit(EXTI_Line7);
};
//2 функции инициализации ноги, как внешнее прерывание и как RX
void TGpio::EXTI7_RX_UART1_Config(void) // PB.7
{
USART_InitTypeDef USART_InitStructure;
NVIC_DisableIRQ(USART1_IRQn);
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
/* USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);*/
// RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE);
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable GPIOA clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
/* Configure Pb7 pin as input floating */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType =GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Enable SYSCFG clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
/* Configure EXTI1 line */
EXTI_InitStructure.EXTI_Line = EXTI_Line7;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/* Enable and set EXTI0 Interrupt to the lowest priority */
/* NVIC_InitStructure.NVIC_IRQChannel = EXTI7_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;*/
//NVIC_Init(&NVIC_InitStructure);
//////////////////////////////////////
EXTI_ClearITPendingBit(EXTI_Line7);
//////////////////////////////////////
/* Connect EXTI1 Line to PD1 pin */
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource7);
NVIC_SetPriority (EXTI9_5_IRQn,UART3_PRIORITY); //Задаем приоритет
NVIC_EnableIRQ(EXTI9_5_IRQn); //Разрешим 7 линию внешних пр-й
}
void TGpio::EXTI7_RX_UART1_Disable(void){ // PB.7
NVIC_DisableIRQ(EXTI9_5_IRQn); //Запрет 7 линию внешних пр-й
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line7;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = DISABLE;
EXTI_Init(&EXTI_InitStructure);
/* Configure USART Tx as alternate function */
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = USART1_BR;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
NVIC_EnableIRQ(USART1_IRQn);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_Cmd(USART1,ENABLE);
}
//В маин вход в СТОП
if(ms == 1)
if(sleep == true){
// ms = 0;
uint8_t byte;
sleep = false;
DeinitSystem();
EXTI_ClearITPendingBit(EXTI_Line7);
//USART_Cmd(USART1, DISABLE);
GetGpio()->EXTI7_RX_UART1_Config();
irq_count = 0;
EXTI_ClearITPendingBit(EXTI_Line7);
Stop();//Sleep();//Stop();
SystemInit();
}
}
Не знаю в чем может быть еще проблема, но все же настораживают 2 момента:
1) После инициализации ноги PB.7 как внешнее прерывание, дебагер сразу идет туда! Как ни настраивал подтяжку ноги, и сколь угодно долго не сбрасывал бит прерывания внешнего! Для этого в прерывании считаю до одного, потом только обрабатываю все...
2)Иногда смотрю разбор посылки приходящей, ее структура такова( старт байт 0x55,длина N(например 1),команда(например 0x70), Data(N-1),стоп байт 0x45)
Отрабатывает 1 байт-страртовый, а затем, не понятно совершенно почему, идет сразу команда, заместо длины!!!, т.е. ловим 0x55, а затем 0x70 сразу...
Может будут какие мысли у кого, а то дырка в мониторе делается!