[feat] add printf component

This commit is contained in:
zhji 2024-11-09 21:37:16 +08:00
parent c43cb3bf7b
commit 01f4e20346
11 changed files with 1335 additions and 8 deletions

View File

@ -28,9 +28,11 @@ add_executable(${PROJ_NAME}.elf main.c)
target_sources(${PROJ_NAME}.elf PUBLIC start.S)
add_subdirectory(${SDK_PATH}/driver driver)
add_subdirectory(${SDK_PATH}/component component)
add_subdirectory(${BOOTLOADER_PATH}/src src)
target_link_libraries(${PROJ_NAME}.elf driver)
target_link_libraries(${PROJ_NAME}.elf component)
target_link_libraries(${PROJ_NAME}.elf src)
add_custom_command(TARGET ${PROJ_NAME}.elf POST_BUILD

View File

@ -1,24 +1,33 @@
#include "led.h"
#include "uart_log.h"
#include "stdio.h"
void system_init(void)
{
led_init(LED_PIN);
uart_log_init();
}
void led_blink(void)
{
while (1) {
led_on(LED_PIN);
led_off(LED_PIN);
}
led_on(LED_PIN);
led_off(LED_PIN);
}
extern UART_HandleTypeDef UartHandle;
int main(void)
{
system_init();
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
// __enable_irq();
led_blink();
printf("Run start ...\r\n");
while (1) {
static uint32_t count = 0;
printf("Hello World, count = %ld\r\n", count++);
led_blink();
}
return 0;
}

5
component/CMakeLists.txt Normal file
View File

@ -0,0 +1,5 @@
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/libc libc)
add_library(component STATIC)
target_link_libraries(component libc)
target_link_libraries(component driver)

View File

@ -0,0 +1,9 @@
file(GLOB FILELIST
printf.c
vsnprintf.c
)
add_library(libc STATIC ${FILELIST})
target_include_directories(libc PUBLIC ${CMAKE_CURRENT_LIST_DIR})
target_link_libraries(libc PUBLIC STM32H7xx_HAL_Driver)
target_link_libraries(libc PUBLIC board)

88
component/libc/printf.c Normal file
View File

@ -0,0 +1,88 @@
#include "uart_log.h"
#include "stdarg.h"
#include "string.h"
UART_HandleTypeDef *console = NULL;
extern UART_HandleTypeDef UartHandle;
int putchar(int c)
{
if (console == NULL) {
return 0;
}
HAL_UART_Transmit(console, (uint8_t*)&c, 0, HAL_TIMEOUT_VALUE);
return c;
}
int puts(const char *c)
{
int len;
len = strlen(c);
if (console == NULL) {
return 0;
}
HAL_UART_Transmit(console, (uint8_t*)c, len, HAL_TIMEOUT_VALUE);
return len;
}
int putstring(const char *c)
{
int len;
if (c == NULL) {
return 0;
}
len = strlen(c);
if (console == NULL) {
return 0;
}
HAL_UART_Transmit(console, (uint8_t*)c, len, HAL_TIMEOUT_VALUE);
return len;
}
#if defined(CONFIG_VSNPRINTF_NANO) && CONFIG_VSNPRINTF_NANO
int printf(const char *fmt, ...)
{
char print_buf[512];
int len;
va_list ap;
va_start(ap, fmt);
len = vsnprintf(print_buf, sizeof(print_buf), fmt, ap);
va_end(ap);
len = (len > sizeof(print_buf)) ? sizeof(print_buf) : len;
HAL_UART_Transmit(console, (uint8_t*)print_buf, len, HAL_TIMEOUT_VALUE);
return len;
}
#else
extern int console_vsnprintf(const char *fmt, va_list args);
int printf(const char *fmt, ...)
{
int len;
va_list ap;
va_start(ap, fmt);
len = console_vsnprintf(fmt, ap);
va_end(ap);
return len;
}
#endif
void uart_log_set_console(void)
{
console = &UartHandle;
}

1090
component/libc/vsnprintf.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,8 @@
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/CMSIS CMSIS)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/STM32H7xx_HAL_Driver STM32H7xx_HAL_Driver)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/board board)
add_library(driver STATIC)
target_link_libraries(driver CMSIS)
target_link_libraries(driver STM32H7xx_HAL_Driver)
target_link_libraries(driver board)

View File

