[feat] add printf component
This commit is contained in:
parent
c43cb3bf7b
commit
01f4e20346
@ -28,9 +28,11 @@ add_executable(${PROJ_NAME}.elf main.c)
|
|||||||
target_sources(${PROJ_NAME}.elf PUBLIC start.S)
|
target_sources(${PROJ_NAME}.elf PUBLIC start.S)
|
||||||
|
|
||||||
add_subdirectory(${SDK_PATH}/driver driver)
|
add_subdirectory(${SDK_PATH}/driver driver)
|
||||||
|
add_subdirectory(${SDK_PATH}/component component)
|
||||||
add_subdirectory(${BOOTLOADER_PATH}/src src)
|
add_subdirectory(${BOOTLOADER_PATH}/src src)
|
||||||
|
|
||||||
target_link_libraries(${PROJ_NAME}.elf driver)
|
target_link_libraries(${PROJ_NAME}.elf driver)
|
||||||
|
target_link_libraries(${PROJ_NAME}.elf component)
|
||||||
target_link_libraries(${PROJ_NAME}.elf src)
|
target_link_libraries(${PROJ_NAME}.elf src)
|
||||||
|
|
||||||
add_custom_command(TARGET ${PROJ_NAME}.elf POST_BUILD
|
add_custom_command(TARGET ${PROJ_NAME}.elf POST_BUILD
|
||||||
|
|||||||
@ -1,24 +1,33 @@
|
|||||||
|
|
||||||
#include "led.h"
|
#include "led.h"
|
||||||
|
#include "uart_log.h"
|
||||||
|
#include "stdio.h"
|
||||||
|
|
||||||
void system_init(void)
|
void system_init(void)
|
||||||
{
|
{
|
||||||
led_init(LED_PIN);
|
led_init(LED_PIN);
|
||||||
|
uart_log_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
void led_blink(void)
|
void led_blink(void)
|
||||||
{
|
{
|
||||||
while (1) {
|
|
||||||
led_on(LED_PIN);
|
led_on(LED_PIN);
|
||||||
led_off(LED_PIN);
|
led_off(LED_PIN);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern UART_HandleTypeDef UartHandle;
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
system_init();
|
system_init();
|
||||||
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
|
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
|
||||||
// __enable_irq();
|
// __enable_irq();
|
||||||
|
printf("Run start ...\r\n");
|
||||||
|
while (1) {
|
||||||
|
static uint32_t count = 0;
|
||||||
|
printf("Hello World, count = %ld\r\n", count++);
|
||||||
led_blink();
|
led_blink();
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
5
component/CMakeLists.txt
Normal file
5
component/CMakeLists.txt
Normal 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)
|
||||||
9
component/libc/CMakeLists.txt
Normal file
9
component/libc/CMakeLists.txt
Normal 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
88
component/libc/printf.c
Normal 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
1090
component/libc/vsnprintf.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,8 @@
|
|||||||
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/CMSIS CMSIS)
|
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}/STM32H7xx_HAL_Driver STM32H7xx_HAL_Driver)
|
||||||
|
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/board board)
|
||||||
|
|
||||||
add_library(driver STATIC)
|
add_library(driver STATIC)
|
||||||
target_link_libraries(driver CMSIS)
|
target_link_libraries(driver CMSIS)
|
||||||
target_link_libraries(driver STM32H7xx_HAL_Driver)
|
target_link_libraries(driver STM32H7xx_HAL_Driver)
|
||||||
|
target_link_libraries(driver board)
|
||||||
|
|||||||
@ -1,7 +1,5 @@
|
|||||||
add_definitions(-DUSE_FULL_LL_DRIVER)
|
add_definitions(-DUSE_FULL_LL_DRIVER)
|
||||||
|
|
||||||
include_directories(Inc)
|
|
||||||
|
|
||||||
file(GLOB FILELIST
|
file(GLOB FILELIST
|
||||||
Src/*.c
|
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_PATH ${SDK_PATH}/driver/CMSIS)
|
||||||
set(CMSIS_VENDOR ST)
|
set(CMSIS_VENDOR ST)
|
||||||
set(CMSIS_DEVICE stm32h7xx)
|
set(CMSIS_DEVICE stm32h7xx)
|
||||||
target_include_directories(STM32H7xx_HAL_Driver PRIVATE
|
target_include_directories(STM32H7xx_HAL_Driver PUBLIC
|
||||||
${CMSIS_PATH}/Core
|
${CMSIS_PATH}/Core
|
||||||
${CMSIS_PATH}/Device/${CMSIS_VENDOR}/${CMSIS_DEVICE}/Include
|
${CMSIS_PATH}/Device/${CMSIS_VENDOR}/${CMSIS_DEVICE}/Include
|
||||||
)
|
)
|
||||||
|
|||||||
7
driver/board/CMakeLists.txt
Normal file
7
driver/board/CMakeLists.txt
Normal 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
73
driver/board/uart_log.c
Normal 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
44
driver/board/uart_log.h
Normal 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__ */
|
||||||
Loading…
Reference in New Issue
Block a user