jcxz 243 16 августа Опубликовано 16 августа · Жалоба 1 час назад, koluna сказал: Вот вырезка из даташита: В этой вырезке просто говорится, что для сброса флагов ошибки нужно выполнить только чтение DR. И больше ничего. Естественно - после того как вы прочитали статус и узнали, что RXNE есть. Потому как если RXNE нет - DR читать нельзя! Никаких дополнительных действий для сброса флагов не нужно. 1 час назад, koluna сказал: Что произойдет, если прочитать регистр данных без установленного RXNE? А сами разве не догадываетесь? Вроде как это очевидно. В этом случае - как вы определите, что именно считали? Какой-то мусор (от предыдущего приёма) или новый байт? И что после такого будет в регистре SR? Уже флаги для нового байта или от старого? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firstvald 24 21 августа Опубликовано 21 августа · Жалоба Продолжаем разговор. Опять всплыла бяка с hard fault. Происходит следущее. При обращении к порту на скорости через две на третью (работаем на 4800 обратились на 38400 и выше или работаем на 19200 обратились на 115200) от той на которую он настроен или при шуме в линии происходит сваливание в hard fault. //ôóíêöèÿ ðàáîòàþùàÿ â ïðåðûâàíè îò ïîñëåäîâàòåëüíîãî ïîðòà void modbus_usart_5(void) { static unsigned char rx_flag=0; static unsigned char tx_flag=0; // static short unsigned int rx_reg; static long unsigned int usart_sr_my=0; static long unsigned int usart_rdr_my=0; rx_flag=0; tx_flag=0; /******************* Bit definition for USART_ISR register ******************/ // USART_ISR_PE_Pos (0U) // USART_ISR_PE_Msk (0x1UL << USART_ISR_PE_Pos) /*!< 0x00000001 */ // USART_ISR_PE USART_ISR_PE_Msk /*!< Parity Error */ // USART_ISR_FE_Pos (1U) // USART_ISR_FE_Msk (0x1UL << USART_ISR_FE_Pos) /*!< 0x00000002 */ // USART_ISR_FE USART_ISR_FE_Msk /*!< Framing Error */ // USART_ISR_NE_Pos (2U) // USART_ISR_NE_Msk (0x1UL << USART_ISR_NE_Pos) /*!< 0x00000004 */ // USART_ISR_NE USART_ISR_NE_Msk /*!< Noise Error detected Flag */ // USART_ISR_ORE_Pos (3U) // USART_ISR_ORE_Msk (0x1UL << USART_ISR_ORE_Pos) /*!< 0x00000008 */ // USART_ISR_ORE USART_ISR_ORE_Msk /*!< OverRun Error */ // USART_ISR_IDLE_Pos (4U) // USART_ISR_IDLE_Msk (0x1UL << USART_ISR_IDLE_Pos) /*!< 0x00000010 */ // USART_ISR_IDLE USART_ISR_IDLE_Msk /*!< IDLE line detected */ // USART_ISR_RXNE_Pos (5U) // USART_ISR_RXNE_Msk (0x1UL << USART_ISR_RXNE_Pos) /*!< 0x00000020 */ // USART_ISR_RXNE USART_ISR_RXNE_Msk /*!< Read Data Register Not Empty */ // USART_ISR_TC_Pos (6U) // USART_ISR_TC_Msk (0x1UL << USART_ISR_TC_Pos) /*!< 0x00000040 */ // USART_ISR_TC USART_ISR_TC_Msk /*!< Transmission Complete */ // USART_ISR_TXE_Pos (7U) // USART_ISR_TXE_Msk (0x1UL << USART_ISR_TXE_Pos) /*!< 0x00000080 */ // USART_ISR_TXE USART_ISR_TXE_Msk /*!< Transmit Data Register Empty */ // USART_ISR_LBDF_Pos (8U) // USART_ISR_LBDF_Msk (0x1UL << USART_ISR_LBDF_Pos) /*!< 0x00000100 */ // USART_ISR_LBDF USART_ISR_LBDF_Msk /*!< LIN Break Detection Flag */ // USART_ISR_CTSIF_Pos (9U) // USART_ISR_CTSIF_Msk (0x1UL << USART_ISR_CTSIF_Pos) /*!< 0x00000200 */ // USART_ISR_CTSIF USART_ISR_CTSIF_Msk /*!< CTS interrupt flag */ // USART_ISR_CTS_Pos (10U) // USART_ISR_CTS_Msk (0x1UL << USART_ISR_CTS_Pos) /*!< 0x00000400 */ // USART_ISR_CTS USART_ISR_CTS_Msk /*!< CTS flag */ // USART_ISR_RTOF_Pos (11U) // USART_ISR_RTOF_Msk (0x1UL << USART_ISR_RTOF_Pos) /*!< 0x00000800 */ // USART_ISR_RTOF USART_ISR_RTOF_Msk /*!< Receiver Time Out */ // USART_ISR_EOBF_Pos (12U) // USART_ISR_EOBF_Msk (0x1UL << USART_ISR_EOBF_Pos) /*!< 0x00001000 */ // USART_ISR_EOBF USART_ISR_EOBF_Msk /*!< End Of Block Flag */ // USART_ISR_ABRE_Pos (14U) // USART_ISR_ABRE_Msk (0x1UL << USART_ISR_ABRE_Pos) /*!< 0x00004000 */ // USART_ISR_ABRE USART_ISR_ABRE_Msk /*!< Auto-Baud Rate Error */ // USART_ISR_ABRF_Pos (15U) // USART_ISR_ABRF_Msk (0x1UL << USART_ISR_ABRF_Pos) /*!< 0x00008000 */ // USART_ISR_ABRF USART_ISR_ABRF_Msk /*!< Auto-Baud Rate Flag */ // USART_ISR_BUSY_Pos (16U) // USART_ISR_BUSY_Msk (0x1UL << USART_ISR_BUSY_Pos) /*!< 0x00010000 */ // USART_ISR_BUSY USART_ISR_BUSY_Msk /*!< Busy Flag */ // USART_ISR_CMF_Pos (17U) // USART_ISR_CMF_Msk (0x1UL << USART_ISR_CMF_Pos) /*!< 0x00020000 */ // USART_ISR_CMF USART_ISR_CMF_Msk /*!< Character Match Flag */ // USART_ISR_SBKF_Pos (18U) // USART_ISR_SBKF_Msk (0x1UL << USART_ISR_SBKF_Pos) /*!< 0x00040000 */ // USART_ISR_SBKF USART_ISR_SBKF_Msk /*!< Send Break Flag */ // USART_ISR_RWU_Pos (19U) // USART_ISR_RWU_Msk (0x1UL << USART_ISR_RWU_Pos) /*!< 0x00080000 */ // USART_ISR_RWU USART_ISR_RWU_Msk /*!< Receive Wake Up from mute mode Flag */ // USART_ISR_WUF_Pos (20U) // USART_ISR_WUF_Msk (0x1UL << USART_ISR_WUF_Pos) /*!< 0x00100000 */ // USART_ISR_WUF USART_ISR_WUF_Msk /*!< Wake Up from stop mode Flag */ // USART_ISR_TEACK_Pos (21U) // USART_ISR_TEACK_Msk (0x1UL << USART_ISR_TEACK_Pos) /*!< 0x00200000 */ // USART_ISR_TEACK USART_ISR_TEACK_Msk /*!< Transmit Enable Acknowledge Flag */ // USART_ISR_REACK_Pos (22U) // USART_ISR_REACK_Msk (0x1UL << USART_ISR_REACK_Pos) /*!< 0x00400000 */ // USART_ISR_REACK USART_ISR_REACK_Msk /*!< Receive Enable Acknowledge Flag */ /******************* Bit definition for USART_ICR register ******************/ // USART_ICR_PECF_Pos (0U) // USART_ICR_PECF_Msk (0x1UL << USART_ICR_PECF_Pos) /*!< 0x00000001 */ // USART_ICR_PECF USART_ICR_PECF_Msk /*!< Parity Error Clear Flag */ // USART_ICR_FECF_Pos (1U) // USART_ICR_FECF_Msk (0x1UL << USART_ICR_FECF_Pos) /*!< 0x00000002 */ // USART_ICR_FECF USART_ICR_FECF_Msk /*!< Framing Error Clear Flag */ // USART_ICR_NECF_Pos (2U) // USART_ICR_NECF_Msk (0x1UL << USART_ICR_NECF_Pos) /*!< 0x00000004 */ // USART_ICR_NECF USART_ICR_NECF_Msk /*!< Noise Error detected Clear Flag */ // USART_ICR_ORECF_Pos (3U) // USART_ICR_ORECF_Msk (0x1UL << USART_ICR_ORECF_Pos) /*!< 0x00000008 */ // USART_ICR_ORECF USART_ICR_ORECF_Msk /*!< OverRun Error Clear Flag */ // USART_ICR_IDLECF_Pos (4U) // USART_ICR_IDLECF_Msk (0x1UL << USART_ICR_IDLECF_Pos) /*!< 0x00000010 */ // USART_ICR_IDLECF USART_ICR_IDLECF_Msk /*!< IDLE line detected Clear Flag */ // USART_ICR_TCCF_Pos (6U) // USART_ICR_TCCF_Msk (0x1UL << USART_ICR_TCCF_Pos) /*!< 0x00000040 */ // USART_ICR_TCCF USART_ICR_TCCF_Msk /*!< Transmission Complete Clear Flag */ // USART_ICR_LBDCF_Pos (8U) // USART_ICR_LBDCF_Msk (0x1UL << USART_ICR_LBDCF_Pos) /*!< 0x00000100 */ // USART_ICR_LBDCF USART_ICR_LBDCF_Msk /*!< LIN Break Detection Clear Flag */ // USART_ICR_CTSCF_Pos (9U) // USART_ICR_CTSCF_Msk (0x1UL << USART_ICR_CTSCF_Pos) /*!< 0x00000200 */ // USART_ICR_CTSCF USART_ICR_CTSCF_Msk /*!< CTS Interrupt Clear Flag */ // USART_ICR_RTOCF_Pos (11U) // USART_ICR_RTOCF_Msk (0x1UL << USART_ICR_RTOCF_Pos) /*!< 0x00000800 */ // USART_ICR_RTOCF USART_ICR_RTOCF_Msk /*!< Receiver Time Out Clear Flag */ // USART_ICR_EOBCF_Pos (12U) // USART_ICR_EOBCF_Msk (0x1UL << USART_ICR_EOBCF_Pos) /*!< 0x00001000 */ // USART_ICR_EOBCF USART_ICR_EOBCF_Msk /*!< End Of Block Clear Flag */ // USART_ICR_CMCF_Pos (17U) // USART_ICR_CMCF_Msk (0x1UL << USART_ICR_CMCF_Pos) /*!< 0x00020000 */ // USART_ICR_CMCF USART_ICR_CMCF_Msk /*!< Character Match Clear Flag */ // USART_ICR_WUCF_Pos (20U) // USART_ICR_WUCF_Msk (0x1UL << USART_ICR_WUCF_Pos) /*!< 0x00100000 */ // USART_ICR_WUCF USART_ICR_WUCF_Msk /*!< Wake Up from stop mode Clear Flag */ /* Legacy defines */ // USART_ICR_NCF_Pos USART_ICR_NECF_Pos // USART_ICR_NCF_Msk USART_ICR_NECF_Msk // USART_ICR_NCF USART_ICR_NECF /******************* Bit definition for USART_RDR register ******************/ // USART_RDR_RDR_Pos (0U) // USART_RDR_RDR_Msk (0x1FFUL << USART_RDR_RDR_Pos) /*!< 0x000001FF */ // USART_RDR_RDR USART_RDR_RDR_Msk /*!< RDR[8:0] bits (Receive Data value) */ /******************* Bit definition for USART_TDR register ******************/ // USART_TDR_TDR_Pos (0U) // USART_TDR_TDR_Msk (0x1FFUL << USART_TDR_TDR_Pos) /*!< 0x000001FF */ // USART_TDR_TDR USART_TDR_TDR_Msk /*!< TDR[8:0] bits (Transmit Data value) */ if((UART5->ISR&USART_ISR_PE)!=0){//ïî îøèáêå ïàðèòåòà UART5->ICR|=USART_ICR_PECF; } if((UART5->ISR&USART_ISR_FE)!=0){//ïî îøèáêå êàäðèðîâàíèÿ UART5->ICR|=USART_ICR_FECF; } if((UART5->ISR&USART_ISR_NE )!=0){//ïî øóìó â ïîñûëêå UART5->ICR|=USART_ICR_NCF; } if((UART5->ISR&USART_ISR_ORE )!=0){//ïðèíÿòûå äàííûå íå óñïåëè ïðî÷èòàòü UART5->ICR|=USART_ICR_ORECF; } if((UART5->ISR&USART_ISR_IDLE )!=0){//íà ëèíèè äîëãî íè÷åãî íåò //âûñòàâëÿåòñÿ ïðè îáû÷íîì îáìåíå UART5->ICR|=USART_ICR_IDLECF; } if((UART5->ISR&USART_ISR_LBDF )!=0){//íà ëèíèè äëèííûé ëîãè÷åñêèé íîëü UART5->ICR|=USART_ICR_LBDCF ; } if((UART5->ISR&USART_ISR_RTOF )!=0){//òàéì àóò ïî ïðèåìó UART5->ICR|=USART_ICR_RTOCF ; } if((UART5->ISR&USART_ISR_EOBF )!=0){//êîíåö áëîêà - ïðè ðàáîòå ñî ñìàðò êàðòàìè //âûñòàâëÿåòñÿ ïðè îáû÷íîì îáìåíå UART5->ICR|=USART_ICR_EOBCF ; } if((UART5->ISR&USART_ISR_BUSY )!=0){// èäåò ïðèåì áàéòà - ôëàã âûñòàâëÿåòñÿ è ñáðàñûâàåòñÿ àïïàðàòíî //UART5->ICR=USART_ICR_EOBCF ; __NOP();// } if((UART5->ISR&USART_ISR_CTSIF )!=0){// CTS interrupt flag - ôëàã âûñòàâëÿåòñÿ è ñáðàñûâàåòñÿ àïïàðàòíî UART5->ICR|=USART_ICR_CTSCF ; __NOP();// } if((UART5->ISR&USART_ISR_CTS )!=0){// CTS flag - ôëàã âûñòàâëÿåòñÿ è ñáðàñûâàåòñÿ àïïàðàòíî //UART5->ICR=USART_ICR_EOBCF ; __NOP();// } if((UART5->ISR&USART_ISR_ABRE )!=0){// Auto-Baud Rate Error - ôëàã âûñòàâëÿåòñÿ è ñáðàñûâàåòñÿ àïïàðàòíî UART5->CR3|=USART_RQR_ABRRQ ; __NOP();// } if((UART5->ISR&USART_ISR_CMF )!=0){// Character Match Flag - ôëàã âûñòàâëÿåòñÿ àïïàðàòíî UART5->ICR|=USART_ICR_CMCF ; //âûñòàâëÿåòñÿ ïðè îáû÷íîì îáìåíå __NOP();// } if((UART5->ISR&USART_ISR_SBKF )!=0){// Send Break Flag - ôëàã âûñòàâëÿåòñÿ ïðîãðàììíî è ñáðàñûâàåòñÿ àïïàðàòíî //UART5->ICR=USART_ICR_EOBCF ; __NOP();// } if((UART5->ISR&USART_ISR_RWU )!=0){// Receive Wake Up from mute mode Flag - ôëàã âûñòàâëÿåòñÿ è ñáðàñûâàåòñÿ àïïàðàòíî //UART5->ICR=USART_ICR_EOBCF ; //âûñòàâëÿåòñÿ ïðè îáû÷íîì îáìåíå __NOP();// } if((UART5->ISR&USART_ISR_WUF )!=0){// Wake Up from stop mode Flag - ôëàã âûñòàâëÿåòñÿ àïïàðàòíî UART5->ICR|=USART_ICR_WUCF ; //âûñòàâëÿåòñÿ ïðè îáû÷íîì îáìåíå __NOP();// } if((UART5->ISR&USART_ISR_TEACK )!=0){// Transmit Enable Acknowledge Flag - ôëàã âûñòàâëÿåòñÿ è ñáðàñûâàåòñÿ àïïàðàòíî //UART5->ICR=USART_ICR_EOBCF ; //âûñòàâëÿåòñÿ ïðè îáû÷íîì îáìåíå __NOP();// } if((UART5->ISR&USART_ISR_REACK )!=0){// Receive Enable Acknowledge Flag - ôëàã âûñòàâëÿåòñÿ è ñáðàñûâàåòñÿ àïïàðàòíî //UART5->ICR=USART_ICR_EOBCF ; __NOP();// } //. USART_ISR_PE USART_ISR_PE_Msk /*!< Parity Error */ //. USART_ISR_FE USART_ISR_FE_Msk /*!< Framing Error */ //. USART_ISR_NE USART_ISR_NE_Msk /*!< Noise Error detected Flag */ //. USART_ISR_ORE USART_ISR_ORE_Msk /*!< OverRun Error */ //. USART_ISR_IDLE USART_ISR_IDLE_Msk /*!< IDLE line detected */ // USART_ISR_RXNE USART_ISR_RXNE_Msk /*!< Read Data Register Not Empty */ // USART_ISR_TC USART_ISR_TC_Msk /*!< Transmission Complete */ // USART_ISR_TXE USART_ISR_TXE_Msk /*!< Transmit Data Register Empty */ //. USART_ISR_LBDF USART_ISR_LBDF_Msk /*!< LIN Break Detection Flag */ //. USART_ISR_CTSIF USART_ISR_CTSIF_Msk /*!< CTS interrupt flag */ //. USART_ISR_CTS USART_ISR_CTS_Msk /*!< CTS flag */ //. USART_ISR_RTOF USART_ISR_RTOF_Msk /*!< Receiver Time Out */ //. USART_ISR_EOBF USART_ISR_EOBF_Msk /*!< End Of Block Flag */ //. USART_ISR_ABRE USART_ISR_ABRE_Msk /*!< Auto-Baud Rate Error */ //. USART_ISR_ABRF USART_ISR_ABRF_Msk /*!< Auto-Baud Rate Flag */ //. USART_ISR_BUSY USART_ISR_BUSY_Msk /*!< Busy Flag */ //. USART_ISR_CMF USART_ISR_CMF_Msk /*!< Character Match Flag */ //. USART_ISR_SBKF USART_ISR_SBKF_Msk /*!< Send Break Flag */ //. USART_ISR_RWU USART_ISR_RWU_Msk /*!< Receive Wake Up from mute mode Flag */ //. USART_ISR_WUF USART_ISR_WUF_Msk /*!< Wake Up from stop mode Flag */ //. USART_ISR_TEACK USART_ISR_TEACK_Msk /*!< Transmit Enable Acknowledge Flag */ // USART_ISR_REACK USART_ISR_REACK_Msk /*!< Receive Enable Acknowledge Flag */ /****************** Bit definition for USART_CR1 register *******************/ //#define USART_CR1_SBK USART_CR1_SBK_Msk /*!< Send Break */ //#define USART_CR1_RWU USART_CR1_RWU_Msk /*!< Receiver wakeup */ //#define USART_CR1_RE USART_CR1_RE_Msk /*!< Receiver Enable */ //#define USART_CR1_TE USART_CR1_TE_Msk /*!< Transmitter Enable */ //#define USART_CR1_IDLEIE USART_CR1_IDLEIE_Msk /*!< IDLE Interrupt Enable */ //#define USART_CR1_RXNEIE USART_CR1_RXNEIE_Msk /*!< RXNE Interrupt Enable */ //#define USART_CR1_TCIE USART_CR1_TCIE_Msk /*!< Transmission Complete Interrupt Enable */ //#define USART_CR1_TXEIE USART_CR1_TXEIE_Msk /*!< PE Interrupt Enable */ //#define USART_CR1_PEIE USART_CR1_PEIE_Msk /*!< PE Interrupt Enable */ //#define USART_CR1_PS USART_CR1_PS_Msk /*!< Parity Selection */ //#define USART_CR1_PCE USART_CR1_PCE_Msk /*!< Parity Control Enable */ //#define USART_CR1_WAKE USART_CR1_WAKE_Msk /*!< Wakeup method */ //#define USART_CR1_M USART_CR1_M_Msk /*!< Word length */ //#define USART_CR1_UE USART_CR1_UE_Msk /*!< USART Enable */ /****************** Bit definition for USART_CR2 register *******************/ //#define USART_CR2_ADD USART_CR2_ADD_Msk /*!< Address of the USART node */ //#define USART_CR2_LBDL USART_CR2_LBDL_Msk /*!< LIN Break Detection Length */ //#define USART_CR2_LBDIE USART_CR2_LBDIE_Msk /*!< LIN Break Detection Interrupt Enable */ //#define USART_CR2_LBCL USART_CR2_LBCL_Msk /*!< Last Bit Clock pulse */ //#define USART_CR2_CPHA USART_CR2_CPHA_Msk /*!< Clock Phase */ //#define USART_CR2_CPOL USART_CR2_CPOL_Msk /*!< Clock Polarity */ //#define USART_CR2_CLKEN USART_CR2_CLKEN_Msk /*!< Clock Enable */ //#define USART_CR2_STOP USART_CR2_STOP_Msk /*!< STOP[1:0] bits (STOP bits) */ //#define USART_CR2_STOP_0 (0x1U << USART_CR2_STOP_Pos) /*!< 0x00001000 */ //#define USART_CR2_STOP_1 (0x2U << USART_CR2_STOP_Pos) /*!< 0x00002000 */ //#define USART_CR2_LINEN_Pos (14U) //#define USART_CR2_LINEN_Msk (0x1U << USART_CR2_LINEN_Pos) /*!< 0x00004000 */ //#define USART_CR2_LINEN USART_CR2_LINEN_Msk /*!< LIN mode enable */ /****************** Bit definition for USART_CR3 register *******************/ //#define USART_CR3_EIE USART_CR3_EIE_Msk /*!< Error Interrupt Enable */ //#define USART_CR3_IREN USART_CR3_IREN_Msk /*!< IrDA mode Enable */ //#define USART_CR3_IRLP USART_CR3_IRLP_Msk /*!< IrDA Low-Power */ //#define USART_CR3_HDSEL USART_CR3_HDSEL_Msk /*!< Half-Duplex Selection */ //#define USART_CR3_NACK USART_CR3_NACK_Msk /*!< Smartcard NACK enable */ //#define USART_CR3_SCEN USART_CR3_SCEN_Msk /*!< Smartcard mode enable */ //#define USART_CR3_DMAR USART_CR3_DMAR_Msk /*!< DMA Enable Receiver */ //#define USART_CR3_DMAT USART_CR3_DMAT_Msk /*!< DMA Enable Transmitter */ //#define USART_CR3_RTSE USART_CR3_RTSE_Msk /*!< RTS Enable */ //#define USART_CR3_CTSE USART_CR3_CTSE_Msk /*!< CTS Enable */ //#define USART_CR3_CTSIE USART_CR3_CTSIE_Msk /*!< CTS Interrupt Enable */ /******************* Bit definition for USART_ICR register ******************/ // USART_ICR_PECF_Pos (0U) // USART_ICR_PECF_Msk (0x1UL << USART_ICR_PECF_Pos) /*!< 0x00000001 */ // USART_ICR_PECF USART_ICR_PECF_Msk /*!< Parity Error Clear Flag */ // USART_ICR_FECF_Pos (1U) // USART_ICR_FECF_Msk (0x1UL << USART_ICR_FECF_Pos) /*!< 0x00000002 */ // USART_ICR_FECF USART_ICR_FECF_Msk /*!< Framing Error Clear Flag */ // USART_ICR_NECF_Pos (2U) // USART_ICR_NECF_Msk (0x1UL << USART_ICR_NECF_Pos) /*!< 0x00000004 */ // USART_ICR_NECF USART_ICR_NECF_Msk /*!< Noise Error detected Clear Flag */ // USART_ICR_ORECF_Pos (3U) // USART_ICR_ORECF_Msk (0x1UL << USART_ICR_ORECF_Pos) /*!< 0x00000008 */ // USART_ICR_ORECF USART_ICR_ORECF_Msk /*!< OverRun Error Clear Flag */ // USART_ICR_IDLECF_Pos (4U) // USART_ICR_IDLECF_Msk (0x1UL << USART_ICR_IDLECF_Pos) /*!< 0x00000010 */ // USART_ICR_IDLECF USART_ICR_IDLECF_Msk /*!< IDLE line detected Clear Flag */ // USART_ICR_TCCF_Pos (6U) // USART_ICR_TCCF_Msk (0x1UL << USART_ICR_TCCF_Pos) /*!< 0x00000040 */ // USART_ICR_TCCF USART_ICR_TCCF_Msk /*!< Transmission Complete Clear Flag */ // USART_ICR_LBDCF_Pos (8U) // USART_ICR_LBDCF_Msk (0x1UL << USART_ICR_LBDCF_Pos) /*!< 0x00000100 */ // USART_ICR_LBDCF USART_ICR_LBDCF_Msk /*!< LIN Break Detection Clear Flag */ // USART_ICR_CTSCF_Pos (9U) // USART_ICR_CTSCF_Msk (0x1UL << USART_ICR_CTSCF_Pos) /*!< 0x00000200 */ // USART_ICR_CTSCF USART_ICR_CTSCF_Msk /*!< CTS Interrupt Clear Flag */ // USART_ICR_RTOCF_Pos (11U) // USART_ICR_RTOCF_Msk (0x1UL << USART_ICR_RTOCF_Pos) /*!< 0x00000800 */ // USART_ICR_RTOCF USART_ICR_RTOCF_Msk /*!< Receiver Time Out Clear Flag */ // USART_ICR_EOBCF_Pos (12U) // USART_ICR_EOBCF_Msk (0x1UL << USART_ICR_EOBCF_Pos) /*!< 0x00001000 */ // USART_ICR_EOBCF USART_ICR_EOBCF_Msk /*!< End Of Block Clear Flag */ // USART_ICR_CMCF_Pos (17U) // USART_ICR_CMCF_Msk (0x1UL << USART_ICR_CMCF_Pos) /*!< 0x00020000 */ // USART_ICR_CMCF USART_ICR_CMCF_Msk /*!< Character Match Clear Flag */ // USART_ICR_WUCF_Pos (20U) // USART_ICR_WUCF_Msk (0x1UL << USART_ICR_WUCF_Pos) /*!< 0x00100000 */ // USART_ICR_WUCF USART_ICR_WUCF_Msk /*!< Wake Up from stop mode Clear Flag */ usart_sr_my=UART5->ISR; usart_rdr_my=UART5->RDR;//ïðî÷èòàëè áàéò è ïðè ýòîì //äîëæåí áûë ñáðîñèòñÿ ôëàã ïðåðûâàíèÿ RXNE if((usart_sr_my&USART_ISR_TXE)!=0){//ïî ïåðåäà÷å //äàííûå ïåðåäàëèñü â ñäâèãîâûé ðåãèñòð //UART5->ISR&=~USART_SR_TC; // UART5->ICR|=USART_ICR_TCCF ;//ñáðîñèì ôëàã UART5->RQR|=USART_RQR_TXFRQ ;//ñáðîñèì USART_SR_TXE // tx_flag=1; __nop(); } if((usart_sr_my&USART_ISR_TC)!=0){//ïî ïåðåäà÷å //äàííûå ïåðåäàëèñü èç ñäâèãîâîãî ðåãèñòðà //UART5->ISR&=~USART_SR_TC; UART5->ICR|=USART_ICR_TCCF ;//ñáðîñèì ôëàã // UART5->RQR|=USART_RQR_TXFRQ ;//ñáðîñèì USART_SR_TXE tx_flag=1; } if((usart_sr_my&USART_ISR_RXNE)!=0){//ïî ïðèåìó rx_flag=1; //UART5->SR&=~USART_SR_RXNE; UART5->RQR|=USART_RQR_RXFRQ;//**ñáðîñèì ôëàã RXNE ÿâíî //rx_reg=UART5->RDR;//ïðî÷èòàëè áàéò //rx_reg=(UART5->DR);//ïðî÷èòàëè áàéò } // if((UART5->SR&USART_SR_TXE )!=0){//ïóñò ñäâèãîâûé ðåãèñòð ïåðåäàò÷èêà // //UART5->ICR=USART_ICR_IDLECF; // __NOP();// // } // //osSemaphoreWait (mbs_u5_state_busy_semHandle,2); if(tx_flag==1){//ïî ïåðåäà÷å tx_flag=0; ... }//ïî ïåðåäà÷å if(rx_flag==1){//ïî ïðèåìó rx_flag=0; ... }//ïî ïðèåìó //UART5->ISR=0;//~0xffffffff;//ñáðîñèì âñå // çàðåìàðèì ñáðîñ - âäðóã êàêîå òî ïðåðûâàíèå âîçíèêàåò ïîâòîðíî UART5->ICR=0xFFFF;//ñáðîñèì âñå ôëàãè // çàðåìàðèì ñáðîñ - âäðóã êàêîå òî ïðåðûâàíèå âîçíèêàåò ïîâòîðíî //UART5->RQR|=USART_RQR_TXFRQ;//**ñáðîñèì ôëàã TXE ÿâíî //UART5->RQR|=USART_RQR_RXFRQ;//**ñáðîñèì ôëàã RXNE ÿâíî // osSemaphoreRelease (mbs_u5_state_busy_semHandle); //if((UART5->ISR&USART_ISR_PE)!=0){//ïî îøèáêå ïàðèòåòà UART5->ICR|=USART_ICR_PECF; // } // if((UART5->ISR&USART_ISR_FE)!=0){//ïî îøèáêå êàäðèðîâàíèÿ UART5->ICR|=USART_ICR_FECF; // } // if((UART5->ISR&USART_ISR_NE )!=0){//ïî øóìó â ïîñûëêå UART5->ICR|=USART_ICR_NCF; // } // if((UART5->ISR&USART_ISR_ORE )!=0){//ïðèíÿòûå äàííûå íå óñïåëè ïðî÷èòàòü UART5->ICR|=USART_ICR_ORECF; // } // if((UART5->ISR&USART_ISR_IDLE )!=0){//íà ëèíèè äîëãî íè÷åãî íåò //âûñòàâëÿåòñÿ ïðè îáû÷íîì îáìåíå UART5->ICR|=USART_ICR_IDLECF; // } //if((UART5->ISR&USART_ISR_LBDF )!=0){//íà ëèíèè äëèííûé ëîãè÷åñêèé íîëü UART5->ICR|=USART_ICR_LBDCF ; // } // if((UART5->ISR&USART_ISR_RTOF )!=0){//òàéì àóò ïî ïðèåìó UART5->ICR|=USART_ICR_RTOCF ; // } } дернул из кейла. сходу не могу справится с кодировкой. //ðàñøèðåííàÿ íàñòðîéêà ïîðòà static void MX_UART5_Ext_Init( short unsigned int spd, unsigned char stp, unsigned char par ) { /* USER CODE BEGIN UART5_Init 0 */ /* USER CODE END UART5_Init 0 */ /* USER CODE BEGIN UART5_Init 1 */ /* USER CODE END UART5_Init 1 */ huart5.Instance = UART5; huart5.Init.BaudRate = 19200; if(spd==3){huart5.Init.BaudRate =1200;} if(spd==4){huart5.Init.BaudRate =2400;} if(spd==5){huart5.Init.BaudRate =4800;} if(spd==6){huart5.Init.BaudRate =9600;} if(spd==7){huart5.Init.BaudRate =19200;} if(spd==8){huart5.Init.BaudRate =38400;} if(spd==9){huart5.Init.BaudRate =57600;} if(spd==10){huart5.Init.BaudRate =115200;} huart5.Init.WordLength = UART_WORDLENGTH_8B; huart5.Init.StopBits = UART_STOPBITS_1; huart5.Init.Parity = UART_PARITY_NONE; if(par==0){ huart5.Init.StopBits = UART_STOPBITS_1; huart5.Init.Parity = UART_PARITY_NONE; huart5.Init.WordLength = UART_WORDLENGTH_8B; if(stp<=1){ huart5.Init.StopBits = UART_STOPBITS_1; } if(stp>=2){ huart5.Init.StopBits = UART_STOPBITS_2; } } if(par==1){ huart5.Init.StopBits = UART_STOPBITS_1; huart5.Init.Parity = UART_PARITY_ODD; huart5.Init.WordLength = UART_WORDLENGTH_9B; if(stp<=1){ huart5.Init.StopBits = UART_STOPBITS_1; } if(stp>=2){ huart5.Init.StopBits = UART_STOPBITS_2; } } if(par==2){ huart5.Init.StopBits = UART_STOPBITS_1; huart5.Init.Parity = UART_PARITY_EVEN; huart5.Init.WordLength = UART_WORDLENGTH_9B; if(stp<=1){ huart5.Init.StopBits = UART_STOPBITS_1; } if(stp>=2){ huart5.Init.StopBits = UART_STOPBITS_2; } } //îòëàäêà // huart5.Init.StopBits = UART_STOPBITS_1; // huart5.Init.Parity = UART_PARITY_ODD; // huart5.Init.WordLength = UART_WORDLENGTH_9B; huart5.Init.Mode = UART_MODE_TX_RX; huart5.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart5.Init.OverSampling = UART_OVERSAMPLING_16;;//UART_OVERSAMPLING_8;//UART_OVERSAMPLING_16; huart5.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart5.AdvancedInit.OverrunDisable=UART_ADVFEATURE_OVERRUN_DISABLE; huart5.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXOVERRUNDISABLE_INIT; if (HAL_UART_Init(&huart5) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN UART5_Init 2 */ // uart5_rx_time_out=3; UART5->ICR=USART_ICR_TCCF;// ñáðàñûâàåì ôëàã ïðåðûâàíèÿ îêîí÷àíèÿ ïåðåäà÷è TC UART5->RQR=USART_RQR_RXFRQ;// ñáðàñûâàåì ôëàã ïðåðûâàíèÿ ïðèåìâ RXNE //UART5->CR1|=USART_CR1_TCIE;//ðàçðåøàåì ïðåðûâàíèÿ UART5->CR1|=USART_CR1_RXNEIE; UART5->CR1|=USART_CR1_UE; UART5->CR1|=USART_CR1_RE; UART5->CR1|=USART_CR1_TE; /* USER CODE END UART5_Init 2 */ } работает это под фриртосом. кроме мыслей что в хард почему то вываливаемся из за оверранинга нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 22 августа Опубликовано 22 августа · Жалоба Флаги периферии (в данном случае) никак не влияют на возникновение исключений ядра. P.S. Код, конечно, шедеврален Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 22 августа Опубликовано 22 августа · Жалоба 1 час назад, Arlleex сказал: P.S. Код, конечно, шедеврален Чего вы хотите? Код от гуру сброса флагов UART STM32! PS: Столько было апломбу, а код на уровне: "только вчера начал пытаться программировать" мрак... 1 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 22 августа Опубликовано 22 августа · Жалоба 11 hours ago, firstvald said: Происходит следущее. При обращении к порту на скорости На Пушкинской площади есть свободное место. Рядом с А.С. Пушкиным. 1 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kpv 15 22 августа Опубликовано 22 августа · Жалоба 11 hours ago, firstvald said: сваливание в hard fault. backtrace нужно смотреть. и обычно стэк во freertos. включить механизмы внутренней отладки configCHECK_FOR_STACK_OVERFLOW Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firstvald 24 22 августа Опубликовано 22 августа · Жалоба 1 hour ago, kpv said: backtrace нужно смотреть. и обычно стэк во freertos. включить механизмы внутренней отладки configCHECK_FOR_STACK_OVERFLOW на скорости на которой настроен порт обмен нормальный. сутками. CFSR показывает что со стеком ничего не происходит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 22 августа Опубликовано 22 августа · Жалоба Ох, мать... А с какой стороны это смотреть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firstvald 24 22 августа Опубликовано 22 августа · Жалоба хороший вопрос. посмотрю, что происходит при приеме на неправильной скорости одного байта AA. стойкое ощущение, что что- то с обнаружением шума на линии приводит к такому результату. ушло бы незамеченным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 22 августа Опубликовано 22 августа · Жалоба 16 часов назад, firstvald сказал: if((UART5->ISR&USART_ISR_PE)!=0){//ïî îøèáêå ïàðèòåòà UART5->ICR|=USART_ICR_PECF; } if((UART5->ISR&USART_ISR_FE)!=0){//ïî îøèáêå êàäðèðîâàíèÿ UART5->ICR|=USART_ICR_FECF; } if((UART5->ISR&USART_ISR_NE )!=0){//ïî øóìó â ïîñûëêå UART5->ICR|=USART_ICR_NCF; } if((UART5->ISR&USART_ISR_ORE )!=0){//ïðèíÿòûå äàííûå íå óñïåëè ïðî÷èòàòü UART5->ICR|=USART_ICR_ORECF; } Очевидно автор этого говнокода не читал мануал на МК. Иначе бы он знал, почему так делать нельзя (как сделано в процитированном фрагменте). Вроде как очевидно, что применять операцию '|=' к ICR в данном контексте нельзя. Так как биты ICR помечены как "rc_w1". Неужто это не очевидно гуру сброса флагов STM??? И ведь подобные баги уже 100500 раз обсуждались тут на форуме. А ведь ещё совсем недавно нас тут поучали насчёт чтения мануалов. Но как мы видим - автор этого поучения сам мануал даже не открывал. В 14.08.2024 в 14:46, firstvald сказал: ребята почитают , поржут Это те же самые ржущие ребята написали вышеприведённый говнокод? 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 22 августа Опубликовано 22 августа · Жалоба Дааа, говнокод конечно знатный, да еще и почему-то включены закомменченные описания регистров/битов. И почему половина кода закомментирована вообще? Еще и комменты на каком-то пуштунском языке. В СПб на каком языке говорят то? Ладно там "поребрик/бордюр", но это... if(spd==3) и тд обычно записывается с помощью switch(spd) { case 1: break; case 2: break; } Впрочем, дануевона, разбирать сиё творение. Мутотень и говнокод. Особенно еще с таким форматирвоанием. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firstvald 24 22 августа Опубликовано 22 августа · Жалоба оппа вопрос про говнокод интересный. я свичи таковым считаю. отсутствие справочных строк по битам в сложных случаях тоже выдает программиста программиста с которым приходится возиться и он потом убегает тварить в другую контору . пуштунский язык - отдельная спасиба кейлу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 22 августа Опубликовано 22 августа · Жалоба 20 minutes ago, firstvald said: потом убегает тварить в другую контору Вот же тварь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 23 августа Опубликовано 23 августа · Жалоба Тест 4 часа назад, firstvald сказал: отсутствие справочных строк по битам в сложных случаях экономит место, поскольку они уже есть в заголовочном файле, а нормальная IDE при наведении мышки показывает значения битовых масок, и при щелчке можно перейти в заголовочник прямо к описанию Поэтому, даже если программист убежал в другую контору, описания битов никуда не денутся, они остаются в заголовочнике и легко просматриваются. И здесь у вас - классический пример индусского кода. И проще послать подальше, чем реально разгрeбать портянки в попытке найти ошибку PS. Блин, я раз пять переписывал этот текст, и не мог понять, где именно "запрещенное слово" в тексте. А оказалось, что приличное слово "разгр/е/бать" считается тут неприличным 🙂 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 23 августа Опубликовано 23 августа · Жалоба Ладно, так и быть, показываю, как можно обходиться без вставки описания битов в рабочий текст: Так же, запись usart_sr_my&USART_ISR_TXE обычно принято писать с пробелами: usart_sr_my & USART_ISR_TXE дабы визуально был заметнее оператор и понятнее было, что там именно операция, а не набор букв. Небрежность в оформлении создает общее говнопредставление. В общем, в своем говнокоде, будьте любезны, разбирайтесь уж сами 🙂 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться