Шаблон проекта с моей расширенной библиотекой MyLibs

This commit is contained in:
2025-12-25 10:36:35 +03:00
commit c6e1dc049f
69 changed files with 40782 additions and 0 deletions

View 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

View 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;
}

View 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