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 /*
mega64 146:03e976389d16 2 * mbed Microcontroller Library
mega64 146:03e976389d16 3 * Copyright (c) 2006-2016 ARM Limited
mega64 146:03e976389d16 4 *
mega64 146:03e976389d16 5 * Licensed under the Apache License, Version 2.0 (the "License");
mega64 146:03e976389d16 6 * you may not use this file except in compliance with the License.
mega64 146:03e976389d16 7 * You may obtain a copy of the License at
mega64 146:03e976389d16 8 *
mega64 146:03e976389d16 9 * http://www.apache.org/licenses/LICENSE-2.0
mega64 146:03e976389d16 10 *
mega64 146:03e976389d16 11 * Unless required by applicable law or agreed to in writing, software
mega64 146:03e976389d16 12 * distributed under the License is distributed on an "AS IS" BASIS,
mega64 146:03e976389d16 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mega64 146:03e976389d16 14 * See the License for the specific language governing permissions and
mega64 146:03e976389d16 15 * limitations under the License.
mega64 146:03e976389d16 16 *
mega64 146:03e976389d16 17 */
mega64 146:03e976389d16 18
mega64 146:03e976389d16 19 #ifndef RETARGET_H
mega64 146:03e976389d16 20 #define RETARGET_H
mega64 146:03e976389d16 21
mega64 146:03e976389d16 22 #include <stdint.h>
mega64 146:03e976389d16 23 #include <stddef.h>
mega64 146:03e976389d16 24
mega64 146:03e976389d16 25 /* We can get the following standard types from sys/types for gcc, but we
mega64 146:03e976389d16 26 * need to define the types ourselves for the other compilers that normally
mega64 146:03e976389d16 27 * target embedded systems */
mega64 146:03e976389d16 28 #if defined(__ARMCC_VERSION) || defined(__ICCARM__)
mega64 146:03e976389d16 29 typedef int ssize_t; ///< Signed size type, usually encodes negative errors
mega64 146:03e976389d16 30 typedef long off_t; ///< Offset in a data stream
mega64 146:03e976389d16 31 typedef int mode_t; ///< Mode for opening files
mega64 146:03e976389d16 32
mega64 146:03e976389d16 33 #define O_RDONLY 0
mega64 146:03e976389d16 34 #define O_WRONLY 1
mega64 146:03e976389d16 35 #define O_RDWR 2
mega64 146:03e976389d16 36 #define O_CREAT 0x0200
mega64 146:03e976389d16 37 #define O_TRUNC 0x0400
mega64 146:03e976389d16 38 #define O_APPEND 0x0008
mega64 146:03e976389d16 39
mega64 146:03e976389d16 40 #define NAME_MAX 255 ///< Maximum size of a name in a file path
mega64 146:03e976389d16 41
mega64 146:03e976389d16 42 #else
mega64 146:03e976389d16 43 #include <sys/fcntl.h>
mega64 146:03e976389d16 44 #include <sys/types.h>
mega64 146:03e976389d16 45 #include <sys/syslimits.h>
mega64 146:03e976389d16 46 #endif
mega64 146:03e976389d16 47
mega64 146:03e976389d16 48
mega64 146:03e976389d16 49 /* DIR declarations must also be here */
mega64 146:03e976389d16 50 #if __cplusplus
mega64 146:03e976389d16 51 namespace mbed { class Dir; }
mega64 146:03e976389d16 52 typedef mbed::Dir DIR;
mega64 146:03e976389d16 53
mega64 146:03e976389d16 54 extern "C" {
mega64 146:03e976389d16 55 DIR *opendir(const char*);
mega64 146:03e976389d16 56 struct dirent *readdir(DIR *);
mega64 146:03e976389d16 57 int closedir(DIR*);
mega64 146:03e976389d16 58 void rewinddir(DIR*);
mega64 146:03e976389d16 59 long telldir(DIR*);
mega64 146:03e976389d16 60 void seekdir(DIR*, long);
mega64 146:03e976389d16 61 int mkdir(const char *name, mode_t n);
mega64 146:03e976389d16 62 };
mega64 146:03e976389d16 63 #endif
mega64 146:03e976389d16 64
mega64 146:03e976389d16 65
mega64 146:03e976389d16 66 #if defined(__ARMCC_VERSION) || defined(__ICCARM__)
mega64 146:03e976389d16 67 /* The intent of this section is to unify the errno error values to match
mega64 146:03e976389d16 68 * the POSIX definitions for the GCC_ARM, ARMCC and IAR compilers. This is
mega64 146:03e976389d16 69 * necessary because the ARMCC/IAR errno.h, or sys/stat.h are missing some
mega64 146:03e976389d16 70 * symbol definitions used by the POSIX filesystem API to return errno codes.
mega64 146:03e976389d16 71 * Note also that ARMCC errno.h defines some symbol values differently from
mega64 146:03e976389d16 72 * the GCC_ARM/IAR/standard POSIX definitions. The definitions guard against
mega64 146:03e976389d16 73 * this and future changes by changing the symbol definition as shown below. */
mega64 146:03e976389d16 74 #ifdef ENOENT
mega64 146:03e976389d16 75 #undef ENOENT
mega64 146:03e976389d16 76 #endif
mega64 146:03e976389d16 77 #define ENOENT 2 /* No such file or directory. */
mega64 146:03e976389d16 78
mega64 146:03e976389d16 79 #ifdef EIO
mega64 146:03e976389d16 80 #undef EIO
mega64 146:03e976389d16 81 #endif
mega64 146:03e976389d16 82 #define EIO 5 /* I/O error */
mega64 146:03e976389d16 83
mega64 146:03e976389d16 84 #ifdef ENXIO
mega64 146:03e976389d16 85 #undef ENXIO
mega64 146:03e976389d16 86 #endif
mega64 146:03e976389d16 87 #define ENXIO 6 /* No such device or address */
mega64 146:03e976389d16 88
mega64 146:03e976389d16 89 #ifdef ENOEXEC
mega64 146:03e976389d16 90 #undef ENOEXEC
mega64 146:03e976389d16 91 #endif
mega64 146:03e976389d16 92 #define ENOEXEC 8 /* Exec format error */
mega64 146:03e976389d16 93
mega64 146:03e976389d16 94 #ifdef EBADF
mega64 146:03e976389d16 95 #undef EBADF
mega64 146:03e976389d16 96 #endif
mega64 146:03e976389d16 97 #define EBADF 9 /* Bad file number */
mega64 146:03e976389d16 98
mega64 146:03e976389d16 99 #ifdef ENOMEM
mega64 146:03e976389d16 100 #undef ENOMEM
mega64 146:03e976389d16 101 #endif
mega64 146:03e976389d16 102 #define ENOMEM 12 /* Not enough space */
mega64 146:03e976389d16 103
mega64 146:03e976389d16 104 #ifdef EACCES
mega64 146:03e976389d16 105 #undef EACCES
mega64 146:03e976389d16 106 #endif
mega64 146:03e976389d16 107 #define EACCES 13 /* Permission denied */
mega64 146:03e976389d16 108
mega64 146:03e976389d16 109 #ifdef EFAULT
mega64 146:03e976389d16 110 #undef EFAULT
mega64 146:03e976389d16 111 #endif
mega64 146:03e976389d16 112 #define EFAULT 14 /* Bad address */
mega64 146:03e976389d16 113
mega64 146:03e976389d16 114 #ifdef EEXIST
mega64 146:03e976389d16 115 #undef EEXIST
mega64 146:03e976389d16 116 #endif
mega64 146:03e976389d16 117 #define EEXIST 17 /* File exists */
mega64 146:03e976389d16 118
mega64 146:03e976389d16 119 #ifdef EINVAL
mega64 146:03e976389d16 120 #undef EINVAL
mega64 146:03e976389d16 121 #endif
mega64 146:03e976389d16 122 #define EINVAL 22 /* Invalid argument */
mega64 146:03e976389d16 123
mega64 146:03e976389d16 124 #ifdef ENFILE
mega64 146:03e976389d16 125 #undef ENFILE
mega64 146:03e976389d16 126 #endif
mega64 146:03e976389d16 127 #define ENFILE 23 /* Too many open files in system */
mega64 146:03e976389d16 128
mega64 146:03e976389d16 129 #ifdef EMFILE
mega64 146:03e976389d16 130 #undef EMFILE
mega64 146:03e976389d16 131 #endif
mega64 146:03e976389d16 132 #define EMFILE 24 /* File descriptor value too large */
mega64 146:03e976389d16 133
mega64 146:03e976389d16 134 #ifdef ENOSYS
mega64 146:03e976389d16 135 #undef ENOSYS
mega64 146:03e976389d16 136 #endif
mega64 146:03e976389d16 137 #define ENOSYS 38 /* Function not implemented */
mega64 146:03e976389d16 138
mega64 146:03e976389d16 139 /* Missing stat.h defines.
mega64 146:03e976389d16 140 * The following are sys/stat.h definitions not currently present in the ARMCC
mega64 146:03e976389d16 141 * errno.h. Note, ARMCC errno.h defines some symbol values differing from
mega64 146:03e976389d16 142 * GCC_ARM/IAR/standard POSIX definitions. Guard against this and future
mega64 146:03e976389d16 143 * changes by changing the symbol definition for filesystem use. */
mega64 146:03e976389d16 144 #define _IFDIR 0040000 /* directory */
mega64 146:03e976389d16 145 #define _IFREG 0100000 /* regular */
mega64 146:03e976389d16 146
mega64 146:03e976389d16 147 #define S_IFDIR _IFDIR
mega64 146:03e976389d16 148 #define S_IFREG _IFREG
mega64 146:03e976389d16 149
mega64 146:03e976389d16 150 #define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR)
mega64 146:03e976389d16 151 #define S_IRUSR 0000400 /* read permission, owner */
mega64 146:03e976389d16 152 #define S_IWUSR 0000200 /* write permission, owner */
mega64 146:03e976389d16 153 #define S_IXUSR 0000100/* execute/search permission, owner */
mega64 146:03e976389d16 154 #define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP)
mega64 146:03e976389d16 155 #define S_IRGRP 0000040 /* read permission, group */
mega64 146:03e976389d16 156 #define S_IWGRP 0000020 /* write permission, grougroup */
mega64 146:03e976389d16 157 #define S_IXGRP 0000010/* execute/search permission, group */
mega64 146:03e976389d16 158 #define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH)
mega64 146:03e976389d16 159 #define S_IROTH 0000004 /* read permission, other */
mega64 146:03e976389d16 160 #define S_IWOTH 0000002 /* write permission, other */
mega64 146:03e976389d16 161 #define S_IXOTH 0000001/* execute/search permission, other */
mega64 146:03e976389d16 162
mega64 146:03e976389d16 163 #endif /* defined(__ARMCC_VERSION) || defined(__ICCARM__) */
mega64 146:03e976389d16 164
mega64 146:03e976389d16 165
mega64 146:03e976389d16 166 /* The following are dirent.h definitions are declared here to garuntee
mega64 146:03e976389d16 167 * consistency where structure may be different with different toolchains */
mega64 146:03e976389d16 168 struct dirent {
mega64 146:03e976389d16 169 char d_name[NAME_MAX+1];
mega64 146:03e976389d16 170 uint8_t d_type;
mega64 146:03e976389d16 171 };
mega64 146:03e976389d16 172
mega64 146:03e976389d16 173 enum {
mega64 146:03e976389d16 174 DT_UNKNOWN, // The file type could not be determined.
mega64 146:03e976389d16 175 DT_FIFO, // This is a named pipe (FIFO).
mega64 146:03e976389d16 176 DT_CHR, // This is a character device.
mega64 146:03e976389d16 177 DT_DIR, // This is a directory.
mega64 146:03e976389d16 178 DT_BLK, // This is a block device.
mega64 146:03e976389d16 179 DT_REG, // This is a regular file.
mega64 146:03e976389d16 180 DT_LNK, // This is a symbolic link.
mega64 146:03e976389d16 181 DT_SOCK, // This is a UNIX domain socket.
mega64 146:03e976389d16 182 };
mega64 146:03e976389d16 183
mega64 146:03e976389d16 184
mega64 146:03e976389d16 185 #endif /* RETARGET_H */