Here, alternative functions and classes for STM32. The program contains a class for the I2C software bus, a class for working with a watchdog timer and time delay functions based on DWT. All functions and classes use the HAL library. Functions and classes were written for the microcontroller stm32f103.

Dependencies:   Stm32F1xx_Alternative mbed

main.cpp

Committer:
Yar
Date:
2017-05-24
Revision:
0:a5f82a6b0d16

File content as of revision 0:a5f82a6b0d16:

#include "mbed.h"
#include "Stm32F1xxAlternative.hpp"


DigitalOut myled(LED1);

// Declare the legs of the microcontroller to work with the I2C software bus
#define _GPIO_Pin_9 (1<<9) // It is the 9 leg any port of the microcontroller
#define _GPIO_Pin_8 (1<<8) // It is the 8 leg any port of the microcontroller
// This is the class for working with the I2C software bus
// By default, the I2C frequency is 100 kHz
// In the example, the legs of the PC_9 microcontroller are used for SCL 
// and PC_8 for SDA (SCL port, SDA, port, SCL pin, SDA pin)
SoftwareI2C _i2c(GPIOC, GPIOC, _GPIO_Pin_9, _GPIO_Pin_8);


// Class for watchdog timer
#if (1)
// You can initialize as follows:
WatchdogTimer Watchdog(10.0);
#else
// Or you can initialize this way:
WatchdogTimer Watchdog();
#endif

// So you can find out the status of the watchdog timer
void WatchdogStatus(void) {
    switch (Watchdog.getStatus()) {
        case WatchdogTimer::RESET:       // IWDG not yet initialized or disabled
            printf("IWDG not yet initialized or disabled\r\n");
            break;
        case WatchdogTimer::READY:       // IWDG initialized and ready for use   
            printf("IIWDG initialized and ready for use\r\n");
            break;
        case WatchdogTimer::BUSY:        // IWDG internal process is ongoing 
            printf("IWDG internal process is ongoing\r\n");
            break;
        case WatchdogTimer::TIMEOUT:     // IWDG timeout state             
            printf("IWDG timeout state\r\n");
            break;
        case WatchdogTimer::ERROR:       // IWDG error state          
            printf("IWDG error state\r\n");
            break;
        default: 
            printf("Unknown state\r\n");
            break;
    }
}




int main() {
    #if (0)
    // You can pre-initialize an alternative time delay
    initializeTimeDelays();
    // Otherwise, initialization will be called automatically 
    // the first time you call the function delay_ms or delay_us
    #endif
    #if (0)
    // You can re-initialize the watchdog
    // The maximum time is 32 seconds
    Watchdog.setResponseTime_s(10);
    //Watchdog.setResponseTime_us(10000000);
    //Watchdog.setResponseTime_ms(10000);
    #endif
    // We get the state of the watchdog timer
    WatchdogStatus();
    // Run watchdog
    Watchdog.start();
    
    
    #if (1)
    // Example of using the software I2C
    uint8_t _addr = 0x4E;
    uint8_t _reg = 0x20;
    uint8_t _data = 0x55;
    _i2c.start(); // Signal start
    _i2c.write(_addr << 1); // Transfer the address of the device
    _i2c.write(_reg); // Transfer the number of the register
    _i2c.write(_data); // Write the data in the register
    _i2c.stop(); // 
    // You can also use this function
    // void write(uint8_t address, uint8_t* data, uint8_t length);
    #endif
    
    
    while(1) {
        myled = !myled;
        // This is an alternative delay for milliseconds
        // For microseconds, there is a function delay_us
        delay_ms(1000);
        // Update Watchdog
        // If this is not done, 
        // the watchdog timer will automatically reset the microcontroller
        Watchdog.refresh();
    }
}