95 lines
2.4 KiB
C
95 lines
2.4 KiB
C
#include <libopencm3/cm3/nvic.h>
|
|
#include <libopencm3/stm32/dbgmcu.h>
|
|
#include <libopencm3/stm32/gpio.h>
|
|
#include <libopencm3/stm32/rcc.h>
|
|
#include <libopencm3/stm32/timer.h>
|
|
#include <libopencm3/stm32/usart.h>
|
|
#include <libopencm3/usb/cdc.h>
|
|
#include <libopencm3/usb/usbd.h>
|
|
#include <libopencmsis/core_cm3.h>
|
|
#include "fifo.h"
|
|
#include "iobuffers.h"
|
|
#include "usb.h"
|
|
|
|
uint8_t tx_buffer[1024];
|
|
uint8_t rx_buffer[1024];
|
|
fifo tx_fifo;
|
|
fifo rx_fifo;
|
|
|
|
void stdio_init(void);
|
|
|
|
#ifdef STDIO_USB
|
|
usbd_device* usbd_dev;
|
|
|
|
void usb_hp_can_tx_isr(void){
|
|
usbd_poll(usbd_dev);
|
|
}
|
|
|
|
void usb_lp_can_rx0_isr(void){
|
|
usbd_poll(usbd_dev);
|
|
}
|
|
#endif
|
|
|
|
#ifdef STDIO_UART
|
|
void usart1_isr(void) {
|
|
uint8_t data;
|
|
|
|
/* RXNE interrupt handling */
|
|
if (((USART_CR1(USART1) & USART_CR1_RXNEIE) != 0) &&
|
|
((USART_SR(USART1) & USART_SR_RXNE) != 0)) {
|
|
|
|
data = usart_recv(USART1);
|
|
|
|
if(!fifoFull(&rx_fifo))
|
|
fifoPush(&rx_fifo, data);
|
|
}
|
|
|
|
/* TXE interrupt handling */
|
|
if (((USART_CR1(USART1) & USART_CR1_TXEIE) != 0) &&
|
|
((USART_SR(USART1) & USART_SR_TXE) != 0)) {
|
|
|
|
if(!fifoEmpty(&tx_fifo)){
|
|
data = fifoPop(&tx_fifo);
|
|
usart_send(USART1, data);
|
|
} else {
|
|
/* disable TXE interrupt if buffer empty */
|
|
USART_CR1(USART1) &= ~USART_CR1_TXEIE;
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif
|
|
void stdio_init(void) {
|
|
/* init data structures */
|
|
fifoInit(&tx_fifo, tx_buffer, 1024);
|
|
fifoInit(&rx_fifo, rx_buffer, 1024);
|
|
|
|
#ifdef STDIO_UART
|
|
/* usart configuration */
|
|
rcc_periph_clock_enable(RCC_USART1);
|
|
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ,
|
|
GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO_USART1_TX);
|
|
gpio_set_mode(GPIOA, GPIO_MODE_INPUT,
|
|
GPIO_CNF_INPUT_FLOAT, GPIO_USART1_RX);
|
|
usart_set_baudrate(USART1, 115200);
|
|
usart_set_databits(USART1, 8);
|
|
usart_set_stopbits(USART1, USART_STOPBITS_1);
|
|
usart_set_parity(USART1, USART_PARITY_NONE);
|
|
usart_set_flow_control(USART1, USART_FLOWCONTROL_NONE);
|
|
usart_set_mode(USART1, USART_MODE_TX_RX);
|
|
USART_CR1(USART1) |= USART_CR1_RXNEIE; // enable interrupt
|
|
usart_enable(USART1);
|
|
#endif
|
|
|
|
#ifdef STDIO_USB
|
|
/* usb configuration */
|
|
rcc_set_usbpre(RCC_CFGR_USBPRE_PLL_CLK_DIV1_5);
|
|
usbd_dev = usb_init();
|
|
usbd_poll(usbd_dev);
|
|
nvic_enable_irq(NVIC_USB_HP_CAN_TX_IRQ);
|
|
nvic_enable_irq(NVIC_USB_LP_CAN_RX0_IRQ);
|
|
nvic_set_priority(NVIC_USB_HP_CAN_TX_IRQ, 1);
|
|
nvic_set_priority(NVIC_USB_LP_CAN_RX0_IRQ, 1);
|
|
#endif
|
|
}
|