{
if (c == '\n')
ao_debug_out('\r');
- while (!(STM_USART1->usart_sr & (1 << STM_USART_SR_TXE)));
- STM_USART1->usart_dr = c;
+ while (!(stm_usart1.sr & (1 << STM_USART_SR_TXE)));
+ stm_usart1.dr = c;
+}
+
+void
+outbyte(char c)
+{
+ putchar(c);
}
-#if 0
static __xdata uint8_t ao_serial_tx1_started;
static void
!ao_serial_tx1_started)
{
ao_serial_tx1_started = 1;
- ao_fifo_remove(ao_usart1_tx_fifo, STM_USART1->usart_dr);
+ ao_fifo_remove(ao_usart1_tx_fifo, stm_usart1.dr);
}
}
-void usart1_isr(void)
+void stm_usart1_isr(void)
{
- if (STM_USART1->usart_sr & (1 << STM_USART_SR_RXNE)) {
+ uint32_t sr;
+ cli();
+ sr = stm_usart1.sr;
+ stm_usart1.sr = 0;
+ sei();
+ if (sr & (1 << STM_USART_SR_RXNE)) {
if (!ao_fifo_full(ao_usart1_rx_fifo))
- ao_fifo_insert(ao_usart1_rx_fifo, STM_USART1->usart_dr);
+ ao_fifo_insert(ao_usart1_rx_fifo, stm_usart1.dr);
ao_wakeup(&ao_usart1_rx_fifo);
#if USE_SERIAL_STDIN
ao_wakeup(&ao_stdin_ready);
#endif
}
- if (STM_USART1->usart_sr & (1 << STM_USART_SR_TXE)) {
+ if (sr & (1 << STM_USART_SR_TXE)) {
ao_serial_tx1_started = 0;
ao_serial_tx1_start();
ao_wakeup(&ao_usart1_tx_fifo);
sei();
}
-#endif
-
int _write(int file, char *ptr, int len)
{
int l = len;
return len;
}
-#define F_CPU 24000000
-
static const struct {
- uint32_t usart_brr;
+ uint32_t brr;
} ao_serial_speeds[] = {
[AO_SERIAL_SPEED_4800] = {
- (F_CPU * 16) / (16 * 4800)
+ STM_APB1 / 4800
},
[AO_SERIAL_SPEED_9600] = {
- (F_CPU * 16) / (16 * 9600)
+ STM_APB1 / 9600
},
[AO_SERIAL_SPEED_19200] = {
- (F_CPU * 16) / (16 * 19200)
+ STM_APB1 / 19200
},
[AO_SERIAL_SPEED_57600] = {
- (F_CPU * 16) / (16 * 57600)
+ STM_APB1 / 57600
},
};
#endif
if (speed > AO_SERIAL_SPEED_57600)
return;
- STM_USART1->usart_brr = ao_serial_speeds[speed].usart_brr;
+ stm_usart1.brr = ao_serial_speeds[speed].brr;
}
void
ao_serial_init(void)
{
- STM_USART1->usart_cr1 = ((0 << STM_USART_CR1_OVER8) |
- (1 << STM_USART_CR1_UE) |
- (0 << STM_USART_CR1_M) |
- (0 << STM_USART_CR1_WAKE) |
- (0 << STM_USART_CR1_PCE) |
- (0 << STM_USART_CR1_PS) |
- (0 << STM_USART_CR1_PEIE) |
- (0 << STM_USART_CR1_TXEIE) | /* XXX enable */
- (0 << STM_USART_CR1_TCIE) |
- (0 << STM_USART_CR1_RXNEIE) | /* XXX enable */
- (0 << STM_USART_CR1_IDLEIE) |
- (1 << STM_USART_CR1_TE) |
- (1 << STM_USART_CR1_RE) |
- (0 << STM_USART_CR1_RWU) |
- (0 << STM_USART_CR1_SBK));
-
- STM_USART1->usart_cr2 = 0;
- STM_USART1->usart_cr3 = 0;
+ stm_rcc.ahbenr |= (1 << STM_RCC_AHBENR_GPIOAEN);
+
+ stm_moder_set(&stm_gpioa, 9, STM_MODER_ALTERNATE);
+ stm_moder_set(&stm_gpioa, 10, STM_MODER_ALTERNATE);
+ stm_afr_set(&stm_gpioa, 9, STM_AFR_AF7);
+ stm_afr_set(&stm_gpioa, 10, STM_AFR_AF7);
+
+ /* Enable USART1 */
+ stm_rcc.apb2enr |= (1 << STM_RCC_APB2ENR_USART1EN);
+
+ stm_usart1.cr1 = ((0 << STM_USART_CR1_OVER8) |
+ (1 << STM_USART_CR1_UE) |
+ (0 << STM_USART_CR1_M) |
+ (0 << STM_USART_CR1_WAKE) |
+ (0 << STM_USART_CR1_PCE) |
+ (0 << STM_USART_CR1_PS) |
+ (0 << STM_USART_CR1_PEIE) |
+ (1 << STM_USART_CR1_TXEIE) |
+ (0 << STM_USART_CR1_TCIE) |
+ (1 << STM_USART_CR1_RXNEIE) |
+ (0 << STM_USART_CR1_IDLEIE) |
+ (1 << STM_USART_CR1_TE) |
+ (1 << STM_USART_CR1_RE) |
+ (0 << STM_USART_CR1_RWU) |
+ (0 << STM_USART_CR1_SBK));
+
+ stm_usart1.cr2 = ((0 << STM_USART_CR2_LINEN) |
+ (STM_USART_CR2_STOP_1 << STM_USART_CR2_STOP) |
+ (0 << STM_USART_CR2_CLKEN) |
+ (0 << STM_USART_CR2_CPOL) |
+ (0 << STM_USART_CR2_CPHA) |
+ (0 << STM_USART_CR2_LBCL) |
+ (0 << STM_USART_CR2_LBDIE) |
+ (0 << STM_USART_CR2_LBDL) |
+ (0 << STM_USART_CR2_ADD));
+
+ stm_usart1.cr3 = ((0 << STM_USART_CR3_ONEBITE) |
+ (0 << STM_USART_CR3_CTSIE) |
+ (0 << STM_USART_CR3_CTSE) |
+ (0 << STM_USART_CR3_RTSE) |
+ (0 << STM_USART_CR3_DMAT) |
+ (0 << STM_USART_CR3_DMAR) |
+ (0 << STM_USART_CR3_SCEN) |
+ (0 << STM_USART_CR3_NACK) |
+ (0 << STM_USART_CR3_HDSEL) |
+ (0 << STM_USART_CR3_IRLP) |
+ (0 << STM_USART_CR3_IREN) |
+ (0 << STM_USART_CR3_EIE));
/* Pick a 9600 baud rate */
ao_serial_set_speed(AO_SERIAL_SPEED_9600);
NULL);
#endif
#endif
+
+ stm_nvic_set_enable(STM_ISR_USART1_POS);
+ stm_nvic_set_priority(STM_ISR_USART1_POS, 4);
}