NUC123 SERIAL driver
This commit is contained in:
parent
032b4cec7a
commit
de793d3b63
|
@ -0,0 +1,13 @@
|
||||||
|
ifeq ($(USE_SMART_BUILD),yes)
|
||||||
|
ifneq ($(findstring HAL_USE_SERIAL TRUE,$(HALCONF)),)
|
||||||
|
PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/SERIALv1/hal_serial_lld.c
|
||||||
|
endif
|
||||||
|
# ifneq ($(findstring HAL_USE_UART TRUE,$(HALCONF)),)
|
||||||
|
# PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLDSERIALv1/hal_uart_lld.c
|
||||||
|
# endif
|
||||||
|
else
|
||||||
|
PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/SERIALv1/hal_serial_lld.c
|
||||||
|
# PLATFORMSRC += $(CHIBIOS)/os/hal/ports/NUMICRO/LLD/SERIALv1/hal_uart_lld.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
PLATFORMINC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/SERIALv1
|
|
@ -0,0 +1,475 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2020 Alex Lewontin
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file hal_serial_lld.c
|
||||||
|
* @brief NUC123 serial subsystem low level driver source.
|
||||||
|
*
|
||||||
|
* @addtogroup SERIAL
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "hal.h"
|
||||||
|
|
||||||
|
#if (HAL_USE_SERIAL) || defined(__DOXYGEN__)
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver local definitions. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
#define NUC123_BRD_MAX 0xFFFFUL
|
||||||
|
#define NUC123_DIVIDER_X_MAX 0xF
|
||||||
|
|
||||||
|
#define NUC123_BRD_MODE0 ((0UL << UART_BAUD_DIV_X_EN_Pos) | (0UL << UART_BAUD_DIV_X_ONE_Pos))
|
||||||
|
#define NUC123_BRD_MODE1 ((1UL << UART_BAUD_DIV_X_EN_Pos) | (0UL << UART_BAUD_DIV_X_ONE_Pos))
|
||||||
|
#define NUC123_BRD_MODE2 ((1UL << UART_BAUD_DIV_X_EN_Pos) | (1UL << UART_BAUD_DIV_X_ONE_Pos))
|
||||||
|
|
||||||
|
/* Initially, these may not be defined in the header file so that they are not
|
||||||
|
used while unsupported. They are defined here because they are needed for safety
|
||||||
|
checks internally. When they are eventually
|
||||||
|
defined in the header file, they can be removed here */
|
||||||
|
#if !defined(NUC123_SERIAL_MODE_IrDA)
|
||||||
|
#define NUC123_SERIAL_MODE_IrDA (2UL << UART_FUN_SEL_FUN_SEL_Pos)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(NUC123_SERIAL_MODE_RS485)
|
||||||
|
#define NUC123_SERIAL_MODE_RS485 (3UL << UART_FUN_SEL_FUN_SEL_Pos)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define UART1_nCTS_PinSelect() \
|
||||||
|
do { \
|
||||||
|
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB7_MFP1_Msk; \
|
||||||
|
SYS->GPB_MFP |= (1 << 7); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define UART1_nCTS_PinUnselect() \
|
||||||
|
do { \
|
||||||
|
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB7_MFP1_Msk; \
|
||||||
|
SYS->GPB_MFP &= ~(1 << 7); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define UART1_nRTS_PinSelect() \
|
||||||
|
do { \
|
||||||
|
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB6_MFP1_Msk; \
|
||||||
|
SYS->GPB_MFP |= (1 << 6); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define UART1_nRTS_PinUnselect() \
|
||||||
|
do { \
|
||||||
|
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB6_MFP1_Msk; \
|
||||||
|
SYS->GPB_MFP &= ~(1 << 6); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define UART1_TXD_PinSelect() \
|
||||||
|
do { \
|
||||||
|
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB5_MFP1_Msk; \
|
||||||
|
SYS->GPB_MFP |= (1 << 5); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define UART1_TXD_PinUnselect() \
|
||||||
|
do { \
|
||||||
|
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB5_MFP1_Msk; \
|
||||||
|
SYS->GPB_MFP &= ~(1 << 5); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define UART1_RXD_PinSelect() \
|
||||||
|
do { \
|
||||||
|
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB4_MFP1_Msk; \
|
||||||
|
SYS->GPB_MFP |= (1 << 4); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define UART1_RXD_PinUnselect() \
|
||||||
|
do { \
|
||||||
|
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB4_MFP1_Msk; \
|
||||||
|
SYS->GPB_MFP &= ~(1 << 4); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define UART0_nCTS_PinSelect() \
|
||||||
|
do { \
|
||||||
|
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB3_MFP1_Msk; \
|
||||||
|
SYS->GPB_MFP |= (1 << 3); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define UART0_nCTS_PinUnselect() \
|
||||||
|
do { \
|
||||||
|
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB3_MFP1_Msk; \
|
||||||
|
SYS->GPB_MFP &= ~(1 << 3); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define UART0_nRTS_PinSelect() \
|
||||||
|
do { \
|
||||||
|
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB2_MFP1_Msk; \
|
||||||
|
SYS->GPB_MFP |= (1 << 2); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define UART0_nRTS_PinUnselect() \
|
||||||
|
do { \
|
||||||
|
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB2_MFP1_Msk; \
|
||||||
|
SYS->GPB_MFP &= ~(1 << 2); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define UART0_TXD_PinSelect() \
|
||||||
|
do { \
|
||||||
|
SYS->GPB_MFP |= (1 << 1); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define UART0_TXD_PinUnselect() \
|
||||||
|
do { \
|
||||||
|
SYS->GPB_MFP &= ~(1 << 1); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define UART0_RXD_PinSelect() \
|
||||||
|
do { \
|
||||||
|
SYS->GPB_MFP |= (1 << 0); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define UART0_RXD_PinUnselect() \
|
||||||
|
do { \
|
||||||
|
SYS->GPB_MFP &= ~(1 << 0); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver exported variables. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/** @brief UART0 serial driver identifier.*/
|
||||||
|
#if (NUC123_SERIAL_USE_UART0) || defined(__DOXYGEN__)
|
||||||
|
SerialDriver SD0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** @brief UART1 serial driver identifier.*/
|
||||||
|
#if (NUC123_SERIAL_USE_UART1) || defined(__DOXYGEN__)
|
||||||
|
SerialDriver SD1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver local variables and types. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Driver default configuration.
|
||||||
|
*/
|
||||||
|
static const SerialConfig default_config = {SERIAL_DEFAULT_BITRATE,
|
||||||
|
NUC123_SERIAL_MODE_DEFAULT,
|
||||||
|
NUC123_SERIAL_DATA_8BITS,
|
||||||
|
NUC123_SERIAL_PARITY_N,
|
||||||
|
NUC123_SERIAL_STOP_1};
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver local functions. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Shared IRQ handler.
|
||||||
|
*
|
||||||
|
* @param[in] gptp pointer to a @p GPTDriver object
|
||||||
|
*
|
||||||
|
* @notapi
|
||||||
|
*/
|
||||||
|
static void serial_lld_serve_interrupt(SerialDriver* sdp)
|
||||||
|
{
|
||||||
|
/* For now, this assumes UART mode */
|
||||||
|
uint32_t isr = sdp->uart->ISR;
|
||||||
|
uint32_t fsr = sdp->uart->FSR;
|
||||||
|
|
||||||
|
if (isr & (UART_ISR_RLS_IF_Msk | UART_ISR_BUF_ERR_IF_Msk)) {
|
||||||
|
osalSysLockFromISR();
|
||||||
|
|
||||||
|
if (fsr & UART_FSR_BIF_Msk) {
|
||||||
|
chnAddFlagsI(sdp, SD_BREAK_DETECTED);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fsr & UART_FSR_FEF_Msk) {
|
||||||
|
chnAddFlagsI(sdp, SD_FRAMING_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fsr & UART_FSR_PEF_Msk) {
|
||||||
|
chnAddFlagsI(sdp, SD_PARITY_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fsr & UART_FSR_RX_OVER_IF_Msk) {
|
||||||
|
chnAddFlagsI(sdp, SD_OVERRUN_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Technically, a TX_OVER would trigger BUFF_ERR, and reach this code.
|
||||||
|
We'll come back to how to handle that.
|
||||||
|
*/
|
||||||
|
|
||||||
|
sdp->uart->FSR |=
|
||||||
|
(UART_FSR_BIF_Msk | UART_FSR_FEF_Msk | UART_FSR_PEF_Msk | UART_FSR_RX_OVER_IF_Msk);
|
||||||
|
osalSysUnlockFromISR();
|
||||||
|
}
|
||||||
|
|
||||||
|
osalSysLockFromISR();
|
||||||
|
while (!(sdp->uart->FSR & UART_FSR_RX_EMPTY_Msk)) {
|
||||||
|
/* Originally
|
||||||
|
sdIncomingDataI(sdp, sdp->uart->RBR);
|
||||||
|
copied as per instructions in hal_serial.c for performance gain */
|
||||||
|
osalDbgCheckClassI();
|
||||||
|
osalDbgCheck(sdp != NULL);
|
||||||
|
|
||||||
|
if (iqIsEmptyI(&sdp->iqueue))
|
||||||
|
chnAddFlagsI(sdp, CHN_INPUT_AVAILABLE);
|
||||||
|
if (iqPutI(&sdp->iqueue, sdp->uart->RBR) < MSG_OK)
|
||||||
|
chnAddFlagsI(sdp, SD_QUEUE_FULL_ERROR);
|
||||||
|
}
|
||||||
|
osalSysUnlockFromISR();
|
||||||
|
|
||||||
|
osalSysLockFromISR();
|
||||||
|
while (!(sdp->uart->FSR & UART_FSR_TX_FULL_Msk)) {
|
||||||
|
msg_t b = oqGetI(&(sdp->oqueue));
|
||||||
|
if (b < MSG_OK) {
|
||||||
|
chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY);
|
||||||
|
sdp->uart->IER &= ~(UART_IER_THRE_IEN_Msk);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sdp->uart->THR = b;
|
||||||
|
}
|
||||||
|
chnAddFlagsI(sdp, CHN_TRANSMISSION_END);
|
||||||
|
osalSysUnlockFromISR();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#if NUC123_SERIAL_USE_UART0 || defined(__DOXYGEN__)
|
||||||
|
static void notify0(io_queue_t* qp)
|
||||||
|
{
|
||||||
|
(void)qp;
|
||||||
|
UART0->IER |= UART_IER_THRE_IEN_Msk;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if NUC123_SERIAL_USE_UART1 || defined(__DOXYGEN__)
|
||||||
|
static void notify1(io_queue_t* qp)
|
||||||
|
{
|
||||||
|
(void)qp;
|
||||||
|
UART1->IER |= UART_IER_THRE_IEN_Msk;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver interrupt handlers. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief UART0 interrupt handler.
|
||||||
|
*
|
||||||
|
* @isr
|
||||||
|
*/
|
||||||
|
#if NUC123_SERIAL_USE_UART0 || defined(__DOXYGEN__)
|
||||||
|
|
||||||
|
OSAL_IRQ_HANDLER(NUC123_UART0_HANDLER)
|
||||||
|
{
|
||||||
|
OSAL_IRQ_PROLOGUE();
|
||||||
|
serial_lld_serve_interrupt(&SD0);
|
||||||
|
OSAL_IRQ_EPILOGUE();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief UART1 interrupt handler.
|
||||||
|
*
|
||||||
|
* @isr
|
||||||
|
*/
|
||||||
|
#if NUC123_SERIAL_USE_UART1 || defined(__DOXYGEN__)
|
||||||
|
|
||||||
|
OSAL_IRQ_HANDLER(NUC123_UART1_HANDLER)
|
||||||
|
{
|
||||||
|
OSAL_IRQ_PROLOGUE();
|
||||||
|
serial_lld_serve_interrupt(&SD1);
|
||||||
|
OSAL_IRQ_EPILOGUE();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver exported functions. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Low level serial driver initialization.
|
||||||
|
*
|
||||||
|
* @notapi
|
||||||
|
*/
|
||||||
|
void sd_lld_init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
#if NUC123_SERIAL_USE_UART0
|
||||||
|
sdObjectInit(&SD0, NULL, notify0);
|
||||||
|
/* Select UART0 Pins */
|
||||||
|
SYS->ALT_MFP &= ~(SYS_ALT_MFP_PB3_MFP1_Msk | SYS_ALT_MFP_PB3_MFP1_Msk);
|
||||||
|
SYS->GPB_MFP |= 0x0FUL;
|
||||||
|
SD0.uart = UART0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if NUC123_SERIAL_USE_UART1
|
||||||
|
sdObjectInit(&SD1, NULL, notify1);
|
||||||
|
/* Select UART1 Pins */
|
||||||
|
SYS->ALT_MFP &= ~(SYS_ALT_MFP_PB7_MFP1_Msk | SYS_ALT_MFP_PB6_MFP1_Msk |
|
||||||
|
SYS_ALT_MFP_PB5_MFP1_Msk | SYS_ALT_MFP_PB4_MFP1_Msk);
|
||||||
|
SYS->GPB_MFP |= 0xF0UL;
|
||||||
|
SD1.uart = UART1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Low level serial driver configuration and (re)start.
|
||||||
|
*
|
||||||
|
* @param[in] sdp pointer to a @p SerialDriver object
|
||||||
|
* @param[in] config the architecture-dependent serial driver configuration.
|
||||||
|
* If this parameter is set to @p NULL then a default
|
||||||
|
* configuration is used.
|
||||||
|
*
|
||||||
|
* @notapi
|
||||||
|
*/
|
||||||
|
void sd_lld_start(SerialDriver* sdp, const SerialConfig* config)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (!config) {
|
||||||
|
config = &default_config;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sdp->state == SD_STOP) {
|
||||||
|
#if NUC123_SERIAL_USE_UART0
|
||||||
|
if (&SD0 == sdp) {
|
||||||
|
CLK->APBCLK |= CLK_APBCLK_UART0_EN_Msk;
|
||||||
|
CLK->CLKSEL1 = (CLK->CLKSEL1 & ~(CLK_CLKSEL1_UART_S_Msk)) | NUC123_SERIAL_CLKSRC;
|
||||||
|
nvicEnableVector(UART0_IRQn, NUC123_SERIAL_UART0_IRQ_PRIORITY);
|
||||||
|
SYS->IPRSTC2 |= SYS_IPRSTC2_UART0_RST_Msk;
|
||||||
|
SYS->IPRSTC2 &= ~(SYS_IPRSTC2_UART0_RST_Msk);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if NUC123_SERIAL_USE_UART1
|
||||||
|
if (&SD1 == sdp) {
|
||||||
|
CLK->APBCLK |= CLK_APBCLK_UART1_EN_Msk;
|
||||||
|
nvicEnableVector(NUC123_UART1_IRQn, NUC123_SERIAL_UART1_IRQ_PRIORITY);
|
||||||
|
SYS->IPRSTC2 |= SYS_IPRSTC2_UART1_RST_Msk;
|
||||||
|
SYS->IPRSTC2 &= ~(SYS_IPRSTC2_UART1_RST_Msk);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Configures the peripheral.*/
|
||||||
|
|
||||||
|
osalDbgAssert((NUC123_SERIAL_CLK % config->speed == 0),
|
||||||
|
"NUC123_SERIAL_CLK % config->speed must be 0 or speed cannot be generated");
|
||||||
|
uint32_t baud_found = false;
|
||||||
|
|
||||||
|
/* Speed is controlled by the expression
|
||||||
|
BAUD = UART_CLK / (m * (BRD + 2))
|
||||||
|
Here, baud_denom represents the (m * (BRD + 2)) part of the expression */
|
||||||
|
uint32_t baud_denom = (NUC123_SERIAL_CLK / config->speed);
|
||||||
|
|
||||||
|
/* Mode 0: m = 16 */
|
||||||
|
if ((baud_denom % 16 == 0) && (((baud_denom / 16) - 2) <= NUC123_BRD_MAX)) {
|
||||||
|
sdp->uart->BAUD = NUC123_BRD_MODE0 | ((baud_denom / 16) - 2);
|
||||||
|
baud_found = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the peripheral is in IrDA mode, it can only use baud generation mode 0 */
|
||||||
|
else if (config->mode != NUC123_SERIAL_MODE_IrDA) {
|
||||||
|
|
||||||
|
/* Mode 2: m = 1. The exact behavior of mode 2 varies depending on
|
||||||
|
a) the model of the chip
|
||||||
|
b) UART_CLK relative to HCLK
|
||||||
|
*/
|
||||||
|
#if defined(NUC123xxxANx)
|
||||||
|
#if NUC123_SERIAL_CLK <= NUC123_HCLK
|
||||||
|
if ((9 <= (baud_denom - 2)) && ((baud_denom - 2) <= NUC123_BRD_MAX)) {
|
||||||
|
sdp->uart->BAUD = NUC123_BRD_MODE2 | (baud_denom - 2);
|
||||||
|
baud_found = true;
|
||||||
|
}
|
||||||
|
#elif NUC123_SERIAL_CLK <= (2 * NUC123_HCLK)
|
||||||
|
if ((15 <= (baud_denom - 2)) && ((baud_denom - 2) <= NUC123_BRD_MAX)) {
|
||||||
|
sdp->uart->BAUD = NUC123_BRD_MODE2 | (baud_denom - 2);
|
||||||
|
baud_found = true;
|
||||||
|
}
|
||||||
|
#elif NUC123_SERIAL_CLK <= (3 * NUC123_HCLK)
|
||||||
|
if ((21 <= (baud_denom - 2)) && ((baud_denom - 2) <= NUC123_BRD_MAX)) {
|
||||||
|
sdp->uart->BAUD = NUC123_BRD_MODE2 | (baud_denom - 2);
|
||||||
|
baud_found = true;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/* Dummy statement to prevent an orphaned else at the begining of the Mode 1 block */
|
||||||
|
if (FALSE) {
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#elif defined(NUC123xxxAEx)
|
||||||
|
/* TODO: Implement the specific requirements for the AE series */
|
||||||
|
/* Dummy statement to prevent an orphaned else at the begining of the Mode 1 block */
|
||||||
|
if (FALSE) {
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/* Mode 1: m = (DIVIDER_X + 1), 8 <= DIVIDER_X <= 16 */
|
||||||
|
else {
|
||||||
|
for (uint32_t m = 9; m <= (NUC123_DIVIDER_X_MAX + 1); ++m) {
|
||||||
|
if ((baud_denom % m == 0) && ((baud_denom / m) - 2 <= NUC123_BRD_MAX)) {
|
||||||
|
sdp->uart->BAUD =
|
||||||
|
NUC123_BRD_MODE1 | ((m - 1) << UART_BAUD_DIVIDER_X_Pos) | ((baud_denom / m) - 2);
|
||||||
|
baud_found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we couldn't generate the desired frequency from any of the available modes, halt */
|
||||||
|
osalDbgCheck(baud_found);
|
||||||
|
|
||||||
|
sdp->uart->FUN_SEL = config->mode & UART_FUN_SEL_FUN_SEL_Msk;
|
||||||
|
sdp->uart->LCR = config->data | config->parity | config->stop;
|
||||||
|
sdp->uart->IER = UART_IER_RLS_IEN_Msk | UART_IER_RDA_IEN_Msk | UART_IER_BUF_ERR_IEN_Msk;
|
||||||
|
sdp->uart->FCR &= ~UART_FCR_RFITL_Msk;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Low level serial driver stop.
|
||||||
|
* @details De-initializes the USART, stops the associated clock, resets the
|
||||||
|
* interrupt vector.
|
||||||
|
*
|
||||||
|
* @param[in] sdp pointer to a @p SerialDriver object
|
||||||
|
*
|
||||||
|
* @notapi
|
||||||
|
*/
|
||||||
|
void sd_lld_stop(SerialDriver* sdp)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (sdp->state == SD_READY) {
|
||||||
|
#if NUC123_SERIAL_USE_UART0
|
||||||
|
if (&SD0 == sdp) {
|
||||||
|
CLK->APBCLK &= ~CLK_APBCLK_UART0_EN_Msk;
|
||||||
|
nvicDisableVector(UART0_IRQn);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if NUC123_SERIAL_USE_UART1
|
||||||
|
if (&SD1 == sdp) {
|
||||||
|
CLK->APBCLK &= ~CLK_APBCLK_UART1_EN_Msk;
|
||||||
|
nvicDisableVector(NUC123_UART1_IRQn);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
sdp->uart->FUN_SEL = 0;
|
||||||
|
sdp->uart->LCR = 0;
|
||||||
|
sdp->uart->BAUD = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* HAL_USE_SERIAL */
|
||||||
|
|
||||||
|
/** @} */
|
|
@ -0,0 +1,228 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2020 Alex Lewontin
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file hal_serial_lld.h
|
||||||
|
* @brief NUC123 serial subsystem low level driver header.
|
||||||
|
*
|
||||||
|
* @addtogroup SERIAL
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HAL_SERIAL_LLD_H
|
||||||
|
#define HAL_SERIAL_LLD_H
|
||||||
|
|
||||||
|
#if (HAL_USE_SERIAL) || defined(__DOXYGEN__)
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver constants. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief UART clock sources.
|
||||||
|
*/
|
||||||
|
#define NUC123_SERIAL_CLKSRC_HSE (0UL << CLK_CLKSEL1_UART_S_Pos)
|
||||||
|
#define NUC123_SERIAL_CLKSRC_PLL (1UL << CLK_CLKSEL1_UART_S_Pos)
|
||||||
|
#define NUC123_SERIAL_CLKSRC_HSI (3UL << CLK_CLKSEL1_UART_S_Pos)
|
||||||
|
|
||||||
|
#define NUC123_SERIAL_MODE_UART (0UL << UART_FUN_SEL_FUN_SEL_Pos)
|
||||||
|
/*
|
||||||
|
TODO: add IrDA and RS485 support
|
||||||
|
#define NUC123_SERIAL_MODE_IrDA (2UL << UART_FUN_SEL_FUN_SEL_Pos)
|
||||||
|
#define NUC123_SERIAL_MODE_RS485 (3UL << UART_FUN_SEL_FUN_SEL_Pos)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define NUC123_SERIAL_DATA_5BITS (0U << UART_LCR_WLS_Pos)
|
||||||
|
#define NUC123_SERIAL_DATA_6BITS (1U << UART_LCR_WLS_Pos)
|
||||||
|
#define NUC123_SERIAL_DATA_7BITS (2U << UART_LCR_WLS_Pos)
|
||||||
|
#define NUC123_SERIAL_DATA_8BITS (3U << UART_LCR_WLS_Pos)
|
||||||
|
|
||||||
|
#define NUC123_SERIAL_PARITY_N (0U << UART_LCR_PBE_Pos)
|
||||||
|
#define NUC123_SERIAL_PARITY_O (1U << UART_LCR_PBE_Pos)
|
||||||
|
#define NUC123_SERIAL_PARITY_E (3U << UART_LCR_PBE_Pos)
|
||||||
|
#define NUC123_SERIAL_PARITY_M (5U << UART_LCR_PBE_Pos)
|
||||||
|
#define NUC123_SERIAL_PARITY_S (7U << UART_LCR_PBE_Pos)
|
||||||
|
|
||||||
|
#define NUC123_SERIAL_STOP_1 (0U << UART_LCR_NSB_Pos)
|
||||||
|
#define NUC123_SERIAL_STOP_MULTI (1U << UART_LCR_NSB_Pos)
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver pre-compile time settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name NUC123 configuration options
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @brief UART0 driver enable switch.
|
||||||
|
* @details If set to @p TRUE the support for USART0 is included.
|
||||||
|
* @note The default is @p TRUE.
|
||||||
|
*/
|
||||||
|
#if !defined(NUC123_SERIAL_USE_UART0) || defined(__DOXYGEN__)
|
||||||
|
#define NUC123_SERIAL_USE_UART0 TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief UART1 driver enable switch.
|
||||||
|
* @details If set to @p TRUE the support for USART1 is included.
|
||||||
|
* @note The default is @p FALSE.
|
||||||
|
*/
|
||||||
|
#if !defined(NUC123_SERIAL_USE_UART1) || defined(__DOXYGEN__)
|
||||||
|
#define NUC123_SERIAL_USE_UART1 FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief UART0 mode
|
||||||
|
*/
|
||||||
|
#if !defined(NUC123_SERIAL_MODE_DEFAULT) || defined(__DOXYGEN__)
|
||||||
|
#define NUC123_SERIAL_MODE_DEFAULT NUC123_SERIAL_MODE_UART
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief UART clock source
|
||||||
|
*/
|
||||||
|
#if !defined(NUC123_SERIAL_CLKSRC) || defined(__DOXYGEN__)
|
||||||
|
#if NUC123_PLL_ENABLED
|
||||||
|
#define NUC123_SERIAL_CLKSRC NUC123_SERIAL_CLKSRC_PLL
|
||||||
|
#elif NUC123_HSI_ENABLED
|
||||||
|
#define NUC123_SERIAL_CLKSRC NUC123_SERIAL_CLKSRC_HSI
|
||||||
|
#elif NUC123_HSE_ENABLED
|
||||||
|
#define NUC123_SERIAL_CLKSRC NUC123_SERIAL_CLKSRC_HSE
|
||||||
|
#else
|
||||||
|
#error "Using the serial module requires either the HSE, the HSI, or the PLL to be enabled."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(NUC123_SERIAL_IRQ_PRIORITY) || defined(__DOXYGEN__)
|
||||||
|
#define NUC123_SERIAL_IRQ_PRIORITY 3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(NUC123_SERIAL_UART0_IRQ_PRIORITY) || defined(__DOXYGEN__)
|
||||||
|
#define NUC123_SERIAL_UART0_IRQ_PRIORITY NUC123_SERIAL_IRQ_PRIORITY
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(NUC123_SERIAL_UART1_IRQ_PRIORITY) || defined(__DOXYGEN__)
|
||||||
|
#define NUC123_SERIAL_UART1_IRQ_PRIORITY NUC123_SERIAL_IRQ_PRIORITY
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Derived constants and error checks. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
#if !NUC123_SERIAL_USE_UART0 && !NUC123_SERIAL_USE_UART1
|
||||||
|
#error "SERIAL driver activated but no USART/UART peripheral in use"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (NUC123_SERIAL_CLKSRC != NUC123_SERIAL_CLKSRC_PLL) && \
|
||||||
|
(NUC123_SERIAL_CLKSRC != NUC123_SERIAL_CLKSRC_HSE) && \
|
||||||
|
(NUC123_SERIAL_CLKSRC != NUC123_SERIAL_CLKSRC_HSI)
|
||||||
|
#error \
|
||||||
|
"NUC123_SERIAL_CLKSRC must be NUC123_SERIAL_CLKSRC_PLL, NUC123_SERIAL_CLKSRC_HSE, or NUC123_SERIAL_CLKSRC_HSI"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if NUC123_SERIAL_CLKSRC == NUC123_SERIAL_CLKSRC_PLL
|
||||||
|
#define NUC123_SERIAL_CLK NUC123_PLLCLK
|
||||||
|
#elif NUC123_SERIAL_CLKSRC == NUC123_SERIAL_CLKSRC_HSE
|
||||||
|
#define NUC123_SERIAL_CLK NUC123_HSECLK
|
||||||
|
#elif NUC123_SERIAL_CLKSRC == NUC123_SERIAL_CLKSRC_HSI
|
||||||
|
#define NUC123_SERIAL_CLK NUC123_HSICLK
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver data structures and types. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Serial modes
|
||||||
|
*/
|
||||||
|
typedef uint32_t serial_mode_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief NUC123 Serial Driver configuration structure.
|
||||||
|
* @details An instance of this structure must be passed to @p sdStart()
|
||||||
|
* in order to configure and start a serial driver operations.
|
||||||
|
* @note This structure content is architecture dependent, each driver
|
||||||
|
* implementation defines its own version and the custom static
|
||||||
|
* initializers.
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
/**
|
||||||
|
* @brief Bit rate.
|
||||||
|
*/
|
||||||
|
uint32_t speed;
|
||||||
|
/* End of the mandatory fields.*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Mode
|
||||||
|
*/
|
||||||
|
serial_mode_t mode;
|
||||||
|
uint8_t data;
|
||||||
|
uint8_t parity;
|
||||||
|
uint8_t stop;
|
||||||
|
|
||||||
|
} SerialConfig;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief @p SerialDriver specific data.
|
||||||
|
*/
|
||||||
|
#define _serial_driver_data \
|
||||||
|
_base_asynchronous_channel_data /* Driver state.*/ \
|
||||||
|
sdstate_t state; \
|
||||||
|
/* Input queue.*/ \
|
||||||
|
input_queue_t iqueue; \
|
||||||
|
/* Output queue.*/ \
|
||||||
|
output_queue_t oqueue; \
|
||||||
|
/* Input circular buffer.*/ \
|
||||||
|
uint8_t ib[SERIAL_BUFFERS_SIZE]; \
|
||||||
|
/* Output circular buffer.*/ \
|
||||||
|
uint8_t ob[SERIAL_BUFFERS_SIZE]; \
|
||||||
|
/* End of the mandatory fields.*/ \
|
||||||
|
UART_T* uart;
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver macros. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* External declarations. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
#if (NUC123_SERIAL_USE_UART0) && !defined(__DOXYGEN__)
|
||||||
|
extern SerialDriver SD0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (NUC123_SERIAL_USE_UART1) && !defined(__DOXYGEN__)
|
||||||
|
extern SerialDriver SD1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
void sd_lld_init(void);
|
||||||
|
void sd_lld_start(SerialDriver* sdp, const SerialConfig* config);
|
||||||
|
void sd_lld_stop(SerialDriver* sdp);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* HAL_USE_SERIAL */
|
||||||
|
|
||||||
|
#endif /* HAL_SERIAL_LLD_H */
|
||||||
|
|
||||||
|
/** @} */
|
|
@ -107,13 +107,13 @@
|
||||||
#define NUC123_TIM4_NUMBER TMR3_IRQn
|
#define NUC123_TIM4_NUMBER TMR3_IRQn
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* USART units.
|
* UART units.
|
||||||
*/
|
*/
|
||||||
#define NUC123_USART1_HANDLER Vector70
|
#define NUC123_UART0_HANDLER Vector70
|
||||||
#define NUC123_USART2_HANDLER Vector74
|
#define NUC123_UART1_HANDLER Vector74
|
||||||
|
|
||||||
#define NUC123_USART1_NUMBER UART0_IRQn
|
#define NUC123_UART0_NUMBER UART0_IRQn
|
||||||
#define NUC123_USART2_NUMBER UART1_IRQn
|
#define NUC123_UART1_NUMBER UART1_IRQn
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* USB units.
|
* USB units.
|
||||||
|
|
|
@ -15,6 +15,7 @@ endif
|
||||||
include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/GPIOv1/driver.mk
|
include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/GPIOv1/driver.mk
|
||||||
include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/TIMv1/driver.mk
|
include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/TIMv1/driver.mk
|
||||||
include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/USBv1/driver.mk
|
include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/USBv1/driver.mk
|
||||||
|
include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/SERIALv1/driver.mk
|
||||||
|
|
||||||
# Shared variables
|
# Shared variables
|
||||||
ALLCSRC += $(PLATFORMSRC)
|
ALLCSRC += $(PLATFORMSRC)
|
||||||
|
|
|
@ -0,0 +1,196 @@
|
||||||
|
##############################################################################
|
||||||
|
# Build global options
|
||||||
|
# NOTE: Can be overridden externally.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Compiler options here.
|
||||||
|
ifeq ($(USE_OPT),)
|
||||||
|
USE_OPT = -ggdb -g3 -gdwarf-3 -gstrict-dwarf -fomit-frame-pointer -falign-functions=16
|
||||||
|
endif
|
||||||
|
|
||||||
|
# C specific options here (added to USE_OPT).
|
||||||
|
ifeq ($(USE_COPT),)
|
||||||
|
USE_COPT =
|
||||||
|
endif
|
||||||
|
|
||||||
|
# C++ specific options here (added to USE_OPT).
|
||||||
|
ifeq ($(USE_CPPOPT),)
|
||||||
|
USE_CPPOPT = -fno-rtti
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Enable this if you want the linker to remove unused code and data.
|
||||||
|
ifeq ($(USE_LINK_GC),)
|
||||||
|
USE_LINK_GC = yes
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Linker extra options here.
|
||||||
|
ifeq ($(USE_LDOPT),)
|
||||||
|
USE_LDOPT =
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Enable this if you want link time optimizations (LTO).
|
||||||
|
ifeq ($(USE_LTO),)
|
||||||
|
USE_LTO = yes
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Enable this if you want to see the full log while compiling.
|
||||||
|
ifeq ($(USE_VERBOSE_COMPILE),)
|
||||||
|
USE_VERBOSE_COMPILE = no
|
||||||
|
endif
|
||||||
|
|
||||||
|
# If enabled, this option makes the build process faster by not compiling
|
||||||
|
# modules not used in the current configuration.
|
||||||
|
ifeq ($(USE_SMART_BUILD),)
|
||||||
|
USE_SMART_BUILD = yes
|
||||||
|
endif
|
||||||
|
|
||||||
|
#
|
||||||
|
# Build global options
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# Architecture or project specific options
|
||||||
|
#
|
||||||
|
|
||||||
|
# Stack size to be allocated to the Cortex-M process stack. This stack is
|
||||||
|
# the stack used by the main() thread.
|
||||||
|
ifeq ($(USE_PROCESS_STACKSIZE),)
|
||||||
|
USE_PROCESS_STACKSIZE = 0x400
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Stack size to the allocated to the Cortex-M main/exceptions stack. This
|
||||||
|
# stack is used for processing interrupts and exceptions.
|
||||||
|
ifeq ($(USE_EXCEPTIONS_STACKSIZE),)
|
||||||
|
USE_EXCEPTIONS_STACKSIZE = 0x400
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Enables the use of FPU (no, softfp, hard).
|
||||||
|
ifeq ($(USE_FPU),)
|
||||||
|
USE_FPU = no
|
||||||
|
endif
|
||||||
|
|
||||||
|
# FPU-related options.
|
||||||
|
ifeq ($(USE_FPU_OPT),)
|
||||||
|
USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16
|
||||||
|
endif
|
||||||
|
|
||||||
|
#
|
||||||
|
# Architecture or project specific options
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# Project, target, sources and paths
|
||||||
|
#
|
||||||
|
|
||||||
|
# Define project name here
|
||||||
|
PROJECT = ch
|
||||||
|
|
||||||
|
# Target settings.
|
||||||
|
MCU = cortex-m0
|
||||||
|
|
||||||
|
# Imported source files and paths.
|
||||||
|
BASE_PATH := ../../../../../../..
|
||||||
|
CHIBIOS := $(BASE_PATH)/ChibiOS/ChibiOS
|
||||||
|
CHIBIOS_CONTRIB := $(BASE_PATH)/ChibiOS/ChibiOS-Contrib
|
||||||
|
CONFDIR := ./cfg
|
||||||
|
BUILDDIR := ./build
|
||||||
|
DEPDIR := ./.dep
|
||||||
|
|
||||||
|
# Licensing files.
|
||||||
|
include $(CHIBIOS)/os/license/license.mk
|
||||||
|
# Startup files.
|
||||||
|
include $(CHIBIOS_CONTRIB)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_NUC123.mk
|
||||||
|
# HAL-OSAL files (optional).
|
||||||
|
include $(CHIBIOS)/os/hal/hal.mk
|
||||||
|
include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/NUC123/platform.mk
|
||||||
|
include $(CHIBIOS_CONTRIB)/os/hal/boards/NUTINY-SDK-NUC123-V2.0/board.mk
|
||||||
|
include $(CHIBIOS)/os/hal/osal/os-less/ARMCMx/osal.mk
|
||||||
|
# RTOS files (optional).
|
||||||
|
|
||||||
|
# Auto-build files in ./source recursively.
|
||||||
|
include $(CHIBIOS)/tools/mk/autobuild.mk
|
||||||
|
# Other files (optional).
|
||||||
|
include $(CHIBIOS)/os/hal/lib/streams/streams.mk
|
||||||
|
|
||||||
|
# Define linker script file here
|
||||||
|
LDSCRIPT= $(STARTUPLD_CONTRIB)/NUC123xD4xx0.ld
|
||||||
|
|
||||||
|
# C sources that can be compiled in ARM or THUMB mode depending on the global
|
||||||
|
# setting.
|
||||||
|
CSRC = $(ALLCSRC) \
|
||||||
|
$(TESTSRC) \
|
||||||
|
main.c
|
||||||
|
|
||||||
|
# C++ sources that can be compiled in ARM or THUMB mode depending on the global
|
||||||
|
# setting.
|
||||||
|
CPPSRC = $(ALLCPPSRC)
|
||||||
|
|
||||||
|
# List ASM source files here.
|
||||||
|
ASMSRC = $(ALLASMSRC)
|
||||||
|
|
||||||
|
# List ASM with preprocessor source files here.
|
||||||
|
ASMXSRC = $(ALLXASMSRC)
|
||||||
|
|
||||||
|
# Inclusion directories.
|
||||||
|
INCDIR = $(CONFDIR) $(ALLINC) $(TESTINC)
|
||||||
|
|
||||||
|
# Define C warning options here.
|
||||||
|
CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes
|
||||||
|
|
||||||
|
# Define C++ warning options here.
|
||||||
|
CPPWARN = -Wall -Wextra -Wundef
|
||||||
|
|
||||||
|
#
|
||||||
|
# Project, target, sources and paths
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# Start of user section
|
||||||
|
#
|
||||||
|
|
||||||
|
# List all user C define here, like -D_DEBUG=1
|
||||||
|
UDEFS =
|
||||||
|
|
||||||
|
# Define ASM defines here
|
||||||
|
UADEFS =
|
||||||
|
|
||||||
|
# List all user directories here
|
||||||
|
UINCDIR =
|
||||||
|
|
||||||
|
# List the user directory to look for the libraries here
|
||||||
|
ULIBDIR =
|
||||||
|
|
||||||
|
# List all user libraries here
|
||||||
|
ULIBS =
|
||||||
|
|
||||||
|
#
|
||||||
|
# End of user section
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# Common rules
|
||||||
|
#
|
||||||
|
|
||||||
|
RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk
|
||||||
|
include $(RULESPATH)/arm-none-eabi.mk
|
||||||
|
include $(RULESPATH)/rules.mk
|
||||||
|
|
||||||
|
#
|
||||||
|
# Common rules
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# Custom rules
|
||||||
|
#
|
||||||
|
|
||||||
|
OPENOCD:=$(shell readlink -f `which openocd`)
|
||||||
|
OPENOCDPATH:=$(shell dirname $(OPENOCD))/../share/openocd
|
||||||
|
|
||||||
|
install-openocd-config:
|
||||||
|
rm $(OPENOCDPATH)/scripts/target/numicroM0.cfg && cp $(CHIBIOS_CONTRIB)/ext/numicroM0.cfg $(OPENOCDPATH)/scripts/target/
|
||||||
|
|
||||||
|
connect:
|
||||||
|
openocd -f ../scripts/interface/nulink.cfg -f ../scripts/target/numicroM0.cfg
|
||||||
|
|
||||||
|
flash: $(BUILDDIR)/$(PROJECT).elf
|
||||||
|
openocd -f ../scripts/interface/nulink.cfg -f ../scripts/target/numicroM0.cfg -c "program $< verify reset exit"
|
|
@ -0,0 +1,536 @@
|
||||||
|
/*
|
||||||
|
ChibiOS - Copyright (C) 2020 Alex Lewontin
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file templates/halconf.h
|
||||||
|
* @brief HAL configuration header.
|
||||||
|
* @details HAL configuration file, this file allows to enable or disable the
|
||||||
|
* various device drivers from your application. You may also use
|
||||||
|
* this file in order to override the device drivers default settings.
|
||||||
|
*
|
||||||
|
* @addtogroup HAL_CONF
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HALCONF_H
|
||||||
|
#define HALCONF_H
|
||||||
|
|
||||||
|
#define _CHIBIOS_HAL_CONF_
|
||||||
|
#define _CHIBIOS_HAL_CONF_VER_7_1_
|
||||||
|
|
||||||
|
#include "mcuconf.h"
|
||||||
|
|
||||||
|
#define PAL_USE_CALLBACKS TRUE
|
||||||
|
#define PAL_USE_WAIT TRUE
|
||||||
|
|
||||||
|
#define NUC123_SERIAL_CLKSRC NUC123_SERIAL_CLKSRC_HSI
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the PAL subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_PAL FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the ADC subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_ADC FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the CAN subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_CAN FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the cryptographic subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_CRY FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the DAC subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_DAC FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the EFlash subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_EFL FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the GPT subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_GPT FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the I2C subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_I2C FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the I2S subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_I2S FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the ICU subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_ICU FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the MAC subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_MAC FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the MMC_SPI subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_MMC_SPI FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the PWM subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_PWM FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the RTC subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_RTC FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the SDC subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_SDC FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the SERIAL subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_SERIAL TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the SERIAL over USB subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_SERIAL_USB FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the SIO subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_SIO FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the SPI subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_SPI FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the TRNG subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_TRNG FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the UART subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_UART) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_UART FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the USB subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_USB) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_USB FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the WDG subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_WDG FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the WSPI subsystem.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_USE_WSPI FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* PAL driver related settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables synchronous APIs.
|
||||||
|
* @note Disabling this option saves both code and data space.
|
||||||
|
*/
|
||||||
|
#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__)
|
||||||
|
#define PAL_USE_CALLBACKS FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables synchronous APIs.
|
||||||
|
* @note Disabling this option saves both code and data space.
|
||||||
|
*/
|
||||||
|
#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__)
|
||||||
|
#define PAL_USE_WAIT FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* ADC driver related settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables synchronous APIs.
|
||||||
|
* @note Disabling this option saves both code and data space.
|
||||||
|
*/
|
||||||
|
#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__)
|
||||||
|
#define ADC_USE_WAIT TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs.
|
||||||
|
* @note Disabling this option saves both code and data space.
|
||||||
|
*/
|
||||||
|
#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
|
||||||
|
#define ADC_USE_MUTUAL_EXCLUSION TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* CAN driver related settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sleep mode related APIs inclusion switch.
|
||||||
|
*/
|
||||||
|
#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__)
|
||||||
|
#define CAN_USE_SLEEP_MODE TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enforces the driver to use direct callbacks rather than OSAL events.
|
||||||
|
*/
|
||||||
|
#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__)
|
||||||
|
#define CAN_ENFORCE_USE_CALLBACKS FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* CRY driver related settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the SW fall-back of the cryptographic driver.
|
||||||
|
* @details When enabled, this option, activates a fall-back software
|
||||||
|
* implementation for algorithms not supported by the underlying
|
||||||
|
* hardware.
|
||||||
|
* @note Fall-back implementations may not be present for all algorithms.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_CRY_USE_FALLBACK FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Makes the driver forcibly use the fall-back implementations.
|
||||||
|
*/
|
||||||
|
#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__)
|
||||||
|
#define HAL_CRY_ENFORCE_FALLBACK FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* DAC driver related settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables synchronous APIs.
|
||||||
|
* @note Disabling this option saves both code and data space.
|
||||||
|
*/
|
||||||
|
#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__)
|
||||||
|
#define DAC_USE_WAIT TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs.
|
||||||
|
* @note Disabling this option saves both code and data space.
|
||||||
|
*/
|
||||||
|
#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
|
||||||
|
#define DAC_USE_MUTUAL_EXCLUSION TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* I2C driver related settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the mutual exclusion APIs on the I2C bus.
|
||||||
|
*/
|
||||||
|
#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
|
||||||
|
#define I2C_USE_MUTUAL_EXCLUSION TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* MAC driver related settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the zero-copy API.
|
||||||
|
*/
|
||||||
|
#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__)
|
||||||
|
#define MAC_USE_ZERO_COPY FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables an event sources for incoming packets.
|
||||||
|
*/
|
||||||
|
#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__)
|
||||||
|
#define MAC_USE_EVENTS TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* MMC_SPI driver related settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Delays insertions.
|
||||||
|
* @details If enabled this options inserts delays into the MMC waiting
|
||||||
|
* routines releasing some extra CPU time for the threads with
|
||||||
|
* lower priority, this may slow down the driver a bit however.
|
||||||
|
* This option is recommended also if the SPI driver does not
|
||||||
|
* use a DMA channel and heavily loads the CPU.
|
||||||
|
*/
|
||||||
|
#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__)
|
||||||
|
#define MMC_NICE_WAITING TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* SDC driver related settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Number of initialization attempts before rejecting the card.
|
||||||
|
* @note Attempts are performed at 10mS intervals.
|
||||||
|
*/
|
||||||
|
#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__)
|
||||||
|
#define SDC_INIT_RETRY 100
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Include support for MMC cards.
|
||||||
|
* @note MMC support is not yet implemented so this option must be kept
|
||||||
|
* at @p FALSE.
|
||||||
|
*/
|
||||||
|
#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__)
|
||||||
|
#define SDC_MMC_SUPPORT FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Delays insertions.
|
||||||
|
* @details If enabled this options inserts delays into the MMC waiting
|
||||||
|
* routines releasing some extra CPU time for the threads with
|
||||||
|
* lower priority, this may slow down the driver a bit however.
|
||||||
|
*/
|
||||||
|
#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__)
|
||||||
|
#define SDC_NICE_WAITING TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief OCR initialization constant for V20 cards.
|
||||||
|
*/
|
||||||
|
#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__)
|
||||||
|
#define SDC_INIT_OCR_V20 0x50FF8000U
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief OCR initialization constant for non-V20 cards.
|
||||||
|
*/
|
||||||
|
#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__)
|
||||||
|
#define SDC_INIT_OCR 0x80100000U
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* SERIAL driver related settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Default bit rate.
|
||||||
|
* @details Configuration parameter, this is the baud rate selected for the
|
||||||
|
* default configuration.
|
||||||
|
*/
|
||||||
|
#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__)
|
||||||
|
#define SERIAL_DEFAULT_BITRATE 38400
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Serial buffers size.
|
||||||
|
* @details Configuration parameter, you can change the depth of the queue
|
||||||
|
* buffers depending on the requirements of your application.
|
||||||
|
* @note The default is 16 bytes for both the transmission and receive
|
||||||
|
* buffers.
|
||||||
|
*/
|
||||||
|
#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__)
|
||||||
|
#define SERIAL_BUFFERS_SIZE 32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* SERIAL_USB driver related setting. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Serial over USB buffers size.
|
||||||
|
* @details Configuration parameter, the buffer size must be a multiple of
|
||||||
|
* the USB data endpoint maximum packet size.
|
||||||
|
* @note The default is 256 bytes for both the transmission and receive
|
||||||
|
* buffers.
|
||||||
|
*/
|
||||||
|
#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
|
||||||
|
#define SERIAL_USB_BUFFERS_SIZE 256
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Serial over USB number of buffers.
|
||||||
|
* @note The default is 2 buffers.
|
||||||
|
*/
|
||||||
|
#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__)
|
||||||
|
#define SERIAL_USB_BUFFERS_NUMBER 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* SPI driver related settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables synchronous APIs.
|
||||||
|
* @note Disabling this option saves both code and data space.
|
||||||
|
*/
|
||||||
|
#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__)
|
||||||
|
#define SPI_USE_WAIT TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables circular transfers APIs.
|
||||||
|
* @note Disabling this option saves both code and data space.
|
||||||
|
*/
|
||||||
|
#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__)
|
||||||
|
#define SPI_USE_CIRCULAR FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs.
|
||||||
|
* @note Disabling this option saves both code and data space.
|
||||||
|
*/
|
||||||
|
#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
|
||||||
|
#define SPI_USE_MUTUAL_EXCLUSION TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handling method for SPI CS line.
|
||||||
|
* @note Disabling this option saves both code and data space.
|
||||||
|
*/
|
||||||
|
#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__)
|
||||||
|
#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* UART driver related settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables synchronous APIs.
|
||||||
|
* @note Disabling this option saves both code and data space.
|
||||||
|
*/
|
||||||
|
#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__)
|
||||||
|
#define UART_USE_WAIT FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs.
|
||||||
|
* @note Disabling this option saves both code and data space.
|
||||||
|
*/
|
||||||
|
#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
|
||||||
|
#define UART_USE_MUTUAL_EXCLUSION FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* USB driver related settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables synchronous APIs.
|
||||||
|
* @note Disabling this option saves both code and data space.
|
||||||
|
*/
|
||||||
|
#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)
|
||||||
|
#define USB_USE_WAIT FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* WSPI driver related settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables synchronous APIs.
|
||||||
|
* @note Disabling this option saves both code and data space.
|
||||||
|
*/
|
||||||
|
#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__)
|
||||||
|
#define WSPI_USE_WAIT TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs.
|
||||||
|
* @note Disabling this option saves both code and data space.
|
||||||
|
*/
|
||||||
|
#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
|
||||||
|
#define WSPI_USE_MUTUAL_EXCLUSION TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* HALCONF_H */
|
||||||
|
|
||||||
|
/** @} */
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2016 Stephane D'Alu
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _MCUCONF_H_
|
||||||
|
#define _MCUCONF_H_
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Board setting
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* HAL driver system settings.
|
||||||
|
*/
|
||||||
|
#define NUC123_HSE_ENABLED TRUE
|
||||||
|
#define NUC123_PLL_ENABLED TRUE
|
||||||
|
#define NUC123_PLLSRC NUC123_PLLSRC_HSE
|
||||||
|
#define NUC123_HCLKSRC NUC123_HCLKSRC_PLL
|
||||||
|
|
||||||
|
#define NUC123_MCUCONF
|
||||||
|
|
||||||
|
#endif /* _MCUCONF_H_ */
|
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
ChibiOS - Copyright (C) 2020 Alex Lewontin
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "hal.h"
|
||||||
|
#include "chprintf.h"
|
||||||
|
|
||||||
|
#define SERIAL_DRIVER SD0
|
||||||
|
|
||||||
|
#define toupper(c) __builtin_toupper(c)
|
||||||
|
|
||||||
|
char buf;
|
||||||
|
|
||||||
|
const SerialConfig scfg = {.speed = 57600,
|
||||||
|
.mode = NUC123_SERIAL_MODE_DEFAULT,
|
||||||
|
.data = NUC123_SERIAL_DATA_8BITS,
|
||||||
|
.parity = NUC123_SERIAL_PARITY_N,
|
||||||
|
.stop = NUC123_SERIAL_STOP_1};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Application entry point.
|
||||||
|
*/
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/*
|
||||||
|
* System initializations.
|
||||||
|
* - HAL initialization, this also initializes the configured device drivers
|
||||||
|
* and performs the board-specific initializations.
|
||||||
|
*/
|
||||||
|
|
||||||
|
halInit();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Enabling interrupts, initialization done.
|
||||||
|
*/
|
||||||
|
osalSysEnable();
|
||||||
|
|
||||||
|
sdStart(&SERIAL_DRIVER, &scfg);
|
||||||
|
|
||||||
|
chprintf((BaseSequentialStream *)&SERIAL_DRIVER, "\nInitialized...\n");
|
||||||
|
while (true) {
|
||||||
|
buf = streamGet((BaseSequentialStream *)&SERIAL_DRIVER);
|
||||||
|
buf = toupper(buf);
|
||||||
|
streamPut((BaseSequentialStream *)&SERIAL_DRIVER, buf);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
*****************************************************************************
|
||||||
|
** ChibiOS/HAL - SERIAL driver demo for NUC123. **
|
||||||
|
*****************************************************************************
|
||||||
|
|
||||||
|
** TARGET **
|
||||||
|
|
||||||
|
The demo runs on a NUTINY-SDK-NUC123-V2.0 board with a NUC123SD4AN0 MCU.
|
||||||
|
|
||||||
|
** The Demo **
|
||||||
|
|
||||||
|
The application demonstrates the use of the NUC123 SERIAL driver. When successful,
|
||||||
|
SD0 should be used for serial communication with another serial device. The
|
||||||
|
target board should output `\nInitialized...\n` upon power-on, and should
|
||||||
|
immediately echo any character sent to it, with the standard C function toupper
|
||||||
|
called on it.
|
||||||
|
|
||||||
|
** Board Setup **
|
||||||
|
|
||||||
|
To use an external serial interface:
|
||||||
|
- Attach a serial bus to pins 21-24, and the GND:
|
||||||
|
21 - NUC123 RX
|
||||||
|
22 - NUC123 TX
|
||||||
|
23 - NUC123 nRTS (optional)
|
||||||
|
24 - NUC123 nCTS (optional)
|
||||||
|
- Ensure that the interface is set to the same configuration as the demo
|
||||||
|
(by default 57600 8N1)
|
||||||
|
|
||||||
|
To use the ICE's on-board USB-serial interface:
|
||||||
|
- Set SW2 1-4 to ON
|
||||||
|
- Connect a USB cable from a workstation to J5
|
||||||
|
|
||||||
|
** Build Procedure **
|
||||||
|
|
||||||
|
The demo has been tested using gcc version 9.3.1 (GNU Arm Embedded Toolchain 9-2020-q2-update).
|
||||||
|
Just modify the TRGT line in the makefile in order to use different GCC ports.
|
Loading…
Reference in New Issue