Перейти к содержанию
    

Исключение Hard Fault на Cortex-M3

1 час назад, koluna сказал:

Вот вырезка из даташита:

В этой вырезке просто говорится, что для сброса флагов ошибки нужно выполнить только чтение DR. И больше ничего. Естественно - после того как вы прочитали статус и узнали, что RXNE есть. Потому как если RXNE нет - DR читать нельзя!

Никаких дополнительных действий для сброса флагов не нужно.

1 час назад, koluna сказал:

Что произойдет, если прочитать регистр данных без установленного RXNE?

А сами разве не догадываетесь? Вроде как это очевидно.

В этом случае  - как вы определите, что именно считали? Какой-то мусор (от предыдущего приёма) или новый байт? И что после такого будет в регистре SR? Уже флаги для нового байта или от старого?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Продолжаем разговор.

Опять всплыла бяка с 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 ;
//	                                }																				 

}

дернул из кейла. сходу не могу справится с кодировкой.

 

image.thumb.png.76efac5ae595d38a3ffd8917effbe4be.png

image.png.180268c5bb653e795c6630d50acdbc4a.png

image.thumb.png.468caad727ad69a3b3cd3c61ee7958a4.png

 

image.thumb.png.2ae69ae00a222cd69bae4458554b0b24.png

//ðàñøèðåííàÿ íàñòðîéêà ïîðòà
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 */

}

работает это под фриртосом. кроме мыслей что в хард почему то вываливаемся из за оверранинга нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Флаги периферии (в данном случае) никак не влияют на возникновение исключений ядра.

P.S. Код, конечно, шедеврален:biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Arlleex сказал:

P.S. Код, конечно, шедеврален:biggrin:

Чего вы хотите? Код от гуру сброса флагов UART STM32!  :biggrin:

PS: Столько было апломбу, а код на уровне: "только вчера начал пытаться программировать"  :biggrin:   мрак... :negative:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, firstvald said:

Происходит следущее. При обращении к порту на скорости

На Пушкинской площади есть свободное место. Рядом с А.С. Пушкиным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, firstvald said:

сваливание в hard fault.

backtrace нужно смотреть.  и обычно стэк во freertos. включить механизмы внутренней отладки configCHECK_FOR_STACK_OVERFLOW 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, kpv said:

backtrace нужно смотреть.  и обычно стэк во freertos. включить механизмы внутренней отладки configCHECK_FOR_STACK_OVERFLOW 

на скорости на которой настроен порт обмен нормальный. сутками. CFSR показывает что со стеком ничего не происходит. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

хороший вопрос. посмотрю, что происходит при приеме на неправильной скорости одного байта AA. стойкое ощущение, что что- то с обнаружением шума на линии приводит к такому результату. ушло бы незамеченным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 раз обсуждались тут на форуме.

А ведь ещё совсем недавно нас тут поучали насчёт чтения мануалов. Но как мы видим - автор этого поучения сам мануал даже не открывал.  :unknw:

В 14.08.2024 в 14:46, firstvald сказал:

ребята почитают ,  поржут

Это те же самые ржущие ребята написали вышеприведённый говнокод?  :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дааа, говнокод конечно знатный, да еще и почему-то включены закомменченные описания регистров/битов. И почему половина кода закомментирована вообще?

Еще и комменты на каком-то пуштунском языке. В СПб на каком языке говорят то? Ладно там "поребрик/бордюр", но это...

if(spd==3) и тд

обычно записывается с помощью

switch(spd) {
case 1:
break;
case 2:
break;
}

 

Впрочем, дануевона, разбирать сиё творение. Мутотень и говнокод. Особенно еще с таким форматирвоанием.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

оппа вопрос про говнокод интересный. я свичи таковым считаю. отсутствие справочных строк по битам в сложных случаях тоже выдает программиста программиста с которым приходится возиться и он потом убегает тварить в другую контору . пуштунский язык - отдельная спасиба кейлу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 minutes ago, firstvald said:

потом убегает тварить в другую контору

Вот же тварь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тест

4 часа назад, firstvald сказал:

отсутствие справочных строк по битам в сложных случаях

экономит место, поскольку они уже есть в заголовочном файле, а нормальная IDE при наведении мышки показывает значения битовых масок, и при щелчке можно перейти в заголовочник прямо к описанию

Поэтому, даже если программист убежал в другую контору, описания битов никуда не денутся, они остаются  в заголовочнике и легко просматриваются.

И здесь у вас - классический пример индусского кода.

И проще послать подальше, чем реально разгрeбать портянки в попытке найти ошибку

PS. Блин, я раз пять переписывал этот текст, и не мог понять, где именно "запрещенное слово" в тексте. А оказалось, что приличное слово "разгр/е/бать" считается тут неприличным 🙂 

Снимок экрана 2024-08-23 090414.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ладно, так и быть, показываю, как можно обходиться без вставки описания битов в рабочий текст:

2024-08-23095041.thumb.jpg.2cf9888db5fdf4c8908b62a93dc385a3.jpg

Так же, запись

usart_sr_my&USART_ISR_TXE

обычно принято писать с пробелами:

 

usart_sr_my & USART_ISR_TXE

дабы визуально был заметнее оператор и понятнее было, что там именно операция, а не набор букв. Небрежность в оформлении создает общее говнопредставление. В общем, в своем говнокоде, будьте любезны, разбирайтесь уж сами 🙂 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...