Skip to content

Commit

Permalink
[examples] Add example with TinyUSB and FreeRTOS (for Nucleo-F429ZI)
Browse files Browse the repository at this point in the history
  • Loading branch information
rleh committed Jan 31, 2022
1 parent aa24f4a commit 3f3ff3d
Show file tree
Hide file tree
Showing 2 changed files with 118 additions and 0 deletions.
101 changes: 101 additions & 0 deletions examples/nucleo_f429zi/usb_freertos/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
/*
* Copyright (c) 2022, Raphael Lehmann
*
* This file is part of the modm project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
// ----------------------------------------------------------------------------

#include <tusb.h>

#include <modm/board.hpp>
#include <modm/processing/rtos.hpp>
#include <modm/processing/timer/periodic_timer.hpp>

using namespace Board;

class SomeTask : modm::rtos::Thread
{
public:
SomeTask() : Thread(2, 2048, "some_task") {}

void
run()
{
modm::PeriodicTimer tmr{2.5s};
uint8_t counter{0};

while (1)
{
if (tmr.execute())
{
MODM_LOG_INFO << "SomeTask: Hello via Uart, counter=" << (counter++) << modm::endl;
}

vTaskDelay(1);
}

vTaskDelete(0);
}
};

class UsbTask : modm::rtos::Thread
{
public:
UsbTask() : Thread(1, 2048, "usb_task"), usb_io_device0{}, usb_stream0{usb_io_device0} {}

void
run()
{
MODM_LOG_INFO << "USBTask: Calling Board::initializeUsbFs() ..." << modm::endl;
Board::initializeUsbFs(4);
MODM_LOG_INFO << "USBTask: Calling tusb_init() ..." << modm::endl;
tusb_init();
MODM_LOG_INFO << "... done!" << modm::endl;

modm::PeriodicTimer tmr{2.5s};
uint8_t counter{0};

while (1)
{
tud_task();
if (tmr.execute())
{
MODM_LOG_INFO << "UsbTask: Hello via Uart, counter=" << counter << modm::endl;
usb_stream0 << "UsbTask: Hello via USB CDC, counter=" << counter << modm::endl;
counter++;
}

vTaskDelay(1);
}

vTaskDelete(0);
}

private:
modm::IODeviceWrapper<UsbUart0, modm::IOBuffer::DiscardIfFull> usb_io_device0;
modm::IOStream usb_stream0;
};

SomeTask someTask;
UsbTask usbTask;

int
main()
{
Board::initialize();
Leds::setOutput();
MODM_LOG_INFO << "Nucleo-F429ZI: TinyUSB & FreeRTOS example" << modm::endl;

MODM_LOG_INFO << "WARNING!" << modm::endl;
MODM_LOG_INFO << "TinyUSB in modm does not currently use the FreeRTOS abstraction layer";
MODM_LOG_INFO << " and is not thread-safe with FreeRTOS threads." << modm::endl;

modm::rtos::Scheduler::schedule();

// we should never get here
return 0;
}
17 changes: 17 additions & 0 deletions examples/nucleo_f429zi/usb_freertos/project.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<library>
<extends>modm:nucleo-f429zi</extends>
<options>
<option name="modm:build:build.path">../../../build/nucleo_f429zi/usb_freertos</option>
<option name="modm:tinyusb:config">device.cdc</option>
</options>
<modules>
<module>modm:build:scons</module>
<module>modm:freertos</module>
<module>modm:processing:rtos</module>
<module>modm:processing:timer</module>
<module>modm:tinyusb</module>
</modules>
<collectors>
<collect name="modm:build:cppdefines">CFG_TUSB_DEBUG=2</collect>
</collectors>
</library>

0 comments on commit 3f3ff3d

Please sign in to comment.