/examples/stm32f3_discovery/can/main.cpp
https://github.com/modm-io/modm · C++ · 127 lines · 79 code · 21 blank · 27 comment · 8 complexity · 43f4f96d68dac526088e9cc12b849fb4 MD5 · raw file
- /*
- * Copyright (c) 2013, Kevin Läufer
- * Copyright (c) 2013-2014, Sascha Schade
- * Copyright (c) 2013-2018, Niklas Hauser
- *
- * 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 <modm/board.hpp>
- #include <modm/processing/timer.hpp>
- #include <modm/debug/logger.hpp>
- /**
- * Example of CAN Hardware on STM32 F3 Discovery Board.
- *
- * Connect PB8 / PB9 to a CAN transceiver which is connected to a CAN bus.
- *
- * Tested in hardware on 2013-12-17 by Sascha Schade.
- */
- // Create an IODeviceWrapper around the Uart Peripheral we want to use
- modm::IODeviceWrapper< Usart2, modm::IOBuffer::BlockIfFull > loggerDevice;
- // Set all four logger streams to use the UART
- modm::log::Logger modm::log::debug(loggerDevice);
- modm::log::Logger modm::log::info(loggerDevice);
- modm::log::Logger modm::log::warning(loggerDevice);
- modm::log::Logger modm::log::error(loggerDevice);
- // Set the log level
- #undef MODM_LOG_LEVEL
- #define MODM_LOG_LEVEL modm::log::DEBUG
- static void
- displayMessage(const modm::can::Message& message)
- {
- static uint32_t receiveCounter = 0;
- receiveCounter++;
- MODM_LOG_INFO<< "id =" << message.getIdentifier();
- if (message.isExtended()) {
- MODM_LOG_INFO<< " extended";
- }
- else {
- MODM_LOG_INFO<< " standard";
- }
- if (message.isRemoteTransmitRequest()) {
- MODM_LOG_INFO<< ", rtr";
- }
- MODM_LOG_INFO<< modm::endl;
- MODM_LOG_INFO<< "dlc =" << message.getLength() << modm::endl;
- if (!message.isRemoteTransmitRequest())
- {
- MODM_LOG_INFO << "data=";
- for (uint32_t i = 0; i < message.getLength(); ++i) {
- MODM_LOG_INFO<< modm::hex << message.data[i] << modm::ascii << ' ';
- }
- MODM_LOG_INFO<< modm::endl;
- }
- MODM_LOG_INFO<< "# received=" << receiveCounter << modm::endl;
- }
- // ----------------------------------------------------------------------------
- int
- main()
- {
- Board::initialize();
- Board::LedNorth::set();
- // Initialize Usart
- Usart2::connect<GpioOutputA2::Tx>();
- Usart2::initialize<Board::SystemClock, 115200_Bd>();
- MODM_LOG_INFO << "CAN Test Program" << modm::endl;
- MODM_LOG_INFO << "Initializing Can ..." << modm::endl;
- // Initialize Can
- Can::connect<GpioInputB8::Rx, GpioOutputB9::Tx>(Gpio::InputType::PullUp);
- Can::initialize<Board::SystemClock, 125_kbps>(9);
- MODM_LOG_INFO << "Setting up Filter for Can ..." << modm::endl;
- // Receive every message
- CanFilter::setFilter(0, CanFilter::FIFO0,
- CanFilter::ExtendedIdentifier(0),
- CanFilter::ExtendedFilterMask(0));
- // Send a message
- MODM_LOG_INFO << "Sending message on Can ..." << modm::endl;
- modm::can::Message msg1(1, 1);
- msg1.setExtended(true);
- msg1.data[0] = 0x11;
- Can::sendMessage(msg1);
- modm::ShortPeriodicTimer pTimer(100ms);
- while (true)
- {
- if (Can::isMessageAvailable())
- {
- MODM_LOG_INFO << "Can: Message is available..." << modm::endl;
- modm::can::Message message;
- Can::getMessage(message);
- displayMessage(message);
- }
- if (pTimer.execute()) {
- Board::LedNorth::toggle();
- static uint8_t idx = 0;
- modm::can::Message msg1(1, 1);
- msg1.setExtended(true);
- msg1.data[0] = idx;
- Can::sendMessage(msg1);
- ++idx;
- }
- }
- return 0;
- }