mbed-dev library fork for STM32F100R6 microcontroller (LQFP64, 24MHz, 32kB flash, 4kB ram, 2-channel DAC, HDMI CEC, very cheap) . Use in online compiler (instead mbed library) with selected platform Nucleo F103RB.

Fork of mbed-dev by mbed official




Tested and working:

  • blink
  • system frequency 24Mhz (with external xtal 8Mhz)
  • stdio uart on pins PA_2-PA_3
  • Serial on pins PA_9-PA_10
  • AnalogOut on pins PA_4, PA_5 (DAC)
  • AnalogIn on pins PA_0, PA_1, PA_2, PA_3, PA_4, PA_5, PA_6, PA_7, PB_0, PB_1, PC_0, PC_1, PC_2, PC_3, PC_5, PC_5


    Notes:
  • TIM2 is used for mbed needs (eq Timer, Ticker, wait etc. )




    Simple test program:

    Import programtestF100R6

    simple tests for STM32F100R6 microcontroller with dedicated library

Committer:
mega64
Date:
Sun Mar 19 23:16:34 2017 +0000
Revision:
51:25d18ad142c8
Parent:
50:d2a4a5ee894a
fixed incompatibility with the modified mbed environment Ch.n+1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 /* mbed Microcontroller Library
bogdanm 0:9b334a45a8ff 2 * Copyright (c) 2006-2013 ARM Limited
bogdanm 0:9b334a45a8ff 3 *
bogdanm 0:9b334a45a8ff 4 * Licensed under the Apache License, Version 2.0 (the "License");
bogdanm 0:9b334a45a8ff 5 * you may not use this file except in compliance with the License.
bogdanm 0:9b334a45a8ff 6 * You may obtain a copy of the License at
bogdanm 0:9b334a45a8ff 7 *
bogdanm 0:9b334a45a8ff 8 * http://www.apache.org/licenses/LICENSE-2.0
bogdanm 0:9b334a45a8ff 9 *
bogdanm 0:9b334a45a8ff 10 * Unless required by applicable law or agreed to in writing, software
bogdanm 0:9b334a45a8ff 11 * distributed under the License is distributed on an "AS IS" BASIS,
bogdanm 0:9b334a45a8ff 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
bogdanm 0:9b334a45a8ff 13 * See the License for the specific language governing permissions and
bogdanm 0:9b334a45a8ff 14 * limitations under the License.
bogdanm 0:9b334a45a8ff 15 */
bogdanm 0:9b334a45a8ff 16 #include "SerialBase.h"
bogdanm 0:9b334a45a8ff 17 #include "wait_api.h"
bogdanm 0:9b334a45a8ff 18
mega64 50:d2a4a5ee894a 19 // for 100F6 not implemented (N.S.)
mega64 50:d2a4a5ee894a 20 #undef DEVICE_SERIAL_ASYNCH
mega64 50:d2a4a5ee894a 21
mega64 50:d2a4a5ee894a 22 // for 100F6 not implemented (N.S.)
mega64 50:d2a4a5ee894a 23 #undef DEVICE_SERIAL_FC
mega64 50:d2a4a5ee894a 24
mega64 50:d2a4a5ee894a 25
mega64 50:d2a4a5ee894a 26
bogdanm 0:9b334a45a8ff 27 #if DEVICE_SERIAL
bogdanm 0:9b334a45a8ff 28
bogdanm 0:9b334a45a8ff 29 namespace mbed {
bogdanm 0:9b334a45a8ff 30
bogdanm 0:9b334a45a8ff 31 SerialBase::SerialBase(PinName tx, PinName rx) :
bogdanm 0:9b334a45a8ff 32 #if DEVICE_SERIAL_ASYNCH
bogdanm 0:9b334a45a8ff 33 _thunk_irq(this), _tx_usage(DMA_USAGE_NEVER),
bogdanm 0:9b334a45a8ff 34 _rx_usage(DMA_USAGE_NEVER),
bogdanm 0:9b334a45a8ff 35 #endif
bogdanm 0:9b334a45a8ff 36 _serial(), _baud(9600) {
bogdanm 0:9b334a45a8ff 37 serial_init(&_serial, tx, rx);
bogdanm 0:9b334a45a8ff 38 serial_irq_handler(&_serial, SerialBase::_irq_handler, (uint32_t)this);
bogdanm 0:9b334a45a8ff 39 }
bogdanm 0:9b334a45a8ff 40
bogdanm 0:9b334a45a8ff 41 void SerialBase::baud(int baudrate) {
bogdanm 0:9b334a45a8ff 42 serial_baud(&_serial, baudrate);
bogdanm 0:9b334a45a8ff 43 _baud = baudrate;
bogdanm 0:9b334a45a8ff 44 }
bogdanm 0:9b334a45a8ff 45
bogdanm 0:9b334a45a8ff 46 void SerialBase::format(int bits, Parity parity, int stop_bits) {
bogdanm 0:9b334a45a8ff 47 serial_format(&_serial, bits, (SerialParity)parity, stop_bits);
bogdanm 0:9b334a45a8ff 48 }
bogdanm 0:9b334a45a8ff 49
bogdanm 0:9b334a45a8ff 50 int SerialBase::readable() {
bogdanm 0:9b334a45a8ff 51 return serial_readable(&_serial);
bogdanm 0:9b334a45a8ff 52 }
bogdanm 0:9b334a45a8ff 53
bogdanm 0:9b334a45a8ff 54
bogdanm 0:9b334a45a8ff 55 int SerialBase::writeable() {
bogdanm 0:9b334a45a8ff 56 return serial_writable(&_serial);
bogdanm 0:9b334a45a8ff 57 }
bogdanm 0:9b334a45a8ff 58
bogdanm 0:9b334a45a8ff 59 void SerialBase::attach(void (*fptr)(void), IrqType type) {
bogdanm 0:9b334a45a8ff 60 if (fptr) {
bogdanm 0:9b334a45a8ff 61 _irq[type].attach(fptr);
bogdanm 0:9b334a45a8ff 62 serial_irq_set(&_serial, (SerialIrq)type, 1);
bogdanm 0:9b334a45a8ff 63 } else {
bogdanm 0:9b334a45a8ff 64 serial_irq_set(&_serial, (SerialIrq)type, 0);
bogdanm 0:9b334a45a8ff 65 }
bogdanm 0:9b334a45a8ff 66 }
bogdanm 0:9b334a45a8ff 67
bogdanm 0:9b334a45a8ff 68 void SerialBase::_irq_handler(uint32_t id, SerialIrq irq_type) {
bogdanm 0:9b334a45a8ff 69 SerialBase *handler = (SerialBase*)id;
bogdanm 0:9b334a45a8ff 70 handler->_irq[irq_type].call();
bogdanm 0:9b334a45a8ff 71 }
bogdanm 0:9b334a45a8ff 72
bogdanm 0:9b334a45a8ff 73 int SerialBase::_base_getc() {
bogdanm 0:9b334a45a8ff 74 return serial_getc(&_serial);
bogdanm 0:9b334a45a8ff 75 }
bogdanm 0:9b334a45a8ff 76
bogdanm 0:9b334a45a8ff 77 int SerialBase::_base_putc(int c) {
bogdanm 0:9b334a45a8ff 78 serial_putc(&_serial, c);
bogdanm 0:9b334a45a8ff 79 return c;
bogdanm 0:9b334a45a8ff 80 }
bogdanm 0:9b334a45a8ff 81
bogdanm 0:9b334a45a8ff 82 void SerialBase::send_break() {
bogdanm 0:9b334a45a8ff 83 // Wait for 1.5 frames before clearing the break condition
bogdanm 0:9b334a45a8ff 84 // This will have different effects on our platforms, but should
bogdanm 0:9b334a45a8ff 85 // ensure that we keep the break active for at least one frame.
bogdanm 0:9b334a45a8ff 86 // We consider a full frame (1 start bit + 8 data bits bits +
bogdanm 0:9b334a45a8ff 87 // 1 parity bit + 2 stop bits = 12 bits) for computation.
bogdanm 0:9b334a45a8ff 88 // One bit time (in us) = 1000000/_baud
bogdanm 0:9b334a45a8ff 89 // Twelve bits: 12000000/baud delay
bogdanm 0:9b334a45a8ff 90 // 1.5 frames: 18000000/baud delay
bogdanm 0:9b334a45a8ff 91 serial_break_set(&_serial);
bogdanm 0:9b334a45a8ff 92 wait_us(18000000/_baud);
bogdanm 0:9b334a45a8ff 93 serial_break_clear(&_serial);
bogdanm 0:9b334a45a8ff 94 }
bogdanm 0:9b334a45a8ff 95
bogdanm 0:9b334a45a8ff 96 #if DEVICE_SERIAL_FC
bogdanm 0:9b334a45a8ff 97 void SerialBase::set_flow_control(Flow type, PinName flow1, PinName flow2) {
bogdanm 0:9b334a45a8ff 98 FlowControl flow_type = (FlowControl)type;
bogdanm 0:9b334a45a8ff 99 switch(type) {
bogdanm 0:9b334a45a8ff 100 case RTS:
bogdanm 0:9b334a45a8ff 101 serial_set_flow_control(&_serial, flow_type, flow1, NC);
bogdanm 0:9b334a45a8ff 102 break;
bogdanm 0:9b334a45a8ff 103
bogdanm 0:9b334a45a8ff 104 case CTS:
bogdanm 0:9b334a45a8ff 105 serial_set_flow_control(&_serial, flow_type, NC, flow1);
bogdanm 0:9b334a45a8ff 106 break;
bogdanm 0:9b334a45a8ff 107
bogdanm 0:9b334a45a8ff 108 case RTSCTS:
bogdanm 0:9b334a45a8ff 109 case Disabled:
bogdanm 0:9b334a45a8ff 110 serial_set_flow_control(&_serial, flow_type, flow1, flow2);
bogdanm 0:9b334a45a8ff 111 break;
bogdanm 0:9b334a45a8ff 112
bogdanm 0:9b334a45a8ff 113 default:
bogdanm 0:9b334a45a8ff 114 break;
bogdanm 0:9b334a45a8ff 115 }
bogdanm 0:9b334a45a8ff 116 }
bogdanm 0:9b334a45a8ff 117 #endif
bogdanm 0:9b334a45a8ff 118
bogdanm 0:9b334a45a8ff 119 #if DEVICE_SERIAL_ASYNCH
bogdanm 0:9b334a45a8ff 120
bogdanm 0:9b334a45a8ff 121 int SerialBase::write(const uint8_t *buffer, int length, const event_callback_t& callback, int event)
bogdanm 0:9b334a45a8ff 122 {
bogdanm 0:9b334a45a8ff 123 if (serial_tx_active(&_serial)) {
bogdanm 0:9b334a45a8ff 124 return -1; // transaction ongoing
bogdanm 0:9b334a45a8ff 125 }
bogdanm 0:9b334a45a8ff 126 start_write((void *)buffer, length, 8, callback, event);
bogdanm 0:9b334a45a8ff 127 return 0;
bogdanm 0:9b334a45a8ff 128 }
bogdanm 0:9b334a45a8ff 129
bogdanm 0:9b334a45a8ff 130 int SerialBase::write(const uint16_t *buffer, int length, const event_callback_t& callback, int event)
bogdanm 0:9b334a45a8ff 131 {
bogdanm 0:9b334a45a8ff 132 if (serial_tx_active(&_serial)) {
bogdanm 0:9b334a45a8ff 133 return -1; // transaction ongoing
bogdanm 0:9b334a45a8ff 134 }
bogdanm 0:9b334a45a8ff 135 start_write((void *)buffer, length, 16, callback, event);
bogdanm 0:9b334a45a8ff 136 return 0;
bogdanm 0:9b334a45a8ff 137 }
bogdanm 0:9b334a45a8ff 138
bogdanm 0:9b334a45a8ff 139 void SerialBase::start_write(const void *buffer, int buffer_size, char buffer_width, const event_callback_t& callback, int event)
bogdanm 0:9b334a45a8ff 140 {
bogdanm 0:9b334a45a8ff 141 _tx_callback = callback;
bogdanm 0:9b334a45a8ff 142
bogdanm 0:9b334a45a8ff 143 _thunk_irq.callback(&SerialBase::interrupt_handler_asynch);
bogdanm 0:9b334a45a8ff 144 serial_tx_asynch(&_serial, buffer, buffer_size, buffer_width, _thunk_irq.entry(), event, _tx_usage);
bogdanm 0:9b334a45a8ff 145 }
bogdanm 0:9b334a45a8ff 146
bogdanm 0:9b334a45a8ff 147 void SerialBase::abort_write(void)
bogdanm 0:9b334a45a8ff 148 {
bogdanm 0:9b334a45a8ff 149 serial_tx_abort_asynch(&_serial);
bogdanm 0:9b334a45a8ff 150 }
bogdanm 0:9b334a45a8ff 151
bogdanm 0:9b334a45a8ff 152 void SerialBase::abort_read(void)
bogdanm 0:9b334a45a8ff 153 {
bogdanm 0:9b334a45a8ff 154 serial_rx_abort_asynch(&_serial);
bogdanm 0:9b334a45a8ff 155 }
bogdanm 0:9b334a45a8ff 156
bogdanm 0:9b334a45a8ff 157 int SerialBase::set_dma_usage_tx(DMAUsage usage)
bogdanm 0:9b334a45a8ff 158 {
bogdanm 0:9b334a45a8ff 159 if (serial_tx_active(&_serial)) {
bogdanm 0:9b334a45a8ff 160 return -1;
bogdanm 0:9b334a45a8ff 161 }
bogdanm 0:9b334a45a8ff 162 _tx_usage = usage;
bogdanm 0:9b334a45a8ff 163 return 0;
bogdanm 0:9b334a45a8ff 164 }
bogdanm 0:9b334a45a8ff 165
bogdanm 0:9b334a45a8ff 166 int SerialBase::set_dma_usage_rx(DMAUsage usage)
bogdanm 0:9b334a45a8ff 167 {
bogdanm 0:9b334a45a8ff 168 if (serial_tx_active(&_serial)) {
bogdanm 0:9b334a45a8ff 169 return -1;
bogdanm 0:9b334a45a8ff 170 }
bogdanm 0:9b334a45a8ff 171 _rx_usage = usage;
bogdanm 0:9b334a45a8ff 172 return 0;
bogdanm 0:9b334a45a8ff 173 }
bogdanm 0:9b334a45a8ff 174
bogdanm 0:9b334a45a8ff 175 int SerialBase::read(uint8_t *buffer, int length, const event_callback_t& callback, int event, unsigned char char_match)
bogdanm 0:9b334a45a8ff 176 {
bogdanm 0:9b334a45a8ff 177 if (serial_rx_active(&_serial)) {
bogdanm 0:9b334a45a8ff 178 return -1; // transaction ongoing
bogdanm 0:9b334a45a8ff 179 }
bogdanm 0:9b334a45a8ff 180 start_read((void*)buffer, length, 8, callback, event, char_match);
bogdanm 0:9b334a45a8ff 181 return 0;
bogdanm 0:9b334a45a8ff 182 }
bogdanm 0:9b334a45a8ff 183
bogdanm 0:9b334a45a8ff 184
bogdanm 0:9b334a45a8ff 185 int SerialBase::read(uint16_t *buffer, int length, const event_callback_t& callback, int event, unsigned char char_match)
bogdanm 0:9b334a45a8ff 186 {
bogdanm 0:9b334a45a8ff 187 if (serial_rx_active(&_serial)) {
bogdanm 0:9b334a45a8ff 188 return -1; // transaction ongoing
bogdanm 0:9b334a45a8ff 189 }
bogdanm 0:9b334a45a8ff 190 start_read((void*)buffer, length, 16, callback, event, char_match);
bogdanm 0:9b334a45a8ff 191 return 0;
bogdanm 0:9b334a45a8ff 192 }
bogdanm 0:9b334a45a8ff 193
bogdanm 0:9b334a45a8ff 194
bogdanm 0:9b334a45a8ff 195 void SerialBase::start_read(void *buffer, int buffer_size, char buffer_width, const event_callback_t& callback, int event, unsigned char char_match)
bogdanm 0:9b334a45a8ff 196 {
bogdanm 0:9b334a45a8ff 197 _rx_callback = callback;
bogdanm 0:9b334a45a8ff 198 _thunk_irq.callback(&SerialBase::interrupt_handler_asynch);
bogdanm 0:9b334a45a8ff 199 serial_rx_asynch(&_serial, buffer, buffer_size, buffer_width, _thunk_irq.entry(), event, char_match, _rx_usage);
bogdanm 0:9b334a45a8ff 200 }
bogdanm 0:9b334a45a8ff 201
bogdanm 0:9b334a45a8ff 202 void SerialBase::interrupt_handler_asynch(void)
bogdanm 0:9b334a45a8ff 203 {
bogdanm 0:9b334a45a8ff 204 int event = serial_irq_handler_asynch(&_serial);
bogdanm 0:9b334a45a8ff 205 int rx_event = event & SERIAL_EVENT_RX_MASK;
bogdanm 0:9b334a45a8ff 206 if (_rx_callback && rx_event) {
bogdanm 0:9b334a45a8ff 207 _rx_callback.call(rx_event);
bogdanm 0:9b334a45a8ff 208 }
bogdanm 0:9b334a45a8ff 209
bogdanm 0:9b334a45a8ff 210 int tx_event = event & SERIAL_EVENT_TX_MASK;
bogdanm 0:9b334a45a8ff 211 if (_tx_callback && tx_event) {
bogdanm 0:9b334a45a8ff 212 _tx_callback.call(tx_event);
bogdanm 0:9b334a45a8ff 213 }
bogdanm 0:9b334a45a8ff 214 }
bogdanm 0:9b334a45a8ff 215
bogdanm 0:9b334a45a8ff 216 #endif
bogdanm 0:9b334a45a8ff 217
bogdanm 0:9b334a45a8ff 218 } // namespace mbed
bogdanm 0:9b334a45a8ff 219
bogdanm 0:9b334a45a8ff 220 #endif