Шаблон проекта с моей расширенной библиотекой MyLibs
This commit is contained in:
179
platform/retarget/retarget.c
Normal file
179
platform/retarget/retarget.c
Normal file
@@ -0,0 +1,179 @@
|
||||
/*==============================================================================
|
||||
* Перенаправление printf(). Переопределение системных функций.
|
||||
*------------------------------------------------------------------------------
|
||||
* НИИЭТ, Богдан Колбов <kolbov@niiet.ru>
|
||||
*==============================================================================
|
||||
* ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО
|
||||
* ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ ТОВАРНОЙ
|
||||
* ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ
|
||||
* НАРУШЕНИЙ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ. ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
|
||||
* ПРЕДНАЗНАЧЕНО ДЛЯ ОЗНАКОМИТЕЛЬНЫХ ЦЕЛЕЙ И НАПРАВЛЕНО ТОЛЬКО НА
|
||||
* ПРЕДОСТАВЛЕНИЕ ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ О ПРОДУКТЕ, С ЦЕЛЬЮ СОХРАНИТЬ ВРЕМЯ
|
||||
* ПОТРЕБИТЕЛЮ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ
|
||||
* ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА ПРЯМОЙ ИЛИ КОСВЕННЫЙ УЩЕРБ, ИЛИ
|
||||
* ПО ИНЫМ ТРЕБОВАНИЯМ, ВОЗНИКШИМ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
|
||||
* ИЛИ ИНЫХ ДЕЙСТВИЙ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
|
||||
*
|
||||
* 2018 АО "НИИЭТ"
|
||||
*==============================================================================
|
||||
*/
|
||||
|
||||
//-- Includes ------------------------------------------------------------------
|
||||
#include "retarget_conf.h"
|
||||
|
||||
//-- Functions -----------------------------------------------------------------
|
||||
#ifdef RETARGET
|
||||
|
||||
#if defined(__GNUC__)
|
||||
|
||||
int _write(int fd, char* ptr, int len)
|
||||
{
|
||||
(void)fd;
|
||||
int i = 0;
|
||||
|
||||
while (ptr[i] && (i < len)) {
|
||||
retarget_put_char((int)ptr[i]);
|
||||
if (ptr[i] == '\n') {
|
||||
retarget_put_char((int)'\r');
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
void _ttywrch(int ch)
|
||||
{
|
||||
retarget_put_char(ch);
|
||||
}
|
||||
|
||||
int _read(int file, char* ptr, int len)
|
||||
{
|
||||
(void)file;
|
||||
int i = 0;
|
||||
|
||||
for (/* Empty */; len > 0; --len) {
|
||||
char c = (char)retarget_get_char();
|
||||
*ptr++ = c;
|
||||
++i;
|
||||
if (c == '\n')
|
||||
break;
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
#elif defined(__ICCARM__)
|
||||
|
||||
#include <yfuns.h>
|
||||
|
||||
size_t __write(int handle, const unsigned char* buffer, size_t size)
|
||||
{
|
||||
size_t nChars = 0;
|
||||
|
||||
if (buffer == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (handle != _LLIO_STDOUT && handle != _LLIO_STDERR) {
|
||||
return _LLIO_ERROR;
|
||||
}
|
||||
|
||||
for (; size != 0; --size) {
|
||||
if (retarget_put_char(*buffer++) < 0) {
|
||||
return _LLIO_ERROR;
|
||||
}
|
||||
|
||||
++nChars;
|
||||
}
|
||||
return nChars;
|
||||
}
|
||||
|
||||
size_t __read(int handle, unsigned char* buffer, size_t size)
|
||||
{
|
||||
int nChars = 0;
|
||||
|
||||
if (handle != _LLIO_STDIN) {
|
||||
return _LLIO_ERROR;
|
||||
}
|
||||
|
||||
for (; size > 0; --size) {
|
||||
int c = retarget_get_char();
|
||||
if (c < 0)
|
||||
break;
|
||||
|
||||
*buffer++ = c;
|
||||
++nChars;
|
||||
}
|
||||
|
||||
return nChars;
|
||||
}
|
||||
|
||||
#elif defined(__CC_ARM)
|
||||
|
||||
#include <rt_misc.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#pragma import(__use_no_semihosting_swi)
|
||||
|
||||
#ifdef __DBG_ITM
|
||||
volatile int ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* CMSIS Debug Input */
|
||||
#endif
|
||||
|
||||
struct __FILE {
|
||||
int handle; /* Add whatever you need here */
|
||||
};
|
||||
FILE __stdout;
|
||||
FILE __stdin;
|
||||
|
||||
int fputc(int c, FILE* f)
|
||||
{
|
||||
#ifdef __DBG_ITM
|
||||
ITM_SendChar(c);
|
||||
return 0;
|
||||
#else
|
||||
return (retarget_put_char(c));
|
||||
#endif
|
||||
}
|
||||
|
||||
int fgetc(FILE* f)
|
||||
{
|
||||
return (retarget_get_char());
|
||||
}
|
||||
|
||||
int ferror(FILE* f)
|
||||
{
|
||||
/* Your implementation of ferror */
|
||||
return EOF;
|
||||
}
|
||||
|
||||
void _ttywrch(int c)
|
||||
{
|
||||
#ifdef __DBG_ITM
|
||||
ITM_SendChar(c);
|
||||
#else
|
||||
retarget_put_char(c);
|
||||
#endif
|
||||
}
|
||||
|
||||
void _sys_exit(int return_code)
|
||||
{
|
||||
label:
|
||||
goto label; /* endless loop */
|
||||
}
|
||||
|
||||
#elif defined(__CMCPPARM__)
|
||||
/* Serial port UART as STDIN/STDOUT */
|
||||
|
||||
FILE hRetarget = {
|
||||
_STREAM_RW,
|
||||
0,
|
||||
retarget_get_char,
|
||||
retarget_put_char,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#endif //RETARGET
|
||||
108
platform/retarget/retarget_conf.c
Normal file
108
platform/retarget/retarget_conf.c
Normal file
@@ -0,0 +1,108 @@
|
||||
/*==============================================================================
|
||||
* Перенаправление printf() для К1921ВК035
|
||||
*------------------------------------------------------------------------------
|
||||
* НИИЭТ, Богдан Колбов <kolbov@niiet.ru>
|
||||
*==============================================================================
|
||||
* ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО
|
||||
* ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ ТОВАРНОЙ
|
||||
* ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ
|
||||
* НАРУШЕНИЙ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ. ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
|
||||
* ПРЕДНАЗНАЧЕНО ДЛЯ ОЗНАКОМИТЕЛЬНЫХ ЦЕЛЕЙ И НАПРАВЛЕНО ТОЛЬКО НА
|
||||
* ПРЕДОСТАВЛЕНИЕ ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ О ПРОДУКТЕ, С ЦЕЛЬЮ СОХРАНИТЬ ВРЕМЯ
|
||||
* ПОТРЕБИТЕЛЮ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ
|
||||
* ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА ПРЯМОЙ ИЛИ КОСВЕННЫЙ УЩЕРБ, ИЛИ
|
||||
* ПО ИНЫМ ТРЕБОВАНИЯМ, ВОЗНИКШИМ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
|
||||
* ИЛИ ИНЫХ ДЕЙСТВИЙ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
|
||||
*
|
||||
* 2018 АО "НИИЭТ"
|
||||
*==============================================================================
|
||||
*/
|
||||
|
||||
//-- Includes ------------------------------------------------------------------
|
||||
#include "retarget_conf.h"
|
||||
|
||||
//-- Defines -------------------------------------------------------------------
|
||||
// Trace
|
||||
#define ITM_TER_STIM0 (1 << 0) // ITM stimulus0 enable
|
||||
#define ITM_TER_STIM1 (1 << 1) // ITM stimulus1 enable
|
||||
#define ITM_TER_STIM2 (1 << 2) // ITM stimulus2 enable
|
||||
#define TPIU_SPPR_TRACEPORT 0 // TPIU Selected Pin Protocol Trace Port
|
||||
#define TPIU_SPPR_MANCHESTER 1 // TPIU Selected Pin Protocol Manchester
|
||||
#define TPIU_SPPR_NRZ 2 // TPIU Selected Pin Protocol NRZ (uart)
|
||||
#define ITM_LAR_UNLOCK 0xC5ACCE55UL
|
||||
#define ITM_TCR_TraceBusID_VAL 0x59
|
||||
|
||||
//-- Variables -----------------------------------------------------------------
|
||||
extern uint32_t SystemCoreClock;
|
||||
#if defined (__CMCPPARM__)
|
||||
extern FILE hRetarget;
|
||||
#endif
|
||||
|
||||
//-- Functions -----------------------------------------------------------------
|
||||
void retarget_init()
|
||||
{
|
||||
#if defined RETARGET && !defined RETARGET_USE_ITM
|
||||
uint32_t baud_icoef = SystemCoreClock / (16 * RETARGET_UART_BAUD);
|
||||
uint32_t baud_fcoef = ((SystemCoreClock / (16.0f * RETARGET_UART_BAUD) - baud_icoef) * 64 + 0.5f);
|
||||
uint32_t uartclk_ref = RCU_UARTCFG_UARTCFG_CLKSEL_OSICLK;
|
||||
|
||||
RCU->HCLKCFG |= RETARGET_UART_PORT_EN;
|
||||
RCU->HRSTCFG |= RETARGET_UART_PORT_EN;
|
||||
RETARGET_UART_PORT->ALTFUNCSET = (1 << RETARGET_UART_PIN_TX_POS) | (1 << RETARGET_UART_PIN_RX_POS);
|
||||
RETARGET_UART_PORT->DENSET = (1 << RETARGET_UART_PIN_TX_POS) | (1 << RETARGET_UART_PIN_RX_POS);
|
||||
|
||||
if (RCU->SYSCLKSTAT_bit.SYSSTAT == RCU_SYSCLKCFG_SYSSEL_OSECLK)
|
||||
uartclk_ref = RCU_UARTCFG_UARTCFG_CLKSEL_OSECLK;
|
||||
else if (RCU->SYSCLKSTAT_bit.SYSSTAT == RCU_SYSCLKCFG_SYSSEL_OSICLK)
|
||||
uartclk_ref = RCU_UARTCFG_UARTCFG_CLKSEL_OSICLK;
|
||||
else if (RCU->SYSCLKSTAT_bit.SYSSTAT == RCU_SYSCLKCFG_SYSSEL_PLLCLK)
|
||||
uartclk_ref = RCU_UARTCFG_UARTCFG_CLKSEL_PLLCLK;
|
||||
else if (RCU->SYSCLKSTAT_bit.SYSSTAT == RCU_SYSCLKCFG_SYSSEL_PLLDIVCLK)
|
||||
uartclk_ref = RCU_UARTCFG_UARTCFG_CLKSEL_PLLDIVCLK;
|
||||
RCU->UARTCFG[RETARGET_UART_NUM].UARTCFG = (uartclk_ref << RCU_UARTCFG_UARTCFG_CLKSEL_Pos) |
|
||||
RCU_UARTCFG_UARTCFG_CLKEN_Msk |
|
||||
RCU_UARTCFG_UARTCFG_RSTDIS_Msk;
|
||||
RETARGET_UART->IBRD = baud_icoef;
|
||||
RETARGET_UART->FBRD = baud_fcoef;
|
||||
RETARGET_UART->LCRH = UART_LCRH_FEN_Msk | (3 << UART_LCRH_WLEN_Pos);
|
||||
RETARGET_UART->CR = UART_CR_TXE_Msk | UART_CR_RXE_Msk | UART_CR_UARTEN_Msk;
|
||||
#elif defined RETARGET && defined RETARGET_USE_ITM
|
||||
RCU->TRACECFG_bit.CLKSEL = RCU_TRACECFG_CLKSEL_OSECLK;
|
||||
/* //Обычно порт трассировки включается из IDE, поэтому можно не использовать ручную инициализацию
|
||||
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
|
||||
TPI->ACPR = SRCCLK_VAL / RETARGET_ITM_BAUD - 1;
|
||||
TPI->SPPR = TPIU_SPPR_NRZ;
|
||||
TPI->FFCR &= ~(TPI_FFCR_EnFCont_Msk);
|
||||
|
||||
ITM->LAR = ITM_LAR_UNLOCK;
|
||||
ITM->TCR = (ITM_TCR_TraceBusID_VAL << ITM_TCR_TraceBusID_Pos) | ITM_TCR_DWTENA_Msk | ITM_TCR_ITMENA_Msk;
|
||||
ITM->TER = ITM_TER_STIM0;*/
|
||||
#endif //RETARGET
|
||||
}
|
||||
|
||||
int retarget_get_char()
|
||||
{
|
||||
#if defined RETARGET && !defined RETARGET_USE_ITM
|
||||
while (RETARGET_UART->FR_bit.RXFE) {
|
||||
};
|
||||
return (int)RETARGET_UART->DR_bit.DATA;
|
||||
#else
|
||||
return 0;
|
||||
#endif //RETARGET
|
||||
}
|
||||
|
||||
int retarget_put_char(int ch)
|
||||
{
|
||||
#if defined RETARGET && !defined RETARGET_USE_ITM
|
||||
while (RETARGET_UART->FR_bit.BUSY) {
|
||||
};
|
||||
RETARGET_UART->DR = ch;
|
||||
#elif defined RETARGET && defined RETARGET_USE_ITM
|
||||
ITM_SendChar(ch);
|
||||
#else
|
||||
(void)ch;
|
||||
#endif //RETARGET
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
69
platform/retarget/retarget_conf.h
Normal file
69
platform/retarget/retarget_conf.h
Normal file
@@ -0,0 +1,69 @@
|
||||
/*==============================================================================
|
||||
* Перенаправление printf() для К1921ВК035
|
||||
*------------------------------------------------------------------------------
|
||||
* НИИЭТ, Богдан Колбов <kolbov@niiet.ru>
|
||||
*==============================================================================
|
||||
* ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО
|
||||
* ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ ТОВАРНОЙ
|
||||
* ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ
|
||||
* НАРУШЕНИЙ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ. ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
|
||||
* ПРЕДНАЗНАЧЕНО ДЛЯ ОЗНАКОМИТЕЛЬНЫХ ЦЕЛЕЙ И НАПРАВЛЕНО ТОЛЬКО НА
|
||||
* ПРЕДОСТАВЛЕНИЕ ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ О ПРОДУКТЕ, С ЦЕЛЬЮ СОХРАНИТЬ ВРЕМЯ
|
||||
* ПОТРЕБИТЕЛЮ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ
|
||||
* ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА ПРЯМОЙ ИЛИ КОСВЕННЫЙ УЩЕРБ, ИЛИ
|
||||
* ПО ИНЫМ ТРЕБОВАНИЯМ, ВОЗНИКШИМ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
|
||||
* ИЛИ ИНЫХ ДЕЙСТВИЙ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
|
||||
*
|
||||
* 2018 АО "НИИЭТ"
|
||||
*==============================================================================
|
||||
*/
|
||||
|
||||
#ifndef RETARGET_CONF_H
|
||||
#define RETARGET_CONF_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
//-- Includes ------------------------------------------------------------------
|
||||
#include <stdio.h>
|
||||
#include "K1921VK035.h"
|
||||
|
||||
//-- Defines -------------------------------------------------------------------
|
||||
#ifdef RETARGET
|
||||
#ifdef RETARGET_USE_ITM
|
||||
#ifndef RETARGET_ITM_BAUD
|
||||
#define RETARGET_ITM_BAUD 2000000
|
||||
#endif
|
||||
#else
|
||||
#define RETARGET_UART UART1
|
||||
#define RETARGET_UART_NUM UART1_Num
|
||||
#define RETARGET_UART_PORT GPIOB
|
||||
#define RETARGET_UART_PORT_EN RCU_HCLKCFG_GPIOBEN_Msk
|
||||
#define RETARGET_UART_PIN_TX_POS 8
|
||||
#define RETARGET_UART_PIN_RX_POS 9
|
||||
#define RETARGET_UART_RX_IRQHandler UART1_RX_IRQHandler
|
||||
#define RETARGET_UART_RX_IRQn UART1_RX_IRQn
|
||||
#ifndef RETARGET_UART_BAUD
|
||||
#define RETARGET_UART_BAUD 115200
|
||||
#endif
|
||||
#endif
|
||||
#if defined( __CMCPPARM__ )
|
||||
#define printf(...) fprintf(&hRetarget,__VA_ARGS__);
|
||||
#define scanf(...) fscanf(&hRetarget,__VA_ARGS__);
|
||||
extern FILE hRetarget;
|
||||
#endif
|
||||
#else
|
||||
#define printf(...) ((void)0)
|
||||
#endif // RETARGET
|
||||
|
||||
//-- Functions -----------------------------------------------------------------
|
||||
void retarget_init(void);
|
||||
int retarget_get_char(void);
|
||||
int retarget_put_char(int ch);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // RETARGET_CONF_H
|
||||
Reference in New Issue
Block a user