aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--02-usart/include/core/rcc.h24
-rw-r--r--02-usart/include/core/usart.h196
-rw-r--r--02-usart/src/core/usart.c16
-rw-r--r--02-usart/src/main.c38
4 files changed, 151 insertions, 123 deletions
diff --git a/02-usart/include/core/rcc.h b/02-usart/include/core/rcc.h
index 23f1bd9..9c82501 100644
--- a/02-usart/include/core/rcc.h
+++ b/02-usart/include/core/rcc.h
@@ -27,6 +27,30 @@ typedef struct {
__IO uint32_t reserved_3; /* Not used. offset 0x34. */
+#define rcc_lptim1rst (1 << 31) // Low Power Timer 1 reset
+#define rcc_opamprst (1 << 30) // OPAMP interface reset
+#define rcc_dac1rst (1 << 29) // DAC1 interface reset
+#define rcc_pwrrst (1 << 28) // Power interface reset
+#define rcc_can2rst (1 << 26) // CAN2 reset (this bit is reserved for STM32L47x/L48x devices)
+#define rcc_can1rst (1 << 25) // CAN1 reset
+#define rcc_crsrst (1 << 24) // CRS reset (this bit is reserved for STM32L47x/L48x devices)
+#define rcc_i2c3rst (1 << 23) // I2C3 reset
+#define rcc_i2c2rst (1 << 22) // I2C2 reset
+#define rcc_i2c1rst (1 << 21) // I2C1 reset
+#define rcc_uart5rst (1 << 20) // UART5 reset
+#define rcc_uart4rst (1 << 19) // UART4 reset
+#define rcc_usart3rst (1 << 18) // USART3 reset
+#define rcc_usart2rst (1 << 17) // USART2 reset
+#define rcc_reserved (1 << 16) // must be kept at reset value.
+#define rcc_spi3rst (1 << 15) // SPI3 reset
+#define rcc_spi2rst (1 << 14) // SPI2 reset
+#define rcc_lcdrst (1 << 9) // interface reset (this bit is reserved for STM32L471/L4x5 devices)
+#define rcc_tim7rst (1 << 5) // timer reset
+#define rcc_tim6rst (1 << 4) // timer reset
+#define rcc_tim5rst (1 << 3) // timer reset
+#define rcc_tim4rst (1 << 2) // timer reset
+#define rcc_tim3rst (1 << 1) // timer reset
+#define rcc_tim2rst (1 << 0) // timer reset
__IO uint32_t apb1rst1_r; /* APB Peripheral reset register 1. 0x38 */
__IO uint32_t apb1rst2_r; /* APB Peripheral reset register 2. 0x3C */
__IO uint32_t apb2rst_r; /* APB Peripheral reset register. 0x40 */
diff --git a/02-usart/include/core/usart.h b/02-usart/include/core/usart.h
index 9ed6dbb..667b931 100644
--- a/02-usart/include/core/usart.h
+++ b/02-usart/include/core/usart.h
@@ -23,63 +23,56 @@ typedef enum {
typedef struct {
/* USART configuration registers 0x04 - 0x0c. */
- union {
- __IO uint32_t c_r1;
- struct {
- bits_t ue:1; /* UART enable */
- bits_t uesm:1; /* UART enabled in stop mode. */
- bits_t re:1; /* reciever enabled. */
- bits_t te:1; /* transmitter enabled. */
- bits_t idleie:1; /* Idle interrupt enabled. */
- bits_t rxneie:1; /* RXNEIE RXNE interrupt enable. */
- bits_t tcie:1;
- bits_t txeie:1;
- bits_t peie:1;
- bits_t ps:1;
- bits_t pce:1;
- bits_t wake:1;
- bits_t m0:1;
- bits_t mme:1;
- bits_t cmie:1;
- bits_t over8:1;
- bits_t dedt:4;
- bits_t deat:4;
- bits_t rtoie:1;
- bits_t eobie:1;
- bits_t m1:1;
- bits_t reserved:3;
- } PACKED c1_bf; /* c1_bf = c1 bit field */
- }; /* USART Control Register 1. */
+#define usart_ue (1 << 0) /* UART enable */
+#define usart_uesm (1 << 1) /* UART enabled in stop mode. */
+#define usart_re (1 << 2) /* reciever enabled. */
+#define usart_te (1 << 3) /* transmitter enabled. */
+#define usart_idleie (1 << 4) /* Idle interrupt enabled. */
+#define usart_rxneie (1 << 5) /* RXNEIE RXNE interrupt enable. */
+#define usart_tcie (1 << 6)
+#define usart_txeie (1 << 7)
+#define usart_peie (1 << 8)
+#define usart_ps (1 << 9)
+#define usart_pce (1 << 10)
+#define usart_wake (1 << 11)
+#define usart_m0 (1 << 12)
+#define usart_mme (1 << 13)
+#define usart_cmie (1 << 14)
+#define usart_over8 (1 << 15)
+#define usart_dedt (0xF << 16)
+#define usart_deat (0xF << 21)
+#define usart_rtoie (1 << 26)
+#define usart_eobie (1 << 27)
+#define usart_m1 (1 << 28)
+ __IO uint32_t c_r1;
__IO uint32_t c_r2;
- union {
- __IO uint32_t c_r3;
- struct {
- bits_t eie:1; // Error interrupt enable.
- bits_t iren:1; // IrDA mode enabled
- bits_t irlp:1; // IrDA low power
- bits_t hdsel:1; // Half duplex selection
- bits_t nack:1; // Smartcard NACK enable
- bits_t scen:1; // Smartocard mode enable
- bits_t dmar:1; // DMA enable reciever
- bits_t dmat:1; // DMA enable transmitter
- bits_t rtse:1; // RTS enable
- bits_t ctse:1; // CTS enable
- bits_t ctsie:1; // CTS interrupt enable
- bits_t onebit:1; // One sample bit method enable
- bits_t ovrdis:1; // Overrun disable
- bits_t ddre:1; // DMA Disable on reception error
- bits_t dem:1; // Driver enable mode
- bits_t dep:1; // Driver enable polarity selection
- bits_t reserved0:1;
- bits_t scarcnt:3; // Smartcard auto-retry count.
- bits_t wus:2; // Wakeup from STOP mode interrept flag selection
- bits_t wufie:1; // Wakeup from STOP mode interrup enable
- bits_t ucesm:1; // USART clock enable in STOP mode.
- bits_t tcbgtie:1; // Transmission complete before guard time interrupt
- bits_t reserved1:7;
- } PACKED c3_bf;
- };
+
+#define usart_eie (1 << 0) // Error interrupt enable.
+#define usart_iren (1 << 1) // IrDA mode enabled
+#define usart_irlp (1 << 2) // IrDA low power
+#define usart_hdsel (1 << 3) // Half duplex selection
+#define usart_nack (1 << 4) // Smartcard NACK enable
+#define usart_scen (1 << 5) // Smartocard mode enable
+#define usart_dmar (1 << 6) // DMA enable reciever
+#define usart_dmat (1 << 7) // DMA enable transmitter
+#define usart_rtse (1 << 8) // RTS enable
+#define usart_ctse (1 << 9) // CTS enable
+#define usart_ctsie (1 << 10) // CTS interrupt enable
+#define usart_onebit (1 << 11) // One sample bit method enable
+#define usart_ovrdis (1 << 12) // Overrun disable
+#define usart_ddre (1 << 13) // DMA Disable on reception error
+#define usart_dem (1 << 14) // Driver enable mode
+#define usart_dep (1 << 15) // Driver enable polarity selection
+#define usart_scarcnt0 (1 << 17)
+#define usart_scarcnt1 (1 << 18)
+#define usart_scarcnt2 (1 << 19)
+#define usart_wus0 (1 << 20) // Wakeup from STOP mode interrept flag selection
+#define usart_wus1 (1 << 21) // Wakeup from STOP mode interrept flag selection
+#define usart_wufie (1 << 22) // Wakeup from STOP mode interrup enable
+#define usart_ucesm (1 << 23) // USART clock enable in STOP mode.
+#define usart_tcbgtie (1 << 24) // Transmission complete before guard time interrupt
+ __IO uint32_t c_r3;
/* USART baud rate register. */
uint32_t br_r;
@@ -88,60 +81,45 @@ typedef struct {
uint32_t rq_r;
/* USART ISR register. Offset = 0x1c*/
- union {
- __IO uint32_t is_r; /* Interrupt service register. */
- struct {
- bits_t pe:1; // Parity error
- bits_t fe:1; // Framing error
- bits_t nf:1; // START bit noise detection flag.
- bits_t ore:1; // Overrun error
- bits_t dlie:1; // Idle line detected
- bits_t rxne:1; // Read data register not empty
- bits_t tc:1; // Transmission complete
- bits_t txe:1; // Transmit data register empty
- bits_t lbdf:1; // LIN break detection flag
- bits_t ctsif:1; // CTS interrupt flag
- bits_t cts:1; // CTS flag.
- bits_t rtof:1; // Receiever timeout
- bits_t eobf:1; // End of block flag
- bits_t reserved0:1;
- bits_t abre:1; // Auto baud rate error
- bits_t abrf:1; // Auto baud rate flag
- bits_t busy:1; // Busy flag
- bits_t cmf:1; // Character match flag
- bits_t sbkf:1; // send break flag
- bits_t rwu:1; // receiver wakeup frlom mute mode.
- bits_t wuf:1; // Wakeup from stop mode flag
- bits_t teack:1; // Transmit enable acknowledge flag.
- bits_t reack:1; // Receieve enable acknowledge flag.
- bits_t reserved1:2;
- bits_t tcbgt:1; // Transmission completer before guard time completion.
- bits_t reserved2:6;
- } PACKED is_bf; /* Interrupt servite bit field. */
- };
- union {
- __IO uint32_t ic_r;
- struct {
- bits_t pecf:1; // Parity error clear flag
- bits_t fecf:1; // Framing error clear flag
- bits_t ncf:1; // Noise detected clear flag
- bits_t orecf:1; // Overrun error clear flag
- bits_t idlecf:1; // Idle line detected clear flag
- bits_t reserved0:1;
- bits_t tccf:1; // Transmission complete clear flag
- bits_t tcbgtcf:1; // Transmission completed before guard time clear flag
- bits_t lbdcf:1; // LIN break detection clear flag
- bits_t ctscf:1; // CTS clear flag
- bits_t reserved1:1;
- bits_t rtocf:1; // Receiver timeout clear flag
- bits_t eobcf:1; // End of block clear flag
- bits_t reserved2:4;
- bits_t cmcf:1; // Character match clear flag
- bits_t reserved3:2; // Character match clear flag
- bits_t wucf:1; // Wakeup from Stop mode clear flag.
- bits_t reserved4:11;
- } PACKED ic_bf;
- };
+#define usart_pe (1 << 0) // Parity error
+#define usart_fe (1 << 1) // Framing error
+#define usart_nf (1 << 2) // START bit noise detection flag.
+#define usart_ore (1 << 3) // Overrun error
+#define usart_dlie (1 << 4) // Idle line detected
+#define usart_rxne (1 << 5) // Read data register not empty
+#define usart_tc (1 << 6) // Transmission complete
+#define usart_txe (1 << 7) // Transmit data register empty
+#define usart_lbdf (1 << 8) // LIN break detection flag
+#define usart_ctsif (1 << 9) // CTS interrupt flag
+#define usart_cts (1 << 10) // CTS flag.
+#define usart_rtof (1 << 11) // Receiever timeout
+#define usart_eobf (1 << 12) // End of block flag
+#define usart_abre (1 << 14) // Auto baud rate error
+#define usart_abrf (1 << 15) // Auto baud rate flag
+#define usart_busy (1 << 16) // Busy flag
+#define usart_cmf (1 << 17) // Character match flag
+#define usart_sbkf (1 << 18) // send break flag
+#define usart_rwu (1 << 19) // receiver wakeup frlom mute mode.
+#define usart_wuf (1 << 20) // Wakeup from stop mode flag
+#define usart_teack (1 << 21) // Transmit enable acknowledge flag.
+#define usart_reack (1 << 22) // Receieve enable acknowledge flag.
+#define usart_tcbgt (1 << 25) // Transmission completer before guard time completion.
+ __IO uint32_t is_r; /* Interrupt service register. */
+
+#define usart_pecf (1 << 0) // Parity error clear flag
+#define usart_fecf (1 << 1) // Framing error clear flag
+#define usart_ncf (1 << 2) // Noise detected clear flag
+#define usart_orecf (1 << 3) // Overrun error clear flag
+#define usart_idlecf (1 << 4) // Idle line detected clear flag
+#define usart_tccf (1 << 6) // Transmission complete clear flag
+#define usart_tcbgtcf (1 << 7) // Transmission completed before guard time clear flag
+#define usart_lbdcf (1 << 8) // LIN break detection clear flag
+#define usart_ctscf (1 << 9) // CTS clear flag
+#define usart_rtocf (1 << 11) // Receiver timeout clear flag
+#define usart_eobcf (1 << 12) // End of block clear flag
+#define usart_cmcf (1 << 17) // Character match clear flag
+#define usart_wucf (1 << 20) // Wakeup from Stop mode clear flag.
+ __IO uint32_t ic_r;
uint32_t rd_r;
uint32_t td_r;
} usart_t;
diff --git a/02-usart/src/core/usart.c b/02-usart/src/core/usart.c
index 8f58d8b..dc15e57 100644
--- a/02-usart/src/core/usart.c
+++ b/02-usart/src/core/usart.c
@@ -44,12 +44,12 @@ void usart_set_enabled(__IO usart_t* usart, usart_enable_t enabled)
uint32_t c_r1 = usart->c_r1;
if (!enabled) {
- usart->c1_bf.ue = 0;
+ regset(usart->c_r1, usart_ue, 0);
} else {
/* Set the rx enabled. */
- usart->c1_bf.re = !!(enabled & USART_ENABLE_RX);
- usart->c1_bf.te = !!(enabled & USART_ENABLE_TX);
- usart->c1_bf.ue = 1;
+ regset(usart->c_r1, usart_re, !!(enabled & USART_ENABLE_RX));
+ regset(usart->c_r1, usart_te, !!(enabled & USART_ENABLE_TX));
+ regset(usart->c_r1, usart_ue, 1);
}
}
@@ -85,16 +85,16 @@ void usart_enable_dma(__IO usart_t* usart, usart_enable_t enabled)
{
switch(enabled) {
case USART_ENABLE_DISABLED:
- usart->c3_bf.dmar = 0;
- usart->c3_bf.dmat = 0;
+ regset(usart->c_r3, usart_dmar, 0);
+ regset(usart->c_r3, usart_dmat, 0);
break;
case USART_ENABLE_TX:
- usart->c3_bf.dmat = 1;
+ regset(usart->c_r3, usart_dmat, 1);
break;
case USART_ENABLE_RX:
- usart->c3_bf.dmar = 1;
+ regset(usart->c_r3, usart_dmar, 1);
break;
};
}
diff --git a/02-usart/src/main.c b/02-usart/src/main.c
index 73ccb17..72b3fe7 100644
--- a/02-usart/src/main.c
+++ b/02-usart/src/main.c
@@ -3,19 +3,13 @@
#include "core/clock.h"
#include "core/dma.h"
#include "core/gpio.h"
-#include "core/isr_vector.h"
#include "core/system.h"
#include "core/usart.h"
-
#include "delay.h"
-#include "lib.h"
#include "mem.h"
#include "spin.h"
#include "string.h"
-
-#ifdef ARCH_STM32L4
-
/** Overrides the default systick irq handler. */
void on_systick()
{
@@ -33,12 +27,42 @@ void on_systick()
is_on = ! is_on;
}
+void setup_usart2(uint32_t baud_rate)
+{
+ __IO gpio_port_t* port_a = enable_gpio(GPIO_PORT_A);
+ enable_hsi(&RCC, true);
+
+ set_usart2_clock_src(&RCC, USART_CLK_SRC_HSI16);
+ set_usart2_clock_enabled(&RCC, USART_CLK_SRC_HSI16);
+
+ set_gpio_pin_mode(port_a, PIN_2, MODE_ALTERNATE);
+ set_gpio_pin_mode(port_a, PIN_15, MODE_ALTERNATE);
+ set_gpio_alternate_function(port_a, PIN_2, AFN_7);
+ set_gpio_alternate_function(port_a, PIN_15, AFN_3);
+
+ /* De-assert reset of USART2 */
+ regset(RCC.apb1rst1_r, rcc_usart2rst, 0);
+
+ USART2.c_r1 = 0;
+ USART2.c_r2 = 0;
+ USART2.c_r3 = 0;
+
+ usart_set_divisor(&USART2, 16000000 / baud_rate);
+}
+
+#ifdef ARCH_STM32L4
+
/* Main function. This gets executed from the interrupt vector defined above. */
int main()
{
/* Enable a higher clock frequency. */
set_system_clock_MHz(80);
+ setup_usart2(115200);
+ usart_set_enabled(&USART2, USART_ENABLE_TX | USART_ENABLE_RX);
+
+ usart_printf(&USART2, "Start Configuring Countdown!\n");
+
/* Set the countdown to start from 1,000,0000. */
SCB.strv_r = 10000000;
@@ -47,6 +71,8 @@ int main()
/* Start the systick. */
SCB.stcs_bf.enable = 1;
+
+ usart_printf(&USART2, "Start Countdown Started!\n");
}
#endif