Merge pull request #239 from alexclewontin/nuc123-serial-driver

[NUC123] Serial driver
This commit is contained in:
Fabien Poussin 2020-12-15 18:09:28 +01:00 committed by GitHub
commit fe9ac17b74
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 1582 additions and 5 deletions

View File

@ -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

View File

@ -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 */
/** @} */

View File

@ -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 */
/** @} */

View File

@ -107,13 +107,13 @@
#define NUC123_TIM4_NUMBER TMR3_IRQn
/*
* USART units.
* UART units.
*/
#define NUC123_USART1_HANDLER Vector70
#define NUC123_USART2_HANDLER Vector74
#define NUC123_UART0_HANDLER Vector70
#define NUC123_UART1_HANDLER Vector74
#define NUC123_USART1_NUMBER UART0_IRQn
#define NUC123_USART2_NUMBER UART1_IRQn
#define NUC123_UART0_NUMBER UART0_IRQn
#define NUC123_UART1_NUMBER UART1_IRQn
/*
* USB units.

View File

@ -15,6 +15,7 @@ endif
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/USBv1/driver.mk
include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/SERIALv1/driver.mk
# Shared variables
ALLCSRC += $(PLATFORMSRC)

View File

@ -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"

View File

@ -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 */
/** @} */

View File

@ -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_ */

View File

@ -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);
}
}

View File

@ -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.