summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/src/stm32/stm32_serial.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2013-02-09 19:13:01 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2013-02-09 19:13:01 +0000
commit9768bf44e8f274eecc92f4eefbf0496f32649196 (patch)
tree8c7dbfa5fd88cd897617577fe0336ed46522a774 /nuttx/arch/arm/src/stm32/stm32_serial.c
parent126b87e92e4e865bd17be99dd4b807655c4a97a8 (diff)
downloadpx4-nuttx-9768bf44e8f274eecc92f4eefbf0496f32649196.tar.gz
px4-nuttx-9768bf44e8f274eecc92f4eefbf0496f32649196.tar.bz2
px4-nuttx-9768bf44e8f274eecc92f4eefbf0496f32649196.zip
For STM32 F3, need to use ICR register to clear some U[S]ART interrupts
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5632 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/arch/arm/src/stm32/stm32_serial.c')
-rw-r--r--nuttx/arch/arm/src/stm32/stm32_serial.c91
1 files changed, 50 insertions, 41 deletions
diff --git a/nuttx/arch/arm/src/stm32/stm32_serial.c b/nuttx/arch/arm/src/stm32/stm32_serial.c
index 30cc4f056..18e65f1d9 100644
--- a/nuttx/arch/arm/src/stm32/stm32_serial.c
+++ b/nuttx/arch/arm/src/stm32/stm32_serial.c
@@ -876,20 +876,20 @@ static inline void up_disableusartint(struct up_dev_s *priv, uint16_t *ie)
/* USART interrupts:
*
- * Enable Bit Status Meaning Usage
- * ------------------ --- --------------- ------------------------------ ----------
- * USART_CR1_IDLEIE 4 USART_SR_IDLE Idle Line Detected (not used)
- * USART_CR1_RXNEIE 5 USART_SR_RXNE Received Data Ready to be Read
- * " " USART_SR_ORE Overrun Error Detected
- * USART_CR1_TCIE 6 USART_SR_TC Transmission Complete (used only for RS-485)
- * USART_CR1_TXEIE 7 USART_SR_TXE Transmit Data Register Empty
- * USART_CR1_PEIE 8 USART_SR_PE Parity Error
+ * Enable Status Meaning Usage
+ * ------------------ --------------- ------------------------------ ----------
+ * USART_CR1_IDLEIE USART_SR_IDLE Idle Line Detected (not used)
+ * USART_CR1_RXNEIE USART_SR_RXNE Received Data Ready to be Read
+ * " " USART_SR_ORE Overrun Error Detected
+ * USART_CR1_TCIE USART_SR_TC Transmission Complete (used only for RS-485)
+ * USART_CR1_TXEIE USART_SR_TXE Transmit Data Register Empty
+ * USART_CR1_PEIE USART_SR_PE Parity Error
*
- * USART_CR2_LBDIE 6 USART_SR_LBD Break Flag (not used)
- * USART_CR3_EIE 0 USART_SR_FE Framing Error
- * " " USART_SR_NE Noise Error
- * " " USART_SR_ORE Overrun Error Detected
- * USART_CR3_CTSIE 10 USART_SR_CTS CTS flag (not used)
+ * USART_CR2_LBDIE USART_SR_LBD Break Flag (not used)
+ * USART_CR3_EIE USART_SR_FE Framing Error
+ * " " USART_SR_NE Noise Error
+ * " " USART_SR_ORE Overrun Error Detected
+ * USART_CR3_CTSIE USART_SR_CTS CTS flag (not used)
*/
cr1 = up_serialin(priv, STM32_USART_CR1_OFFSET);
@@ -1354,20 +1354,20 @@ static int up_interrupt_common(struct up_dev_s *priv)
/* USART interrupts:
*
- * Enable Bit Status Meaning Usage
- * ------------------ --- --------------- ------------------------------- ----------
- * USART_CR1_IDLEIE 4 USART_SR_IDLE Idle Line Detected (not used)
- * USART_CR1_RXNEIE 5 USART_SR_RXNE Received Data Ready to be Read
- * " " USART_SR_ORE Overrun Error Detected
- * USART_CR1_TCIE 6 USART_SR_TC Transmission Complete (used only for RS-485)
- * USART_CR1_TXEIE 7 USART_SR_TXE Transmit Data Register Empty
- * USART_CR1_PEIE 8 USART_SR_PE Parity Error
+ * Enable Status Meaning Usage
+ * ------------------ --------------- ------------------------------- ----------
+ * USART_CR1_IDLEIE USART_SR_IDLE Idle Line Detected (not used)
+ * USART_CR1_RXNEIE USART_SR_RXNE Received Data Ready to be Read
+ * " " USART_SR_ORE Overrun Error Detected
+ * USART_CR1_TCIE USART_SR_TC Transmission Complete (used only for RS-485)
+ * USART_CR1_TXEIE USART_SR_TXE Transmit Data Register Empty
+ * USART_CR1_PEIE USART_SR_PE Parity Error
*
- * USART_CR2_LBDIE 6 USART_SR_LBD Break Flag (not used)
- * USART_CR3_EIE 0 USART_SR_FE Framing Error
- * " " USART_SR_NE Noise Error
- * " " USART_SR_ORE Overrun Error Detected
- * USART_CR3_CTSIE 10 USART_SR_CTS CTS flag (not used)
+ * USART_CR2_LBDIE USART_SR_LBD Break Flag (not used)
+ * USART_CR3_EIE USART_SR_FE Framing Error
+ * " " USART_SR_NE Noise Error
+ * " " USART_SR_ORE Overrun Error Detected
+ * USART_CR3_CTSIE USART_SR_CTS CTS flag (not used)
*
* NOTE: Some of these status bits must be cleared by explicity writing zero
* to the SR register: USART_SR_CTS, USART_SR_LBD. Note of those are currently
@@ -1407,6 +1407,14 @@ static int up_interrupt_common(struct up_dev_s *priv)
else if ((priv->sr & (USART_SR_ORE | USART_SR_NE | USART_SR_FE)) != 0)
{
+#ifdef CONFIG_STM32_STM32F30XX
+ /* These errors are cleared by writing the corresponding bit to the
+ * interrupt clear register (ICR).
+ */
+
+ up_serialout(priv, STM32_USART_ICR_OFFSET,
+ (USART_ICR_NCF | USART_ICR_ORECF | USART_ICR_FECF));
+#else
/* If an error occurs, read from DR to clear the error (data has
* been lost). If ORE is set along with RXNE then it tells you
* that the byte *after* the one in the data register has been
@@ -1416,6 +1424,7 @@ static int up_interrupt_common(struct up_dev_s *priv)
*/
(void)up_serialin(priv, STM32_USART_RDR_OFFSET);
+#endif
}
/* Handle outgoing, transmit bytes */
@@ -1608,17 +1617,17 @@ static void up_rxint(struct uart_dev_s *dev, bool enable)
/* USART receive interrupts:
*
- * Enable Bit Status Meaning Usage
- * ------------------ --- --------------- ------------------------------- ----------
- * USART_CR1_IDLEIE 4 USART_SR_IDLE Idle Line Detected (not used)
- * USART_CR1_RXNEIE 5 USART_SR_RXNE Received Data Ready to be Read
- * " " USART_SR_ORE Overrun Error Detected
- * USART_CR1_PEIE 8 USART_SR_PE Parity Error
+ * Enable Status Meaning Usage
+ * ------------------ --------------- ------------------------------- ----------
+ * USART_CR1_IDLEIE USART_SR_IDLE Idle Line Detected (not used)
+ * USART_CR1_RXNEIE USART_SR_RXNE Received Data Ready to be Read
+ * " " USART_SR_ORE Overrun Error Detected
+ * USART_CR1_PEIE USART_SR_PE Parity Error
*
- * USART_CR2_LBDIE 6 USART_SR_LBD Break Flag (not used)
- * USART_CR3_EIE 0 USART_SR_FE Framing Error
- * " " USART_SR_NE Noise Error
- * " " USART_SR_ORE Overrun Error Detected
+ * USART_CR2_LBDIE USART_SR_LBD Break Flag (not used)
+ * USART_CR3_EIE USART_SR_FE Framing Error
+ * " " USART_SR_NE Noise Error
+ * " " USART_SR_ORE Overrun Error Detected
*/
flags = irqsave();
@@ -1775,11 +1784,11 @@ static void up_txint(struct uart_dev_s *dev, bool enable)
/* USART transmit interrupts:
*
- * Enable Bit Status Meaning Usage
- * ------------------ --- --------------- ---------------------------- ----------
- * USART_CR1_TCIE 6 USART_SR_TC Transmission Complete (used only for RS-485)
- * USART_CR1_TXEIE 7 USART_SR_TXE Transmit Data Register Empty
- * USART_CR3_CTSIE 10 USART_SR_CTS CTS flag (not used)
+ * Enable Status Meaning Usage
+ * ------------------ --------------- ---------------------------- ----------
+ * USART_CR1_TCIE USART_SR_TC Transmission Complete (used only for RS-485)
+ * USART_CR1_TXEIE USART_SR_TXE Transmit Data Register Empty
+ * USART_CR3_CTSIE USART_SR_CTS CTS flag (not used)
*/
flags = irqsave();