ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
3 июля
561959 Топик полностью
BaRaGoZ (24.11.2014 19:57, просмотров: 117) ответил il-2 на Концепция правильная, проблемы с реализацией. Еще момент - принимаемый код 0xFC. Если вспомнить что прием идет младшими битами вперед, то подобные "монолитные" коды обычно наблюдаются при скорости UART > скорости данных. Такое ощущение, что вы
Извиняюсь за отсутствие, просто думал довести до конца , потом отписать, вообщем так, свел до минимума потери пакетов, около 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); };

//прерывание от УАРТ1

void USART1_IRQHandler() { // Обработка события RXNE (приёма) sr = USART1->SR; if ( USART_GetITStatus(USART1, USART_IT_RXNE) ) { // App.GetGpio()->PinOffPC(GPIO_Pin_6); // очистка бита прерывания USART_ClearITPendingBit(USART1, USART_IT_RXNE); //Сюда пишется, что должно произойти приёме одного байта uint16_t sr = USART1->SR; App.GetUsart()->Usart1IRQ_Handler(); }; // Обработка события TXE if ( USART_GetITStatus(USART1, USART_IT_TXE) ) { // очистка бита прерывания USART_ClearITPendingBit(USART1, USART_IT_TXE); //Сюда пишется, что должно произойти после передачи байта. }; 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; //uint16_t dr = USART1->DR; }
//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 сразу... Может будут какие мысли у кого, а то дырка в мониторе делается!