@ -1,7 +1,5 @@
add_definitions(-DUSE_FULL_LL_DRIVER)
include_directories(Inc)
file(GLOB FILELIST
Src/*.c
)
@ -12,7 +10,7 @@ target_include_directories(STM32H7xx_HAL_Driver PUBLIC ${CMAKE_CURRENT_LIST_DIR}
set(CMSIS_PATH ${SDK_PATH}/driver/CMSIS)
set(CMSIS_VENDOR ST)
set(CMSIS_DEVICE stm32h7xx)
target_include_directories(STM32H7xx_HAL_Driver PRIVATE
target_include_directories(STM32H7xx_HAL_Driver PUBLIC
${CMSIS_PATH}/Core
${CMSIS_PATH}/Device/${CMSIS_VENDOR}/${CMSIS_DEVICE}/Include
)

View File

@ -0,0 +1,7 @@
file(GLOB FILELIST
*.c
)
add_library(board STATIC ${FILELIST})
target_include_directories(board PUBLIC ${CMAKE_CURRENT_LIST_DIR})
target_link_libraries(board STM32H7xx_HAL_Driver)

73
driver/board/uart_log.c Normal file
View File

@ -0,0 +1,73 @@
#include "uart_log.h"
UART_HandleTypeDef UartHandle;
extern void uart_log_set_console(void);
static void UART_LOG_Msp_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;
/*##-1- Enable peripherals and GPIO Clocks #################################*/
/* Enable GPIO TX/RX clock */
USART_LOG_TX_GPIO_CLK_ENABLE();
USART_LOG_RX_GPIO_CLK_ENABLE();
/* Select HSI as source of USARTx clocks */
RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART_LOG;
RCC_PeriphClkInit.Usart16ClockSelection = RCC_USART_LOG_CLKSOURCE_HSI;
HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);
/* Enable USARTx clock */
USART_LOG_CLK_ENABLE();
/*##-2- Configure peripheral GPIO ##########################################*/
/* UART TX GPIO pin configuration */
GPIO_InitStruct.Pin = USART_LOG_TX_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = USART_LOG_TX_AF;
HAL_GPIO_Init(USART_LOG_TX_GPIO_PORT, &GPIO_InitStruct);
/* UART RX GPIO pin configuration */
GPIO_InitStruct.Pin = USART_LOG_RX_PIN;
GPIO_InitStruct.Alternate = USART_LOG_RX_AF;
HAL_GPIO_Init(USART_LOG_RX_GPIO_PORT, &GPIO_InitStruct);
/* NVIC for USART */
HAL_NVIC_SetPriority(USART_LOG_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(USART_LOG_IRQn);
}
void uart_log_init(void)
{
UartHandle.Instance = USART_LOG;
UartHandle.Init.BaudRate = UART_LOG_BAUDRATE;
UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
UartHandle.Init.StopBits = UART_STOPBITS_1;
UartHandle.Init.Parity = UART_PARITY_NONE;
UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
UartHandle.Init.Mode = UART_MODE_TX_RX;
UartHandle.Init.ClockPrescaler = UART_PRESCALER_DIV1;
UartHandle.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
UART_LOG_Msp_Init();
if(HAL_UART_Init(&UartHandle) != HAL_OK)
{
while (1) {
}
}
/* Set the RXFIFO threshold */
HAL_UARTEx_SetRxFifoThreshold(&UartHandle, UART_RXFIFO_THRESHOLD_1_2);
/* Enable the FIFO mode */
HAL_UARTEx_EnableFifoMode(&UartHandle);
uart_log_set_console();
}

44
driver/board/uart_log.h Normal file
View File

@ -0,0 +1,44 @@
#ifndef __UART_LOG_H__
#define __UART_LOG_H__
#include "stm32h7xx_hal.h"
#define UART_LOG_BAUDRATE (2 * 1000 * 1000)
#define HAL_TIMEOUT_VALUE 0xFFFFFFFF
#define USART_LOG USART1
#define USART_LOG_CLK_ENABLE() __HAL_RCC_USART1_CLK_ENABLE()
#define USART_LOG_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define USART_LOG_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define __HAL_RCC_UART_LOG_CONFIG __HAL_RCC_USART1_CONFIG
#define RCC_UART_LOG_CLKSOURCE_HSI RCC_USART16CLKSOURCE_HSI
#define RCC_PERIPHCLK_USART_LOG RCC_PERIPHCLK_USART16
#define RCC_USART_LOG_CLKSOURCE_HSI RCC_USART16CLKSOURCE_HSI
#define USART_LOG_FORCE_RESET() __HAL_RCC_USART1_FORCE_RESET()
#define USART_LOG_RELEASE_RESET() __HAL_RCC_USART1_RELEASE_RESET()
#define USART_LOG_IRQn USART1_IRQn
#define USART_LOG_IRQHandler USART1_IRQHandler
#define USART_LOG_TX_PIN GPIO_PIN_14
#define USART_LOG_TX_GPIO_PORT GPIOB
#define USART_LOG_TX_AF GPIO_AF4_USART1
#define USART_LOG_RX_PIN GPIO_PIN_15
#define USART_LOG_RX_GPIO_PORT GPIOB
#define USART_LOG_RX_AF GPIO_AF4_USART1
#ifdef __cplusplus
extern "C" {
#endif
void uart_log_init(void);
#ifdef __cplusplus
}
#endif
#endif /* __UART_LOG_H__ */