Modification of mbed-src library only for STM32F030F4, very cheap microcontroller in 20-Pin TSSOP package, with 16Kbytes of Flash and 4Kbytes of Ram. **Target for online compilator must be Nucleo 32F030R8.** 01.02.2018 Acosinwork: Fork of mbed-STM32F030F4 library. Support for Troyka GPIO expander by Amperka. http://amperka.ru/product/troyka-gpio-expander

Fork of mbed-STM32F030F4 by Nothing Special

Committer:
acosinwork
Date:
Thu Feb 01 10:37:10 2018 +0000
Revision:
12:6f07dd7cbe47
Parent:
0:38ccae254a29
Change pin mapping and set internall oscillator as default. Fork to support Troyka GPIO expander (I2C I/O); http://amperka.ru/product/troyka-gpio-expander

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mega64 0:38ccae254a29 1 /* mbed Microcontroller Library
mega64 0:38ccae254a29 2 * Copyright (c) 2006-2013 ARM Limited
mega64 0:38ccae254a29 3 *
mega64 0:38ccae254a29 4 * Licensed under the Apache License, Version 2.0 (the "License");
mega64 0:38ccae254a29 5 * you may not use this file except in compliance with the License.
mega64 0:38ccae254a29 6 * You may obtain a copy of the License at
mega64 0:38ccae254a29 7 *
mega64 0:38ccae254a29 8 * http://www.apache.org/licenses/LICENSE-2.0
mega64 0:38ccae254a29 9 *
mega64 0:38ccae254a29 10 * Unless required by applicable law or agreed to in writing, software
mega64 0:38ccae254a29 11 * distributed under the License is distributed on an "AS IS" BASIS,
mega64 0:38ccae254a29 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mega64 0:38ccae254a29 13 * See the License for the specific language governing permissions and
mega64 0:38ccae254a29 14 * limitations under the License.
mega64 0:38ccae254a29 15 */
mega64 0:38ccae254a29 16 #include <stddef.h>
mega64 0:38ccae254a29 17 #include "us_ticker_api.h"
mega64 0:38ccae254a29 18 #include "cmsis.h"
mega64 0:38ccae254a29 19
mega64 0:38ccae254a29 20 static ticker_event_handler event_handler;
mega64 0:38ccae254a29 21 static ticker_event_t *head = NULL;
mega64 0:38ccae254a29 22
mega64 0:38ccae254a29 23 void us_ticker_set_handler(ticker_event_handler handler) {
mega64 0:38ccae254a29 24 us_ticker_init();
mega64 0:38ccae254a29 25
mega64 0:38ccae254a29 26 event_handler = handler;
mega64 0:38ccae254a29 27 }
mega64 0:38ccae254a29 28
mega64 0:38ccae254a29 29 void us_ticker_irq_handler(void) {
mega64 0:38ccae254a29 30 us_ticker_clear_interrupt();
mega64 0:38ccae254a29 31
mega64 0:38ccae254a29 32 /* Go through all the pending TimerEvents */
mega64 0:38ccae254a29 33 while (1) {
mega64 0:38ccae254a29 34 if (head == NULL) {
mega64 0:38ccae254a29 35 // There are no more TimerEvents left, so disable matches.
mega64 0:38ccae254a29 36 us_ticker_disable_interrupt();
mega64 0:38ccae254a29 37 return;
mega64 0:38ccae254a29 38 }
mega64 0:38ccae254a29 39
mega64 0:38ccae254a29 40 if ((int)(head->timestamp - us_ticker_read()) <= 0) {
mega64 0:38ccae254a29 41 // This event was in the past:
mega64 0:38ccae254a29 42 // point to the following one and execute its handler
mega64 0:38ccae254a29 43 ticker_event_t *p = head;
mega64 0:38ccae254a29 44 head = head->next;
mega64 0:38ccae254a29 45 if (event_handler != NULL) {
mega64 0:38ccae254a29 46 event_handler(p->id); // NOTE: the handler can set new events
mega64 0:38ccae254a29 47 }
mega64 0:38ccae254a29 48 /* Note: We continue back to examining the head because calling the
mega64 0:38ccae254a29 49 * event handler may have altered the chain of pending events. */
mega64 0:38ccae254a29 50 } else {
mega64 0:38ccae254a29 51 // This event and the following ones in the list are in the future:
mega64 0:38ccae254a29 52 // set it as next interrupt and return
mega64 0:38ccae254a29 53 us_ticker_set_interrupt(head->timestamp);
mega64 0:38ccae254a29 54 return;
mega64 0:38ccae254a29 55 }
mega64 0:38ccae254a29 56 }
mega64 0:38ccae254a29 57 }
mega64 0:38ccae254a29 58
mega64 0:38ccae254a29 59 void us_ticker_insert_event(ticker_event_t *obj, timestamp_t timestamp, uint32_t id) {
mega64 0:38ccae254a29 60 /* disable interrupts for the duration of the function */
mega64 0:38ccae254a29 61 __disable_irq();
mega64 0:38ccae254a29 62
mega64 0:38ccae254a29 63 // initialise our data
mega64 0:38ccae254a29 64 obj->timestamp = timestamp;
mega64 0:38ccae254a29 65 obj->id = id;
mega64 0:38ccae254a29 66
mega64 0:38ccae254a29 67 /* Go through the list until we either reach the end, or find
mega64 0:38ccae254a29 68 an element this should come before (which is possibly the
mega64 0:38ccae254a29 69 head). */
mega64 0:38ccae254a29 70 ticker_event_t *prev = NULL, *p = head;
mega64 0:38ccae254a29 71 while (p != NULL) {
mega64 0:38ccae254a29 72 /* check if we come before p */
mega64 0:38ccae254a29 73 if ((int)(timestamp - p->timestamp) <= 0) {
mega64 0:38ccae254a29 74 break;
mega64 0:38ccae254a29 75 }
mega64 0:38ccae254a29 76 /* go to the next element */
mega64 0:38ccae254a29 77 prev = p;
mega64 0:38ccae254a29 78 p = p->next;
mega64 0:38ccae254a29 79 }
mega64 0:38ccae254a29 80 /* if prev is NULL we're at the head */
mega64 0:38ccae254a29 81 if (prev == NULL) {
mega64 0:38ccae254a29 82 head = obj;
mega64 0:38ccae254a29 83 us_ticker_set_interrupt(timestamp);
mega64 0:38ccae254a29 84 } else {
mega64 0:38ccae254a29 85 prev->next = obj;
mega64 0:38ccae254a29 86 }
mega64 0:38ccae254a29 87 /* if we're at the end p will be NULL, which is correct */
mega64 0:38ccae254a29 88 obj->next = p;
mega64 0:38ccae254a29 89
mega64 0:38ccae254a29 90 __enable_irq();
mega64 0:38ccae254a29 91 }
mega64 0:38ccae254a29 92
mega64 0:38ccae254a29 93 void us_ticker_remove_event(ticker_event_t *obj) {
mega64 0:38ccae254a29 94 __disable_irq();
mega64 0:38ccae254a29 95
mega64 0:38ccae254a29 96 // remove this object from the list
mega64 0:38ccae254a29 97 if (head == obj) {
mega64 0:38ccae254a29 98 // first in the list, so just drop me
mega64 0:38ccae254a29 99 head = obj->next;
mega64 0:38ccae254a29 100 if (head == NULL) {
mega64 0:38ccae254a29 101 us_ticker_disable_interrupt();
mega64 0:38ccae254a29 102 } else {
mega64 0:38ccae254a29 103 us_ticker_set_interrupt(head->timestamp);
mega64 0:38ccae254a29 104 }
mega64 0:38ccae254a29 105 } else {
mega64 0:38ccae254a29 106 // find the object before me, then drop me
mega64 0:38ccae254a29 107 ticker_event_t* p = head;
mega64 0:38ccae254a29 108 while (p != NULL) {
mega64 0:38ccae254a29 109 if (p->next == obj) {
mega64 0:38ccae254a29 110 p->next = obj->next;
mega64 0:38ccae254a29 111 break;
mega64 0:38ccae254a29 112 }
mega64 0:38ccae254a29 113 p = p->next;
mega64 0:38ccae254a29 114 }
mega64 0:38ccae254a29 115 }
mega64 0:38ccae254a29 116
mega64 0:38ccae254a29 117 __enable_irq();
mega64 0:38ccae254a29 118 }