Advertisement
tehcmn

STM32F4 OpenCM3 USART example

Jun 25th, 2014
519
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.98 KB | None | 0 0
  1. #include <libopencm3/stm32/rcc.h>
  2. #include <libopencm3/stm32/gpio.h>
  3. #include <libopencm3/stm32/usart.h>
  4. #include <libopencm3/cm3/nvic.h>
  5.  
  6. int _write(int fd, char *str, int len);
  7.  
  8. static void setup(void)
  9. {
  10.     rcc_periph_clock_enable(RCC_USART2);
  11.     rcc_periph_clock_enable(RCC_GPIOA);
  12.     rcc_periph_clock_enable(RCC_GPIOD);
  13.    
  14.     nvic_enable_irq(NVIC_USART2_IRQ);
  15.    
  16.     gpio_mode_setup(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO2 | GPIO3);
  17.     gpio_mode_setup(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO12 | GPIO13);
  18.    
  19.     gpio_set_output_options(GPIOA, GPIO_OTYPE_OD, GPIO_OSPEED_25MHZ, GPIO3);
  20.    
  21.     gpio_set_af(GPIOA, GPIO_AF7, GPIO2);
  22.     gpio_set_af(GPIOA, GPIO_AF7, GPIO3);
  23.  
  24.     usart_set_baudrate(USART2, 115200);
  25.     usart_set_databits(USART2, 8);
  26.     usart_set_parity(USART2, USART_PARITY_NONE);
  27.     usart_set_stopbits(USART2, USART_STOPBITS_1);
  28.  
  29.     usart_set_flow_control(USART2, USART_FLOWCONTROL_NONE);
  30.     usart_set_mode(USART2, USART_MODE_TX_RX);
  31.  
  32.     usart_enable_rx_interrupt(USART2);
  33.  
  34.     usart_enable(USART2);
  35.    
  36.     _write(1, "Ready, waiting for interrupts.", 30);
  37. }
  38.  
  39. static void wait(int us)
  40. {
  41.     int i;
  42.     for(i=0; i<us; i++){
  43.         __asm__("nop");
  44.     }
  45. }
  46.  
  47. //syscall
  48. int _write(int fd, char *str, int len)
  49. {
  50.     int i;
  51.     for(i = 0; i < len; i++)
  52.     {
  53.         if(str[i] == '\n')
  54.             usart_send_blocking(USART2, '\r');
  55.         usart_send_blocking(USART2, str[i]);
  56.     }
  57.     return i;
  58. }
  59.  
  60. static void loop()
  61. {
  62.     _write(1, "I am busy waiting...\n", 22);
  63.     wait(1000000);
  64.     __asm__("nop");
  65. }
  66.  
  67. int main(void)
  68. {
  69.     setup();
  70.  
  71.     while (1) {
  72.         loop();
  73.     }
  74.  
  75.     return 0;
  76. }
  77.  
  78. #define USART_RXRDY(u) \
  79.         (((USART_CR1(u) & USART_CR1_RXNEIE) != 0) && \
  80.          ((USART_SR(u) & USART_SR_RXNE) != 0))
  81.  
  82.  
  83. void usart2_isr(void)
  84. {
  85.     if(USART_RXRDY(USART2))
  86.     {
  87.         gpio_set(GPIOD, GPIO12);
  88.         char data = 'a';
  89.         data = usart_recv(USART2);
  90.         if(data == 0x10)    //CR
  91.             data = 0x13;    //LF
  92.         _write(1,"IRQ: Recv: ", 11);
  93.         _write(1, &data, 1);
  94.         _write(1, "\n", 1);
  95.         wait(10000);
  96.         gpio_clear(GPIOD, GPIO12);
  97.     }
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement