Modification of Mbed-dev library for LQFP48 package microcontrollers: STM32F103C8 (STM32F103C8T6) and STM32F103CB (STM32F103CBT6) (Bluepill boards, Maple mini etc. )

Fork of mbed-STM32F103C8_org by Nothing Special

Library for STM32F103C8 (Bluepill boards etc.).
Use this instead of mbed library.
This library allows the size of the code in the FLASH up to 128kB. Therefore, code also runs on microcontrollers STM32F103CB (eg. Maple mini).
But in the case of STM32F103C8, check the size of the resulting code would not exceed 64kB.

To compile a program with this library, use NUCLEO-F103RB as the target name. !

Changes:

  • Corrected initialization of the HSE + crystal clock (mbed permanent bug), allowing the use of on-board xtal (8MHz).(1)
  • Additionally, it also set USB clock (48Mhz).(2)
  • Definitions of pins and peripherals adjusted to LQFP48 case.
  • Board led LED1 is now PC_13 (3)
  • USER_BUTTON is now PC_14 (4)

    Now the library is complete rebuilt based on mbed-dev v160 (and not yet fully tested).

notes
(1) - In case 8MHz xtal on board, CPU frequency is 72MHz. Without xtal is 64MHz.
(2) - Using the USB interface is only possible if STM32 is clocking by on-board 8MHz xtal or external clock signal 8MHz on the OSC_IN pin.
(3) - On Bluepill board led operation is reversed, i.e. 0 - led on, 1 - led off.
(4) - Bluepill board has no real user button

Information

After export to SW4STM (AC6):

  • add line #include "mbed_config.h" in files Serial.h and RawSerial.h
  • in project properties change Optimisation Level to Optimise for size (-Os)
Committer:
mega64
Date:
Thu Apr 27 23:56:38 2017 +0000
Revision:
148:8b0b02bf146f
Parent:
146:03e976389d16
Remove unnecessary folders

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mega64 146:03e976389d16 1 /* mbed Microcontroller Library
mega64 146:03e976389d16 2 * Copyright (c) 2006-2013 ARM Limited
mega64 146:03e976389d16 3 *
mega64 146:03e976389d16 4 * Licensed under the Apache License, Version 2.0 (the "License");
mega64 146:03e976389d16 5 * you may not use this file except in compliance with the License.
mega64 146:03e976389d16 6 * You may obtain a copy of the License at
mega64 146:03e976389d16 7 *
mega64 146:03e976389d16 8 * http://www.apache.org/licenses/LICENSE-2.0
mega64 146:03e976389d16 9 *
mega64 146:03e976389d16 10 * Unless required by applicable law or agreed to in writing, software
mega64 146:03e976389d16 11 * distributed under the License is distributed on an "AS IS" BASIS,
mega64 146:03e976389d16 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mega64 146:03e976389d16 13 * See the License for the specific language governing permissions and
mega64 146:03e976389d16 14 * limitations under the License.
mega64 146:03e976389d16 15 */
mega64 146:03e976389d16 16 #ifndef MBED_CAN_H
mega64 146:03e976389d16 17 #define MBED_CAN_H
mega64 146:03e976389d16 18
mega64 146:03e976389d16 19 #include "platform/platform.h"
mega64 146:03e976389d16 20
mega64 146:03e976389d16 21 #if DEVICE_CAN
mega64 146:03e976389d16 22
mega64 146:03e976389d16 23 #include "hal/can_api.h"
mega64 146:03e976389d16 24 #include "platform/Callback.h"
mega64 146:03e976389d16 25 #include "platform/PlatformMutex.h"
mega64 146:03e976389d16 26
mega64 146:03e976389d16 27 namespace mbed {
mega64 146:03e976389d16 28 /** \addtogroup drivers */
mega64 146:03e976389d16 29 /** @{*/
mega64 146:03e976389d16 30
mega64 146:03e976389d16 31 /** CANMessage class
mega64 146:03e976389d16 32 *
mega64 146:03e976389d16 33 * @Note Synchronization level: Thread safe
mega64 146:03e976389d16 34 */
mega64 146:03e976389d16 35 class CANMessage : public CAN_Message {
mega64 146:03e976389d16 36
mega64 146:03e976389d16 37 public:
mega64 146:03e976389d16 38 /** Creates empty CAN message.
mega64 146:03e976389d16 39 */
mega64 146:03e976389d16 40 CANMessage() : CAN_Message() {
mega64 146:03e976389d16 41 len = 8;
mega64 146:03e976389d16 42 type = CANData;
mega64 146:03e976389d16 43 format = CANStandard;
mega64 146:03e976389d16 44 id = 0;
mega64 146:03e976389d16 45 memset(data, 0, 8);
mega64 146:03e976389d16 46 }
mega64 146:03e976389d16 47
mega64 146:03e976389d16 48 /** Creates CAN message with specific content.
mega64 146:03e976389d16 49 */
mega64 146:03e976389d16 50 CANMessage(int _id, const char *_data, char _len = 8, CANType _type = CANData, CANFormat _format = CANStandard) {
mega64 146:03e976389d16 51 len = _len & 0xF;
mega64 146:03e976389d16 52 type = _type;
mega64 146:03e976389d16 53 format = _format;
mega64 146:03e976389d16 54 id = _id;
mega64 146:03e976389d16 55 memcpy(data, _data, _len);
mega64 146:03e976389d16 56 }
mega64 146:03e976389d16 57
mega64 146:03e976389d16 58 /** Creates CAN remote message.
mega64 146:03e976389d16 59 */
mega64 146:03e976389d16 60 CANMessage(int _id, CANFormat _format = CANStandard) {
mega64 146:03e976389d16 61 len = 0;
mega64 146:03e976389d16 62 type = CANRemote;
mega64 146:03e976389d16 63 format = _format;
mega64 146:03e976389d16 64 id = _id;
mega64 146:03e976389d16 65 memset(data, 0, 8);
mega64 146:03e976389d16 66 }
mega64 146:03e976389d16 67 };
mega64 146:03e976389d16 68
mega64 146:03e976389d16 69 /** A can bus client, used for communicating with can devices
mega64 146:03e976389d16 70 */
mega64 146:03e976389d16 71 class CAN {
mega64 146:03e976389d16 72
mega64 146:03e976389d16 73 public:
mega64 146:03e976389d16 74 /** Creates an CAN interface connected to specific pins.
mega64 146:03e976389d16 75 *
mega64 146:03e976389d16 76 * @param rd read from transmitter
mega64 146:03e976389d16 77 * @param td transmit to transmitter
mega64 146:03e976389d16 78 *
mega64 146:03e976389d16 79 * Example:
mega64 146:03e976389d16 80 * @code
mega64 146:03e976389d16 81 * #include "mbed.h"
mega64 146:03e976389d16 82 *
mega64 146:03e976389d16 83 * Ticker ticker;
mega64 146:03e976389d16 84 * DigitalOut led1(LED1);
mega64 146:03e976389d16 85 * DigitalOut led2(LED2);
mega64 146:03e976389d16 86 * CAN can1(p9, p10);
mega64 146:03e976389d16 87 * CAN can2(p30, p29);
mega64 146:03e976389d16 88 *
mega64 146:03e976389d16 89 * char counter = 0;
mega64 146:03e976389d16 90 *
mega64 146:03e976389d16 91 * void send() {
mega64 146:03e976389d16 92 * if(can1.write(CANMessage(1337, &counter, 1))) {
mega64 146:03e976389d16 93 * printf("Message sent: %d\n", counter);
mega64 146:03e976389d16 94 * counter++;
mega64 146:03e976389d16 95 * }
mega64 146:03e976389d16 96 * led1 = !led1;
mega64 146:03e976389d16 97 * }
mega64 146:03e976389d16 98 *
mega64 146:03e976389d16 99 * int main() {
mega64 146:03e976389d16 100 * ticker.attach(&send, 1);
mega64 146:03e976389d16 101 * CANMessage msg;
mega64 146:03e976389d16 102 * while(1) {
mega64 146:03e976389d16 103 * if(can2.read(msg)) {
mega64 146:03e976389d16 104 * printf("Message received: %d\n\n", msg.data[0]);
mega64 146:03e976389d16 105 * led2 = !led2;
mega64 146:03e976389d16 106 * }
mega64 146:03e976389d16 107 * wait(0.2);
mega64 146:03e976389d16 108 * }
mega64 146:03e976389d16 109 * }
mega64 146:03e976389d16 110 * @endcode
mega64 146:03e976389d16 111 */
mega64 146:03e976389d16 112 CAN(PinName rd, PinName td);
mega64 146:03e976389d16 113 virtual ~CAN();
mega64 146:03e976389d16 114
mega64 146:03e976389d16 115 /** Set the frequency of the CAN interface
mega64 146:03e976389d16 116 *
mega64 146:03e976389d16 117 * @param hz The bus frequency in hertz
mega64 146:03e976389d16 118 *
mega64 146:03e976389d16 119 * @returns
mega64 146:03e976389d16 120 * 1 if successful,
mega64 146:03e976389d16 121 * 0 otherwise
mega64 146:03e976389d16 122 */
mega64 146:03e976389d16 123 int frequency(int hz);
mega64 146:03e976389d16 124
mega64 146:03e976389d16 125 /** Write a CANMessage to the bus.
mega64 146:03e976389d16 126 *
mega64 146:03e976389d16 127 * @param msg The CANMessage to write.
mega64 146:03e976389d16 128 *
mega64 146:03e976389d16 129 * @returns
mega64 146:03e976389d16 130 * 0 if write failed,
mega64 146:03e976389d16 131 * 1 if write was successful
mega64 146:03e976389d16 132 */
mega64 146:03e976389d16 133 int write(CANMessage msg);
mega64 146:03e976389d16 134
mega64 146:03e976389d16 135 /** Read a CANMessage from the bus.
mega64 146:03e976389d16 136 *
mega64 146:03e976389d16 137 * @param msg A CANMessage to read to.
mega64 146:03e976389d16 138 * @param handle message filter handle (0 for any message)
mega64 146:03e976389d16 139 *
mega64 146:03e976389d16 140 * @returns
mega64 146:03e976389d16 141 * 0 if no message arrived,
mega64 146:03e976389d16 142 * 1 if message arrived
mega64 146:03e976389d16 143 */
mega64 146:03e976389d16 144 int read(CANMessage &msg, int handle = 0);
mega64 146:03e976389d16 145
mega64 146:03e976389d16 146 /** Reset CAN interface.
mega64 146:03e976389d16 147 *
mega64 146:03e976389d16 148 * To use after error overflow.
mega64 146:03e976389d16 149 */
mega64 146:03e976389d16 150 void reset();
mega64 146:03e976389d16 151
mega64 146:03e976389d16 152 /** Puts or removes the CAN interface into silent monitoring mode
mega64 146:03e976389d16 153 *
mega64 146:03e976389d16 154 * @param silent boolean indicating whether to go into silent mode or not
mega64 146:03e976389d16 155 */
mega64 146:03e976389d16 156 void monitor(bool silent);
mega64 146:03e976389d16 157
mega64 146:03e976389d16 158 enum Mode {
mega64 146:03e976389d16 159 Reset = 0,
mega64 146:03e976389d16 160 Normal,
mega64 146:03e976389d16 161 Silent,
mega64 146:03e976389d16 162 LocalTest,
mega64 146:03e976389d16 163 GlobalTest,
mega64 146:03e976389d16 164 SilentTest
mega64 146:03e976389d16 165 };
mega64 146:03e976389d16 166
mega64 146:03e976389d16 167 /** Change CAN operation to the specified mode
mega64 146:03e976389d16 168 *
mega64 146:03e976389d16 169 * @param mode The new operation mode (CAN::Normal, CAN::Silent, CAN::LocalTest, CAN::GlobalTest, CAN::SilentTest)
mega64 146:03e976389d16 170 *
mega64 146:03e976389d16 171 * @returns
mega64 146:03e976389d16 172 * 0 if mode change failed or unsupported,
mega64 146:03e976389d16 173 * 1 if mode change was successful
mega64 146:03e976389d16 174 */
mega64 146:03e976389d16 175 int mode(Mode mode);
mega64 146:03e976389d16 176
mega64 146:03e976389d16 177 /** Filter out incomming messages
mega64 146:03e976389d16 178 *
mega64 146:03e976389d16 179 * @param id the id to filter on
mega64 146:03e976389d16 180 * @param mask the mask applied to the id
mega64 146:03e976389d16 181 * @param format format to filter on (Default CANAny)
mega64 146:03e976389d16 182 * @param handle message filter handle (Optional)
mega64 146:03e976389d16 183 *
mega64 146:03e976389d16 184 * @returns
mega64 146:03e976389d16 185 * 0 if filter change failed or unsupported,
mega64 146:03e976389d16 186 * new filter handle if successful
mega64 146:03e976389d16 187 */
mega64 146:03e976389d16 188 int filter(unsigned int id, unsigned int mask, CANFormat format = CANAny, int handle = 0);
mega64 146:03e976389d16 189
mega64 146:03e976389d16 190 /** Returns number of read errors to detect read overflow errors.
mega64 146:03e976389d16 191 */
mega64 146:03e976389d16 192 unsigned char rderror();
mega64 146:03e976389d16 193
mega64 146:03e976389d16 194 /** Returns number of write errors to detect write overflow errors.
mega64 146:03e976389d16 195 */
mega64 146:03e976389d16 196 unsigned char tderror();
mega64 146:03e976389d16 197
mega64 146:03e976389d16 198 enum IrqType {
mega64 146:03e976389d16 199 RxIrq = 0,
mega64 146:03e976389d16 200 TxIrq,
mega64 146:03e976389d16 201 EwIrq,
mega64 146:03e976389d16 202 DoIrq,
mega64 146:03e976389d16 203 WuIrq,
mega64 146:03e976389d16 204 EpIrq,
mega64 146:03e976389d16 205 AlIrq,
mega64 146:03e976389d16 206 BeIrq,
mega64 146:03e976389d16 207 IdIrq,
mega64 146:03e976389d16 208
mega64 146:03e976389d16 209 IrqCnt
mega64 146:03e976389d16 210 };
mega64 146:03e976389d16 211
mega64 146:03e976389d16 212 /** Attach a function to call whenever a CAN frame received interrupt is
mega64 146:03e976389d16 213 * generated.
mega64 146:03e976389d16 214 *
mega64 146:03e976389d16 215 * @param func A pointer to a void function, or 0 to set as none
mega64 146:03e976389d16 216 * @param event Which CAN interrupt to attach the member function to (CAN::RxIrq for message received, CAN::TxIrq for transmitted or aborted, CAN::EwIrq for error warning, CAN::DoIrq for data overrun, CAN::WuIrq for wake-up, CAN::EpIrq for error passive, CAN::AlIrq for arbitration lost, CAN::BeIrq for bus error)
mega64 146:03e976389d16 217 */
mega64 146:03e976389d16 218 void attach(Callback<void()> func, IrqType type=RxIrq);
mega64 146:03e976389d16 219
mega64 146:03e976389d16 220 /** Attach a member function to call whenever a CAN frame received interrupt
mega64 146:03e976389d16 221 * is generated.
mega64 146:03e976389d16 222 *
mega64 146:03e976389d16 223 * @param obj pointer to the object to call the member function on
mega64 146:03e976389d16 224 * @param method pointer to the member function to be called
mega64 146:03e976389d16 225 * @param event Which CAN interrupt to attach the member function to (CAN::RxIrq for message received, TxIrq for transmitted or aborted, EwIrq for error warning, DoIrq for data overrun, WuIrq for wake-up, EpIrq for error passive, AlIrq for arbitration lost, BeIrq for bus error)
mega64 146:03e976389d16 226 */
mega64 146:03e976389d16 227 template<typename T>
mega64 146:03e976389d16 228 void attach(T* obj, void (T::*method)(), IrqType type=RxIrq) {
mega64 146:03e976389d16 229 // Underlying call thread safe
mega64 146:03e976389d16 230 attach(Callback<void()>(obj, method), type);
mega64 146:03e976389d16 231 }
mega64 146:03e976389d16 232
mega64 146:03e976389d16 233 /** Attach a member function to call whenever a CAN frame received interrupt
mega64 146:03e976389d16 234 * is generated.
mega64 146:03e976389d16 235 *
mega64 146:03e976389d16 236 * @param obj pointer to the object to call the member function on
mega64 146:03e976389d16 237 * @param method pointer to the member function to be called
mega64 146:03e976389d16 238 * @param event Which CAN interrupt to attach the member function to (CAN::RxIrq for message received, TxIrq for transmitted or aborted, EwIrq for error warning, DoIrq for data overrun, WuIrq for wake-up, EpIrq for error passive, AlIrq for arbitration lost, BeIrq for bus error)
mega64 146:03e976389d16 239 */
mega64 146:03e976389d16 240 template<typename T>
mega64 146:03e976389d16 241 void attach(T* obj, void (*method)(T*), IrqType type=RxIrq) {
mega64 146:03e976389d16 242 // Underlying call thread safe
mega64 146:03e976389d16 243 attach(Callback<void()>(obj, method), type);
mega64 146:03e976389d16 244 }
mega64 146:03e976389d16 245
mega64 146:03e976389d16 246 static void _irq_handler(uint32_t id, CanIrqType type);
mega64 146:03e976389d16 247
mega64 146:03e976389d16 248 protected:
mega64 146:03e976389d16 249 virtual void lock();
mega64 146:03e976389d16 250 virtual void unlock();
mega64 146:03e976389d16 251 can_t _can;
mega64 146:03e976389d16 252 Callback<void()> _irq[IrqCnt];
mega64 146:03e976389d16 253 PlatformMutex _mutex;
mega64 146:03e976389d16 254 };
mega64 146:03e976389d16 255
mega64 146:03e976389d16 256 } // namespace mbed
mega64 146:03e976389d16 257
mega64 146:03e976389d16 258 #endif
mega64 146:03e976389d16 259
mega64 146:03e976389d16 260 #endif // MBED_CAN_H
mega64 146:03e976389d16 261
mega64 146:03e976389d16 262 /** @}*/