OpenBCI 32bit board variation with STM32L476 mircocontroller and mbed support

Dependencies:   mbed

Committer:
akpc806a
Date:
Sun Jan 22 04:10:11 2017 +0000
Revision:
1:4683702d7ad8
OpenBCI 32bit board variation with STM32L476 mircocontroller and mbed support. Version V2 of firmware, forked from the same official version for the PIC32 board.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
akpc806a 1:4683702d7ad8 1
akpc806a 1:4683702d7ad8 2 #include "mbed.h"
akpc806a 1:4683702d7ad8 3 #include "SerialBuffered.h"
akpc806a 1:4683702d7ad8 4
akpc806a 1:4683702d7ad8 5 //extern Serial loggerSerial;
akpc806a 1:4683702d7ad8 6
akpc806a 1:4683702d7ad8 7 SerialBuffered::SerialBuffered( size_t bufferSize, PinName tx, PinName rx, int baud ) : RawSerial( tx, rx, baud )
akpc806a 1:4683702d7ad8 8 {
akpc806a 1:4683702d7ad8 9 m_buffSize = 0;
akpc806a 1:4683702d7ad8 10 m_contentStart = 0;
akpc806a 1:4683702d7ad8 11 m_contentEnd = 0;
akpc806a 1:4683702d7ad8 12 m_timeout = 1.0;
akpc806a 1:4683702d7ad8 13
akpc806a 1:4683702d7ad8 14
akpc806a 1:4683702d7ad8 15 attach( this, &SerialBuffered::handleInterrupt );
akpc806a 1:4683702d7ad8 16
akpc806a 1:4683702d7ad8 17 m_buff = (uint8_t *) malloc( bufferSize );
akpc806a 1:4683702d7ad8 18 if( m_buff == NULL )
akpc806a 1:4683702d7ad8 19 {
akpc806a 1:4683702d7ad8 20 //loggerSerial.printf("SerialBuffered - failed to alloc buffer size %d\r\n", (int) bufferSize );
akpc806a 1:4683702d7ad8 21 }
akpc806a 1:4683702d7ad8 22 else
akpc806a 1:4683702d7ad8 23 {
akpc806a 1:4683702d7ad8 24 m_buffSize = bufferSize;
akpc806a 1:4683702d7ad8 25 }
akpc806a 1:4683702d7ad8 26 }
akpc806a 1:4683702d7ad8 27
akpc806a 1:4683702d7ad8 28
akpc806a 1:4683702d7ad8 29 SerialBuffered::~SerialBuffered()
akpc806a 1:4683702d7ad8 30 {
akpc806a 1:4683702d7ad8 31 if( m_buff )
akpc806a 1:4683702d7ad8 32 free( m_buff );
akpc806a 1:4683702d7ad8 33 }
akpc806a 1:4683702d7ad8 34
akpc806a 1:4683702d7ad8 35 void SerialBuffered::setTimeout( float seconds )
akpc806a 1:4683702d7ad8 36 {
akpc806a 1:4683702d7ad8 37 m_timeout = seconds;
akpc806a 1:4683702d7ad8 38 }
akpc806a 1:4683702d7ad8 39
akpc806a 1:4683702d7ad8 40 size_t SerialBuffered::readBytes( uint8_t *bytes, size_t requested )
akpc806a 1:4683702d7ad8 41 {
akpc806a 1:4683702d7ad8 42 int i = 0;
akpc806a 1:4683702d7ad8 43
akpc806a 1:4683702d7ad8 44 for( ; i < requested; )
akpc806a 1:4683702d7ad8 45 {
akpc806a 1:4683702d7ad8 46 int c = getc();
akpc806a 1:4683702d7ad8 47 if( c < 0 )
akpc806a 1:4683702d7ad8 48 break;
akpc806a 1:4683702d7ad8 49 bytes[i] = c;
akpc806a 1:4683702d7ad8 50 i++;
akpc806a 1:4683702d7ad8 51 }
akpc806a 1:4683702d7ad8 52
akpc806a 1:4683702d7ad8 53 return i;
akpc806a 1:4683702d7ad8 54
akpc806a 1:4683702d7ad8 55 }
akpc806a 1:4683702d7ad8 56
akpc806a 1:4683702d7ad8 57
akpc806a 1:4683702d7ad8 58 int SerialBuffered::getc()
akpc806a 1:4683702d7ad8 59 {
akpc806a 1:4683702d7ad8 60 m_timer.reset();
akpc806a 1:4683702d7ad8 61 m_timer.start();
akpc806a 1:4683702d7ad8 62 while( m_contentStart == m_contentEnd )
akpc806a 1:4683702d7ad8 63 {
akpc806a 1:4683702d7ad8 64
akpc806a 1:4683702d7ad8 65
akpc806a 1:4683702d7ad8 66 wait_ms( 1 );
akpc806a 1:4683702d7ad8 67 if( m_timeout > 0 && m_timer.read() > m_timeout )
akpc806a 1:4683702d7ad8 68 return EOF;
akpc806a 1:4683702d7ad8 69 }
akpc806a 1:4683702d7ad8 70
akpc806a 1:4683702d7ad8 71 m_timer.stop();
akpc806a 1:4683702d7ad8 72
akpc806a 1:4683702d7ad8 73 uint8_t result = m_buff[m_contentStart++];
akpc806a 1:4683702d7ad8 74 m_contentStart = m_contentStart % m_buffSize;
akpc806a 1:4683702d7ad8 75
akpc806a 1:4683702d7ad8 76
akpc806a 1:4683702d7ad8 77 return result;
akpc806a 1:4683702d7ad8 78 }
akpc806a 1:4683702d7ad8 79
akpc806a 1:4683702d7ad8 80
akpc806a 1:4683702d7ad8 81 int SerialBuffered::readable()
akpc806a 1:4683702d7ad8 82 {
akpc806a 1:4683702d7ad8 83 return m_contentStart != m_contentEnd ;
akpc806a 1:4683702d7ad8 84 }
akpc806a 1:4683702d7ad8 85
akpc806a 1:4683702d7ad8 86 #include "stm32l4xx_hal_def.h"
akpc806a 1:4683702d7ad8 87 #include "stm32l4xx_hal_uart.h"
akpc806a 1:4683702d7ad8 88
akpc806a 1:4683702d7ad8 89 void SerialBuffered::handleInterrupt()
akpc806a 1:4683702d7ad8 90 {
akpc806a 1:4683702d7ad8 91
akpc806a 1:4683702d7ad8 92 while( RawSerial::readable())
akpc806a 1:4683702d7ad8 93 {
akpc806a 1:4683702d7ad8 94 if( m_contentStart == (m_contentEnd +1) % m_buffSize)
akpc806a 1:4683702d7ad8 95 {
akpc806a 1:4683702d7ad8 96 //loggerSerial.printf("SerialBuffered - buffer overrun, data lost!\r\n" );
akpc806a 1:4683702d7ad8 97 RawSerial::getc();
akpc806a 1:4683702d7ad8 98 //UART_HandleTypeDef huart;
akpc806a 1:4683702d7ad8 99 //huart.Instance = (USART_TypeDef *)USART1_BASE;
akpc806a 1:4683702d7ad8 100 //__HAL_UART_CLEAR_FLAG(&huart, UART_FLAG_RXNE);
akpc806a 1:4683702d7ad8 101 //volatile uint32_t tmpval = huart.Instance->RDR;
akpc806a 1:4683702d7ad8 102
akpc806a 1:4683702d7ad8 103 //break;
akpc806a 1:4683702d7ad8 104
akpc806a 1:4683702d7ad8 105 }
akpc806a 1:4683702d7ad8 106 else
akpc806a 1:4683702d7ad8 107 {
akpc806a 1:4683702d7ad8 108
akpc806a 1:4683702d7ad8 109 m_buff[ m_contentEnd ++ ] = RawSerial::getc();
akpc806a 1:4683702d7ad8 110 m_contentEnd = m_contentEnd % m_buffSize;
akpc806a 1:4683702d7ad8 111
akpc806a 1:4683702d7ad8 112
akpc806a 1:4683702d7ad8 113
akpc806a 1:4683702d7ad8 114 }
akpc806a 1:4683702d7ad8 115 }
akpc806a 1:4683702d7ad8 116 }
akpc806a 1:4683702d7ad8 117