stm32h750 started successfully

This commit is contained in:
zhangjin1996
2025-04-15 14:25:34 +08:00
parent d68fb81399
commit 32b253d3c3
13 changed files with 155 additions and 747 deletions
+2 -1
View File
@@ -38,9 +38,10 @@ void InitBoardHardware()
sys_stm32_clock_init(192, 5, 2, 4);
//delay_init(480);
InitBoardMemory((void*)HEAP_START, (void*)HEAP_END);
InitHwUart();
InitBoardMemory((void*)HEAP_START, (void*)HEAP_END);
InstallConsole(KERNEL_CONSOLE_BUS_NAME, KERNEL_CONSOLE_DRV_NAME, KERNEL_CONSOLE_DEVICE_NAME);
+3 -3
View File
@@ -21,13 +21,13 @@
#ifndef __BOARD_H__
#define __BOARD_H__
extern int __StackTop;
void InitBoardHardware();
#define HEAP_START 0x24030000
#define HEAP_END 0x24060000
#define HEAP_START (void *)(&__StackTop)
#define HEAP_END 0x24080000
-287
View File
@@ -1,287 +0,0 @@
#
# Automatically generated file; DO NOT EDIT.
# XiZi_IIoT Project Configuration
#
CONFIG_BOARD_STM32H750=y
CONFIG_ARCH_ARM=y
#
# stm32f103-nano feature
#
CONFIG_BSP_USING_UART=y
# CONFIG_BSP_USING_UART1 is not set
CONFIG_BSP_USING_UART1=y
CONFIG_SERIAL_BUS_NAME_1="uart1"
CONFIG_SERIAL_DRV_NAME_1="uart1_drv"
CONFIG_SERIAL_1_DEVICE_NAME_0="uart1_dev1"
#
# config default board resources
#
#
# config board app name
#
CONFIG_BOARD_APP_NAME="/XiUOS_stm32h750_app.bin"
#
# config board service table
#
CONFIG_SERVICE_TABLE_ADDRESS=0x24000000
#
# Hardware feature
#
CONFIG_RESOURCES_SERIAL=y
# CONFIG_SERIAL_USING_DMA is not set
CONFIG_SERIAL_RB_BUFSZ=128
CONFIG_RESOURCES_CAN=y
#
# Kernel feature
#
#
# separate compile(choose none for compile once)
#
# CONFIG_SEPARATE_COMPILE is not set
# CONFIG_COMPILER_APP is not set
# CONFIG_APP_STARTUP_FROM_SDCARD is not set
CONFIG_APP_STARTUP_FROM_FLASH=y
# CONFIG_COMPILER_KERNEL is not set
#
# Memory Management
#
# CONFIG_KERNEL_MEMBLOCK is not set
CONFIG_MEM_ALIGN_SIZE=8
# CONFIG_MEM_EXTERN_SRAM is not set
CONFIG_MM_PAGE_SIZE=4096
#
# Using small memory allocator
#
CONFIG_KERNEL_SMALL_MEM_ALLOC=y
CONFIG_SMALL_NUMBER_32B=64
CONFIG_SMALL_NUMBER_64B=32
#
# Task feature
#
CONFIG_USER_APPLICATION=y
# CONFIG_TASK_ISOLATION is not set
#
# Inter-Task communication
#
CONFIG_KERNEL_SEMAPHORE=y
CONFIG_KERNEL_MUTEX=y
CONFIG_KERNEL_EVENT=y
CONFIG_KERNEL_MESSAGEQUEUE=y
CONFIG_KERNEL_SOFTTIMER=y
CONFIG_SCHED_POLICY_RR_REMAINSLICE=y
# CONFIG_SCHED_POLICY_RR is not set
# CONFIG_SCHED_POLICY_FIFO is not set
# CONFIG_KTASK_PRIORITY_8 is not set
CONFIG_KTASK_PRIORITY_32=y
# CONFIG_KTASK_PRIORITY_256 is not set
CONFIG_KTASK_PRIORITY_MAX=32
CONFIG_TICK_PER_SECOND=1000
CONFIG_KERNEL_STACK_OVERFLOW_CHECK=y
CONFIG_IDLE_KTASK_STACKSIZE=256
CONFIG_ZOMBIE_KTASK_STACKSIZE=512
#
# Kernel Console
#
CONFIG_KERNEL_CONSOLE=y
CONFIG_KERNEL_BANNER=y
CONFIG_KERNEL_CONSOLEBUF_SIZE=128
#
# Kernel Hook
#
# CONFIG_KERNEL_HOOK is not set
#
# Command shell
#
CONFIG_TOOL_SHELL=y
CONFIG_SHELL_ENTER_CR=y
CONFIG_SHELL_ENTER_LF=y
CONFIG_SHELL_ENTER_CR_AND_LF=y
# CONFIG_SHELL_ENTER_CRLF is not set
#
# Set shell user control
#
CONFIG_SHELL_DEFAULT_USER="letter"
CONFIG_SHELL_DEFAULT_USER_PASSWORD=""
CONFIG_SHELL_LOCK_TIMEOUT=10000
#
# Set shell config param
#
CONFIG_SHELL_TASK_STACK_SIZE=512
CONFIG_SHELL_TASK_PRIORITY=20
CONFIG_SHELL_MAX_NUMBER=5
CONFIG_SHELL_PARAMETER_MAX_NUMBER=8
CONFIG_SHELL_HISTORY_MAX_NUMBER=5
CONFIG_SHELL_PRINT_BUFFER=128
CONFIG_SHELL_HELP_SHOW_PERMISSION=y
# CONFIG_SHELL_HELP_LIST_USER is not set
# CONFIG_SHELL_HELP_LIST_VAR is not set
# CONFIG_SHELL_HELP_LIST_KEY is not set
#
# Kernel data structure Manage
#
CONFIG_KERNEL_QUEUEMANAGE=y
CONFIG_KERNEL_WORKQUEUE=y
CONFIG_WORKQUEUE_KTASK_STACKSIZE=2048
CONFIG_WORKQUEUE_KTASK_PRIORITY=23
CONFIG_QUEUE_MAX=16
CONFIG_KERNEL_WAITQUEUE=y
CONFIG_KERNEL_DATAQUEUE=y
# CONFIG_KERNEL_CIRCULAR_AREA is not set
# CONFIG_KERNEL_AVL_TREE is not set
#
# Kernel components init
#
CONFIG_KERNEL_COMPONENTS_INIT=y
CONFIG_ENV_INIT_KTASK_STACK_SIZE=512
CONFIG_KERNEL_USER_MAIN=y
CONFIG_NAME_NUM_MAX=32
# CONFIG_KERNEL_DEBUG is not set
# CONFIG_ARCH_SMP is not set
#
# hash table config
#
CONFIG_ID_HTABLE_SIZE=16
CONFIG_ID_NUM_MAX=128
# CONFIG_KERNEL_TEST is not set
#
# Kernel Lib
#
CONFIG_LIB=y
CONFIG_LIB_POSIX=y
CONFIG_LIB_NEWLIB=y
# CONFIG_LIB_MUSLLIB is not set
# CONFIG_LIB_OTHER is not set
#
# C++ features
#
# CONFIG_LIB_CPLUSPLUS is not set
#
# File system
#
# CONFIG_FS_VFS is not set
#
# Tool feature
#
#
# OTA function
#
# CONFIG_TOOL_USING_OTA is not set
#
# APP_Framework
#
#
# Framework
#
CONFIG_TRANSFORM_LAYER_ATTRIUBUTE=y
CONFIG_ADD_XIZI_FEATURES=y
# CONFIG_ADD_NUTTX_FEATURES is not set
# CONFIG_ADD_RTTHREAD_FEATURES is not set
# CONFIG_SUPPORT_SENSOR_FRAMEWORK is not set
# CONFIG_SUPPORT_CONNECTION_FRAMEWORK is not set
# CONFIG_SUPPORT_KNOWING_FRAMEWORK is not set
# CONFIG_SUPPORT_CONTROL_FRAMEWORK is not set
#
# Security
#
# CONFIG_CRYPTO is not set
# CONFIG_MBEDTLS is not set
#
# Applications
#
#
# config stack size and priority of main task
#
CONFIG_MAIN_KTASK_STACK_SIZE=256
CONFIG_MAIN_KTASK_PRIORITY=16
#
# ota app
#
# CONFIG_APPLICATION_OTA is not set
#
# test app
#
# CONFIG_USER_TEST is not set
#
# connection app
#
# CONFIG_APPLICATION_CONNECTION is not set
#
# control app
#
#
# knowing app
#
# CONFIG_APPLICATION_KNOWING is not set
#
# sensor app
#
# CONFIG_APPLICATION_SENSOR is not set
# CONFIG_USING_EMBEDDED_DATABASE_APP is not set
# CONFIG_APP_USING_WEBNET is not set
#
# app lib
#
CONFIG_APP_SELECT_NEWLIB=y
# CONFIG_APP_SELECT_OTHER_LIB is not set
#
# lib using cJSON
#
# CONFIG_LIB_USING_CJSON is not set
#
# lib using queue
#
# CONFIG_LIB_USING_QUEUE is not set
#
# lib using LVGL
#
# CONFIG_LIB_LV is not set
#
# lib using embedded_database
#
# CONFIG_USING_EMBEDDED_DATABASE is not set
#
# lib using LoRaWan
#
# CONFIG_LIB_USING_LORAWAN is not set
@@ -11,7 +11,7 @@ MEMORY
OUTPUT_ARCH(arm)
ENTRY(Reset_Handler)
_system_stack_size = 0x10000;
_system_stack_size = 0x1000;
SECTIONS
{
@@ -49,19 +49,18 @@ SECTIONS
} > flash = 0
/* .ARM.exidx is sorted, so has to go in its own output section. */
__exidx_start = .;
__exidx_start = .;
.ARM.exidx :
{
PROVIDE(__exidx_start = ABSOLUTE(.));
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
/* This is used by the startup in order to initialize the .data secion */
_sidata = .;
PROVIDE(__exidx_end = ABSOLUTE(.));
} > flash
__exidx_end = .;
/* .data section which is used for initialized data */
.data : AT (_sidata)
.data : AT (__exidx_end )
{
. = ALIGN(4);
/* This is used by the startup in order to initialize the .data secion */
@@ -1,7 +1,7 @@
SRC_DIR := libraries
ifeq ($(CONFIG_BSP_USING_UART),y)
SRC_DIR += usart sys
SRC_DIR += usart sys delay
endif
include $(KERNEL_ROOT)/compiler.mk
@@ -1,157 +1,82 @@
/**
****************************************************************************************************
* @file delay.c
* @author ԭŶ(ALIENTEK)
* @version V1.1
* @date 2023-02-27
* @brief ʹSysTickͨģʽӳٽйOS)
* ṩdelay_initʼ delay_usdelay_msʱ
* @license Copyright (c) 2022-2032, ӿƼ޹˾
****************************************************************************************************
* @attention
*
* ʵƽ̨:ԭ STM32
* Ƶ:www.yuanzige.com
* ̳:www.openedv.com
* ˾ַ:www.alientek.com
* ַ:openedv.taobao.com
*
* ޸˵
* V1.0 20221222
* һη
* V1.1 20230227
* ޸SYS_SUPPORT_OSִ, ĬϽ֧UCOSII 2.93.01汾, OSοʵ
* ޸delay_initʹ8Ƶ,ȫͳһʹMCUʱ
* ޸delay_usʹʱժȡʱ, OS
* ޸delay_msֱʹdelay_usʱʵ.
*
****************************************************************************************************
*/
#include "sys.h"
#include "delay.h"
static uint32_t g_fac_us = 0; /* usʱ */
static uint32_t g_fac_us = 0;
/* SYS_SUPPORT_OSҪ֧OS(UCOS) */
#if SYS_SUPPORT_OS
/* ӹͷļ ( ucosҪõ) */
#include "os.h"
/* g_fac_ms, ʾmsʱı, ÿĵms, (ʹosʱ,Ҫõ) */
static uint16_t g_fac_ms = 0;
/*
* delay_us/delay_msҪ֧OSʱҪOSصĺ궨ͺ֧
* 3:
* delay_osrunning :ڱʾOSǰǷ,ԾǷʹغ
* delay_ostickspersec:ڱʾOSʱӽ,delay_initʼsystick
* delay_osintnesting :ڱʾOSжǶ׼,ΪжԵ,delay_msʹøò
* Ȼ3:
* delay_osschedlock :OS,ֹ
* delay_osschedunlock:ڽOS,¿
* delay_ostimedly :OSʱ,.
*
* ̽UCOSII֧,OS,вοֲ
*/
/* ֧UCOSII */
#define delay_osrunning OSRunning /* OSǷб,0,;1, */
#define delay_ostickspersec OS_TICKS_PER_SEC /* OSʱӽ,ÿȴ */
#define delay_osintnesting OSIntNesting /* жǶ׼,жǶ״ */
#define delay_osrunning OSRunning
#define delay_ostickspersec OS_TICKS_PER_SEC
#define delay_osintnesting OSIntNesting
/**
* @brief usʱʱ,ر(ֹusӳ)
* @param
* @retval
*/
void delay_osschedlock(void)
{
OSSchedLock(); /* UCOSIIķʽ,ֹȣֹusʱ */
}
OSSchedLock();
/**
* @brief usʱʱ,ָ
* @param
* @retval
*/
void delay_osschedunlock(void)
{
OSSchedUnlock(); /* UCOSIIķʽ,ָ */
OSSchedUnlock();
}
/**
* @brief usʱʱ,ָ
* @param ticks: ʱĽ
* @retval
*/
void delay_ostimedly(uint32_t ticks)
{
OSTimeDly(ticks); /* UCOSIIʱ */
OSTimeDly(ticks);
}
/**
* @brief systickжϷ,ʹOSʱõ
* @param ticks : ʱĽ
* @retval
*/
void SysTick_Handler(void)
{
/* OS ʼ,ִĵȴ */
if (delay_osrunning == OS_TRUE)
{
/* uC/OS-II SysTick жϷ */
OS_CPU_SysTickHandler();
}
HAL_IncTick();
}
#endif
/**
* @brief ʼӳٺ
* @param sysclk: ϵͳʱƵ, CPUƵ(rcc_c_ck), 480MHz
* @retval
*/
void delay_init(uint16_t sysclk)
{
#if SYS_SUPPORT_OS /* Ҫ֧OS */
#if SYS_SUPPORT_OS
uint32_t reload;
#endif
g_fac_us = sysclk; /* HAL_InitѶsystickã */
#if SYS_SUPPORT_OS /* Ҫ֧OS. */
reload = sysclk; /* ÿӵļ λΪM */
reload *= 1000000 / delay_ostickspersec; /* delay_ostickspersecʱ,reloadΪ24λ
* Ĵ,ֵ:16777216,480M0.03495s
*/
g_fac_ms = 1000 / delay_ostickspersec; /* OSʱٵλ */
SysTick->CTRL |= 1 << 1; /* SYSTICKж */
SysTick->LOAD = reload; /* ÿ1/delay_ostickspersecжһ */
SysTick->CTRL |= 1 << 0; /* SYSTICK */
g_fac_us = sysclk;
#if SYS_SUPPORT_OS
reload = sysclk;
reload *= 1000000 / delay_ostickspersec;
g_fac_ms = 1000 / delay_ostickspersec;
SysTick->CTRL |= 1 << 1;
SysTick->LOAD = reload;
SysTick->CTRL |= 1 << 0;
#endif
}
/**
* @brief ʱnus
* @note ǷʹOS, ʱժȡusʱ
* @param nus: Ҫʱus
* @note nusȡֵΧ: 0 ~ (2^32 / fac_us) (fac_usһϵͳƵ, )
* @retval
*/
void delay_us(uint32_t nus)
{
uint32_t ticks;
uint32_t told, tnow, tcnt = 0;
uint32_t reload = SysTick->LOAD; /* LOADֵ */
ticks = nus * g_fac_us; /* ҪĽ */
uint32_t reload = SysTick->LOAD;
ticks = nus * g_fac_us;
#if SYS_SUPPORT_OS /* Ҫ֧OS */
delay_osschedlock(); /* OS */
#if SYS_SUPPORT_OS
delay_osschedlock();
#endif
told = SysTick->VAL; /* սʱļֵ */
told = SysTick->VAL;
while (1)
{
tnow = SysTick->VAL;
@@ -159,7 +84,7 @@ void delay_us(uint32_t nus)
{
if (tnow < told)
{
tcnt += told - tnow; /* עһSYSTICKһݼļͿ */
tcnt += told - tnow;
}
else
{
@@ -168,46 +93,37 @@ void delay_us(uint32_t nus)
told = tnow;
if (tcnt >= ticks)
{
break; /* ʱ/Ҫӳٵʱ,˳ */
break;
}
}
}
#if SYS_SUPPORT_OS /* Ҫ֧OS */
delay_osschedunlock(); /* ָ OS */
#if SYS_SUPPORT_OS
delay_osschedunlock();
#endif
}
/**
* @brief ʱnms
* @param nms: Ҫʱms (0< nms <= (2^32 / fac_us / 1000))(fac_usһϵͳƵ, )
* @retval
*/
void delay_ms(uint16_t nms)
{
#if SYS_SUPPORT_OS /* Ҫ֧OS, osʱͷCPU */
if (delay_osrunning && delay_osintnesting == 0) /* OSѾ,Ҳж(ж) */
#if SYS_SUPPORT_OS
if (delay_osrunning && delay_osintnesting == 0)
{
if (nms >= g_fac_ms) /* ʱʱOSʱ */
if (nms >= g_fac_ms)
{
delay_ostimedly(nms / g_fac_ms); /* OSʱ */
delay_ostimedly(nms / g_fac_ms);
}
nms %= g_fac_ms; /* OSѾ޷ôСʱ,ͨʽʱ */
nms %= g_fac_ms;
}
#endif
delay_us((uint32_t)(nms * 1000)); /* ͨʽʱ */
delay_us((uint32_t)(nms * 1000));
}
/**
* @brief HALڲõʱ
* @note HALʱĬSystickûпSystickжϻᵼµʱ޷˳
* @param Delay : Ҫʱĺ
* @retval None
*/
void HAL_Delay(uint32_t Delay)
{
delay_ms(Delay);
@@ -34,9 +34,9 @@
#include "sys.h"
void delay_init(uint16_t sysclk); /* ʼӳٺ */
void delay_ms(uint16_t nms); /* ʱnms */
void delay_us(uint32_t nus); /* ʱnus */
void delay_init(uint16_t sysclk);
void delay_ms(uint16_t nms);
void delay_us(uint32_t nus);
#endif
@@ -1,22 +1,3 @@
/**
****************************************************************************************************
* @file sys.h
* @author ԭŶ(ALIENTEK)
* @version V1.0
* @date 2023-06-12
* @brief ϵͳʼ
* @license Copyright (c) 2020-2032, ӿƼ޹˾
****************************************************************************************************
* @attention
*
* ʵƽ̨:ԭ H750
* Ƶ:www.yuanzige.com
* ̳:www.openedv.com
* ˾ַ:www.alientek.com
* ַ:openedv.taobao.com
*
****************************************************************************************************
*/
#ifndef __SYS_H
#define __SYS_H
@@ -24,19 +5,15 @@
#include "stm32h7xx_hal.h"
#include "stm32h7xx_hal_rcc_ex.h"
/**
* SYS_SUPPORT_OSڶϵͳļǷ֧OS
* 0,֧OS
* 1,֧OS
*/
#define SYS_SUPPORT_OS 0
/* øʱ */
extern RCC_PeriphCLKInitTypeDef rcc_periph_clk_init_struct;
/* */
void sys_cache_enable(void); /* ʹSTM32H7L1-Cache */
uint8_t sys_stm32_clock_init(uint32_t plln, uint32_t pllm, uint32_t pllp, uint32_t pllq); /* ʱ */
void sys_qspi_enable_memmapmode(void); /* ʹQSPIڴӳģʽ */
void sys_cache_enable(void);
uint8_t sys_stm32_clock_init(uint32_t plln, uint32_t pllm, uint32_t pllp, uint32_t pllq);
void sys_qspi_enable_memmapmode(void);
#endif
@@ -1,28 +1,4 @@
/**
****************************************************************************************************
* @file usart.h
* @author ԭŶ(ALIENTEK)
* @version V1.1
* @date 2023-06-05
* @brief ڳʼ(һǴ1)֧printf
* @license Copyright (c) 2020-2032, ӿƼ޹˾
****************************************************************************************************
* @attention
*
* ʵƽ̨:ԭ STM32H750
* Ƶ:www.yuanzige.com
* ̳:www.openedv.com
* ˾ַ:www.alientek.com
* ַ:openedv.taobao.com
*
* ޸˵
* V1.0 20200312
* һη
* V1.1 20230605
* ɾUSART_UX_IRQHandler()ijʱ޸HAL_UART_RxCpltCallback()
*
****************************************************************************************************
*/
#ifndef _USART_H
#define _USART_H
@@ -31,41 +7,36 @@
#include "sys.h"
#include "stm32h7xx_hal_rcc.h"
/*******************************************************************************************************/
/*
* ĬUSART1.
* ע: ͨ޸12,֧USART1~UART7һ.
*/
#define USART_TX_GPIO_PORT GPIOA
#define USART_TX_GPIO_PIN GPIO_PIN_9
#define USART_TX_GPIO_AF GPIO_AF7_USART1
#define USART_TX_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* ʱʹ */
#define USART_TX_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)
#define USART_RX_GPIO_PORT GPIOA
#define USART_RX_GPIO_PIN GPIO_PIN_10
#define USART_RX_GPIO_AF GPIO_AF7_USART1
#define USART_RX_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* ʱʹ */
#define USART_RX_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)
#define USART_UX USART1
#define USART_UX_IRQn USART1_IRQn
#define USART_UX_IRQHandler USART1_IRQHandler
#define USART_UX_CLK_ENABLE() do{ __HAL_RCC_USART1_CLK_ENABLE(); }while(0) /* USART1 ʱʹ */
/*******************************************************************************************************/
#define USART_REC_LEN 200 /* ֽ 200 */
#define USART_EN_RX 1 /* ʹܣ1/ֹ01 */
#define RXBUFFERSIZE 1 /* С */
extern UART_HandleTypeDef g_uart1_handle; /* UART */
extern uint8_t g_usart_rx_buf[USART_REC_LEN]; /* ջ,USART_REC_LENֽֽΪз */
extern uint16_t g_usart_rx_sta; /* ״̬ */
extern uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HALUSARTBuffer */
#define USART_UX_CLK_ENABLE() do{ __HAL_RCC_USART1_CLK_ENABLE(); }while(0)
void usart_init(uint32_t baudrate); /* ڳʼ */
#define USART_REC_LEN 200
#define USART_EN_RX 1
#define RXBUFFERSIZE 1
extern UART_HandleTypeDef g_uart1_handle;
extern uint8_t g_usart_rx_buf[USART_REC_LEN];
extern uint16_t g_usart_rx_sta;
extern uint8_t g_rx_buffer[RXBUFFERSIZE];
void usart_init(uint32_t baudrate);
#endif
@@ -1,22 +1,3 @@
/**
****************************************************************************************************
* @file sys.c
* @author ԭŶ(ALIENTEK)
* @version V1.0
* @date 2023-06-12
* @brief ϵͳʼ
* @license Copyright (c) 2020-2032, ӿƼ޹˾
****************************************************************************************************
* @attention
*
* ʵƽ̨:ԭ H750
* Ƶ:www.yuanzige.com
* ̳:www.openedv.com
* ˾ַ:www.alientek.com
* ?:openedv.taobao.com
*
****************************************************************************************************
*/
#include "sys.h"
#include "stm32h7xx_hal_rcc.h"
@@ -26,51 +7,36 @@
#include "stm32h7xx_hal_pwr.h"
#include "stm32h7xx_hal_flash_ex.h"
#include "stm32h7xx_hal_gpio.h"
/* øʱ */
RCC_PeriphCLKInitTypeDef rcc_periph_clk_init_struct = {0};
void sys_cache_enable(void)
{
SCB_EnableICache(); /* ʹÄÜI-Cache */
SCB_EnableDCache(); /* ʹÄÜD-Cache */
SCB->CACR |= SCB_CACR_FORCEWT_Msk; /* ʹÄÜD-CacheÇ¿ÖÆÍ¸Ð´ */
SCB_EnableICache();
SCB_EnableDCache();
SCB->CACR |= SCB_CACR_FORCEWT_Msk;
}
/**
* @brief ???????
* @param plln: PLL1???????????????4~512??
* @param pllm: PLL1???衤?????????????1~63??
* @param pllp: PLL1??P??????????????????2~128?????????
* @param pllq: PLL1??Q??????????????????1~128??
* @note ??????????????25MHz???????????plln=192 pllm=5 pllp=2 pllq=4
* @retval ???????
* @arg 0: ????
* @arg 1: ??
*/
uint8_t sys_stm32_clock_init(uint32_t plln, uint32_t pllm, uint32_t pllp, uint32_t pllq)
{
RCC_OscInitTypeDef rcc_osc_init_struct = {0};
RCC_ClkInitTypeDef rcc_clk_init_struct = {0};
/* ΪLDO SupplyʽΪں򹩵 */
HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
/* ΪVOS01.26V~1.40V */
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY));
__HAL_RCC_SYSCFG_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY));
/* PLL1ʹHSI48
* PLL1ʱԴHSEhse_ck
* PLL1 Ppll1_p_ck = hse_ck / pllm * plln / pllp
* PLL1 Qpll1_q_ck = hse_ck / pllm * plln / pllq
* PLL1 Rpll1_r_ck = hse_ck / pllm * plln / 2
*/
rcc_osc_init_struct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI48;
rcc_osc_init_struct.HSEState = RCC_HSE_ON;
rcc_osc_init_struct.HSI48State = RCC_HSI48_ON;
@@ -88,16 +54,7 @@ uint8_t sys_stm32_clock_init(uint32_t plln, uint32_t pllm, uint32_t pllp, uint32
{
return 1;
}
/* CPUAHBߺAPBʱ
* ʱԴPLL1Ppll1_p_ck
* ϵͳʱӣsys_ck = pll1_p_ck
* AHBʱӣrcc_ahb_ckrcc_hclk[4:1] = sys_ck / 2
* APB1ʱӣrcc_pclk1 = rcc_ahb_ck / 2
* APB2ʱӣrcc_pclk2 = rcc_ahb_ck / 2
* APB3ʱӣrcc_pclk3 = rcc_ahb_ck / 2
* APB4ʱӣrcc_pclk4 = rcc_ahb_ck / 2
*/
rcc_clk_init_struct.ClockType = RCC_CLOCKTYPE_SYSCLK |
RCC_CLOCKTYPE_HCLK |
RCC_CLOCKTYPE_D1PCLK1 |
@@ -113,12 +70,7 @@ uint8_t sys_stm32_clock_init(uint32_t plln, uint32_t pllm, uint32_t pllp, uint32
rcc_clk_init_struct.APB4CLKDivider = RCC_APB4_DIV2;
HAL_RCC_ClockConfig(&rcc_clk_init_struct, FLASH_LATENCY_4);
/* PLL2
* ʱԴHSEhse_ck
* Ppll2_p_ck = hse_ck / 5 * 192 / 12
* Qpll2_q_ck = hse_ck / 5 * 192 / 2
* Rpll2_r_ck = hse_ck / 5 * 192 / 2
*/
rcc_periph_clk_init_struct.PeriphClockSelection = RCC_PERIPHCLK_PLL2_DIVP |
RCC_PERIPHCLK_PLL2_DIVQ |
RCC_PERIPHCLK_PLL2_DIVR;
@@ -132,21 +84,16 @@ uint8_t sys_stm32_clock_init(uint32_t plln, uint32_t pllm, uint32_t pllp, uint32
rcc_periph_clk_init_struct.PLL2.PLL2FRACN = 0;
HAL_RCCEx_PeriphCLKConfig(&rcc_periph_clk_init_struct);
/* ʹQSPIڴӳģʽ */
sys_qspi_enable_memmapmode();
/* ʹI/OԪ */
HAL_SYSCFG_CompensationCodeSelect(SYSCFG_CELL_CODE);
HAL_EnableCompensationCell();
return 0;
}
/**
* @brief ʹQSPIڴӳģʽ
* @param
* @retval
*/
void sys_qspi_enable_memmapmode(void)
{
QSPI_HandleTypeDef qspi_handle = {0};
@@ -155,7 +102,7 @@ void sys_qspi_enable_memmapmode(void)
QSPI_MemoryMappedTypeDef qspi_memory_mapped_struct = {0};
MPU_Region_InitTypeDef mpu_region_init_struct = {0};
/* ʼQSPI */
qspi_handle.Instance = QUADSPI;
qspi_handle.Init.ClockPrescaler = 2 - 1;
qspi_handle.Init.FifoThreshold = 32;
@@ -167,8 +114,7 @@ void sys_qspi_enable_memmapmode(void)
qspi_handle.Init.DualFlash = QSPI_DUALFLASH_DISABLE;
HAL_QSPI_DeInit(&qspi_handle);
HAL_QSPI_Init(&qspi_handle);
/* дʹFlash06h */
qspi_command_struct.InstructionMode = QSPI_INSTRUCTION_1_LINE;
qspi_command_struct.Instruction = 0x06;
qspi_command_struct.AddressMode = QSPI_ADDRESS_NONE;
@@ -180,7 +126,6 @@ void sys_qspi_enable_memmapmode(void)
qspi_command_struct.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
HAL_QSPI_Command(&qspi_handle, &qspi_command_struct, HAL_QSPI_TIMEOUT_DEFAULT_VALUE);
/* ѯȴFlashдʹܣ05h */
qspi_command_struct.InstructionMode = QSPI_INSTRUCTION_1_LINE;
qspi_command_struct.Instruction = 0x05;
qspi_command_struct.AddressMode = QSPI_ADDRESS_NONE;
@@ -198,7 +143,7 @@ void sys_qspi_enable_memmapmode(void)
qspi_autopolling_struct.AutomaticStop = QSPI_AUTOMATIC_STOP_ENABLE;
HAL_QSPI_AutoPolling(&qspi_handle, &qspi_command_struct, &qspi_autopolling_struct, HAL_QSPI_TIMEOUT_DEFAULT_VALUE);
/* MPUQSPIڴӳ */
mpu_region_init_struct.Enable = MPU_REGION_ENABLE;
mpu_region_init_struct.Number = MPU_REGION_NUMBER0;
mpu_region_init_struct.BaseAddress = QSPI_BASE;
@@ -214,7 +159,7 @@ void sys_qspi_enable_memmapmode(void)
HAL_MPU_ConfigRegion(&mpu_region_init_struct);
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
/* FlashݿڿٶEBhڴӳģʽ */
qspi_command_struct.InstructionMode = QSPI_INSTRUCTION_1_LINE;
qspi_command_struct.Instruction = 0xEB;
qspi_command_struct.AddressMode = QSPI_ADDRESS_4_LINES;
@@ -229,36 +174,24 @@ void sys_qspi_enable_memmapmode(void)
HAL_QSPI_MemoryMapped(&qspi_handle, &qspi_command_struct, &qspi_memory_mapped_struct);
}
/**
* @brief HALQSPIʼMSP
* @param
* @retval
*/
void HAL_QSPI_MspInit(QSPI_HandleTypeDef *hqspi)
{
GPIO_InitTypeDef gpio_init_struct;
if (hqspi->Instance == QUADSPI)
{
/* ʱ */
rcc_periph_clk_init_struct.PeriphClockSelection |= RCC_PERIPHCLK_QSPI;
rcc_periph_clk_init_struct.QspiClockSelection = RCC_QSPICLKSOURCE_D1HCLK;
HAL_RCCEx_PeriphCLKConfig(&rcc_periph_clk_init_struct);
/* ʹʱ */
__HAL_RCC_QSPI_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
/* ʼGPIO
* QSPI Signal MCU Pin
* QUADSPI_BK1_IO0 <--> PF8
* QUADSPI_BK1_IO1 <--> PF9
* QUADSPI_BK1_IO2 <--> PF7
* QUADSPI_BK1_IO3 <--> PF6
* QUADSPI_BK1_NCS <--> PB6
* QUADSPI_CLK <--> PB2
*/
gpio_init_struct.Pin = GPIO_PIN_6;
gpio_init_struct.Mode = GPIO_MODE_AF_PP;
gpio_init_struct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
@@ -280,27 +213,14 @@ void HAL_QSPI_MspInit(QSPI_HandleTypeDef *hqspi)
}
}
/**
* @brief HALQSPIʼMSP
* @param
* @retval
*/
void HAL_QSPI_MspDeInit(QSPI_HandleTypeDef* hqspi)
{
if (hqspi->Instance == QUADSPI)
{
/* ʹʱ */
__HAL_RCC_QSPI_CLK_DISABLE();
/* ʼGPIO
* QSPI Signal MCU Pin
* QUADSPI_BK1_IO0 <--> PF8
* QUADSPI_BK1_IO1 <--> PF9
* QUADSPI_BK1_IO2 <--> PF7
* QUADSPI_BK1_IO3 <--> PF6
* QUADSPI_BK1_NCS <--> PB6
* QUADSPI_CLK <--> PB2
*/
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_2 | GPIO_PIN_6);
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9);
}
@@ -94,7 +94,6 @@ void UartIsr1(int vector, void *param)
DECLARE_HW_IRQ(USART1_IRQn, UartIsr1, NONE);
static uint32 SerialInit(struct SerialDriver *serial_drv, struct BusConfigureInfo *configure_info)
{
NULL_PARAM_CHECK(serial_drv);
@@ -117,58 +116,15 @@ static uint32 SerialInit(struct SerialDriver *serial_drv, struct BusConfigureInf
// config serial receive sem timeout
dev_param->serial_timeout = serial_cfg->data_cfg.serial_timeout;
serial_hw_cfg->uart_handle.Instance = serial_hw_cfg->uart_device;
serial_hw_cfg->uart_handle.Init.BaudRate = serial_cfg->data_cfg.serial_baud_rate;
serial_hw_cfg->uart_handle.Instance = USART_UX;
serial_hw_cfg->uart_handle.Init.BaudRate = 115200;
serial_hw_cfg->uart_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
serial_hw_cfg->uart_handle.Init.Mode = UART_MODE_TX_RX;
serial_hw_cfg->uart_handle.Init.OverSampling = UART_OVERSAMPLING_16;
switch (serial_cfg->data_cfg.serial_data_bits)
{
case DATA_BITS_8:
if (serial_cfg->data_cfg.serial_parity_mode == PARITY_ODD || serial_cfg->data_cfg.serial_parity_mode == PARITY_EVEN)
serial_hw_cfg->uart_handle.Init.WordLength = UART_WORDLENGTH_9B;
else
serial_hw_cfg->uart_handle.Init.WordLength = UART_WORDLENGTH_8B;
break;
case DATA_BITS_9:
serial_hw_cfg->uart_handle.Init.WordLength = UART_WORDLENGTH_9B;
break;
default:
serial_hw_cfg->uart_handle.Init.WordLength = UART_WORDLENGTH_8B;
break;
}
switch (serial_cfg->data_cfg.serial_stop_bits)
{
case STOP_BITS_1:
serial_hw_cfg->uart_handle.Init.StopBits = UART_STOPBITS_1;
break;
case STOP_BITS_2:
serial_hw_cfg->uart_handle.Init.StopBits = UART_STOPBITS_2;
break;
default:
serial_hw_cfg->uart_handle.Init.StopBits = UART_STOPBITS_1;
break;
}
switch (serial_cfg->data_cfg.serial_parity_mode)
{
case PARITY_NONE:
serial_hw_cfg->uart_handle.Init.Parity = UART_PARITY_NONE;
break;
case PARITY_ODD:
serial_hw_cfg->uart_handle.Init.Parity = UART_PARITY_ODD;
break;
case PARITY_EVEN:
serial_hw_cfg->uart_handle.Init.Parity = UART_PARITY_EVEN;
break;
default:
serial_hw_cfg->uart_handle.Init.Parity = UART_PARITY_NONE;
break;
}
usart_init(115200);
serial_hw_cfg->uart_handle.Init.WordLength = UART_WORDLENGTH_8B;
serial_hw_cfg->uart_handle.Init.Parity = UART_PARITY_NONE;
serial_hw_cfg->uart_handle.Init.StopBits = UART_STOPBITS_1;
usart_init(115200);
return EOK;
}
@@ -229,12 +185,11 @@ static int SerialPutChar(struct SerialHardwareDevice *serial_dev, char c)
{
struct SerialCfgParam *serial_cfg = (struct SerialCfgParam *)serial_dev->private_data;
struct Stm32UartHwCfg *serial_hw_cfg = (struct Stm32UartHwCfg *)serial_cfg->hw_cfg.private_data;
/* Polling mode. */
HAL_UART_Transmit(&(serial_hw_cfg->uart_handle), (uint8_t *)&c, 1, 100);
// UART_INSTANCE_CLEAR_FUNCTION(&(serial_hw_cfg->uart_handle), UART_FLAG_TC);
// serial_hw_cfg->uart_handle.Instance->TDR = c;
// while (__HAL_UART_GET_FLAG(&(serial_hw_cfg->uart_handle), UART_FLAG_TC) == RESET);
while ((serial_hw_cfg->uart_handle.Instance->ISR & 0X40) == 0);
serial_hw_cfg->uart_handle.Instance->TDR = (uint8_t)c;
return EOK;
}
@@ -1,133 +1,89 @@
/**
****************************************************************************************************
* @file usart.c
* @author ԭŶ(ALIENTEK)
* @version V1.1
* @date 2023-06-05
* @brief ڳʼ(һǴ1)֧printf
* @license Copyright (c) 2020-2032, ӿƼ޹˾
****************************************************************************************************
* @attention
*
* ʵƽ̨:ԭ STM32H750
* Ƶ:www.yuanzige.com
* ̳:www.openedv.com
* ˾ַ:www.alientek.com
* ַ:openedv.taobao.com
*
* ޸˵
* V1.0 20200312
* һη
* V1.1 20230605
* ɾUSART_UX_IRQHandler()ijʱ޸HAL_UART_RxCpltCallback()
*
****************************************************************************************************
*/
#include "sys.h"
#include "usart.h"
#include "stm32h7xx_hal_gpio.h"
#include "stm32h7xx_hal_cortex.h"
/* ջ, USART_REC_LENֽ. */
uint8_t g_usart_rx_buf[USART_REC_LEN];
/* ״̬
* bit15 ɱ־
* bit14 յ0x0d
* bit13~0 յЧֽĿ
*/
uint16_t g_usart_rx_sta = 0;
uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HALʹõĴڽջ */
uint8_t g_rx_buffer[RXBUFFERSIZE];
UART_HandleTypeDef g_uart1_handle;
UART_HandleTypeDef g_uart1_handle; /* UART */
/**
* @brief Xʼ
* @param baudrate: , ԼҪòֵ
* @note ע: ȷʱԴ, 򴮿ڲʾͻ쳣.
* USARTʱԴsys_stm32_clock_init()Ѿù.
* @retval
*/
void usart_init(uint32_t baudrate)
{
g_uart1_handle.Instance = USART_UX; /* USART1 */
g_uart1_handle.Init.BaudRate = baudrate; /* */
g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ֳΪ8λݸʽ */
g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* һֹͣλ */
g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* żУλ */
g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* Ӳ */
g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* շģʽ */
HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()ʹUART1 */
g_uart1_handle.Instance = USART_UX;
g_uart1_handle.Init.BaudRate = baudrate;
g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B;
g_uart1_handle.Init.StopBits = UART_STOPBITS_1;
g_uart1_handle.Init.Parity = UART_PARITY_NONE;
g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
g_uart1_handle.Init.Mode = UART_MODE_TX_RX;
HAL_UART_Init(&g_uart1_handle);
/* úжϣ־λUART_IT_RXNEýջԼջ */
HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
}
/**
* @brief UARTײʼ
* @param huart: UARTָ
* @note ˺ᱻHAL_UART_Init()
* ʱʹܣãж
* @retval
*/
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef gpio_init_struct;
if(huart->Instance == USART1) /* Ǵ1д1 MSPʼ */
if(huart->Instance == USART1)
{
rcc_periph_clk_init_struct.PeriphClockSelection |= RCC_PERIPHCLK_USART1;
rcc_periph_clk_init_struct.Usart16ClockSelection = RCC_USART16CLKSOURCE_PCLK2;
HAL_RCCEx_PeriphCLKConfig(&rcc_periph_clk_init_struct);
USART_UX_CLK_ENABLE(); /* USART1 ʱʹ */
USART_TX_GPIO_CLK_ENABLE(); /* ʱʹ */
USART_RX_GPIO_CLK_ENABLE(); /* ʱʹ */
USART_UX_CLK_ENABLE();
USART_TX_GPIO_CLK_ENABLE();
USART_RX_GPIO_CLK_ENABLE();
gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TX */
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* */
gpio_init_struct.Pull = GPIO_PULLUP; /* */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* */
gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ΪUSART1 */
HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* ʼ */
gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RX */
gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ΪUSART1 */
HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* ʼ */
gpio_init_struct.Pin = USART_TX_GPIO_PIN;
gpio_init_struct.Mode = GPIO_MODE_AF_PP;
gpio_init_struct.Pull = GPIO_PULLUP;
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
gpio_init_struct.Alternate = USART_TX_GPIO_AF;
HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct);
gpio_init_struct.Pin = USART_RX_GPIO_PIN;
gpio_init_struct.Alternate = USART_RX_GPIO_AF;
HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct);
#if USART_EN_RX
HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* ʹUSART1жͨ */
HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ռȼ3ȼ3 */
#endif
HAL_NVIC_EnableIRQ(USART_UX_IRQn);
HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3);
#endif
}
}
/**
* @brief Rxص
* @param huart: UARTָ
* @retval
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1) /* Ǵ1 */
if(huart->Instance == USART1)
{
if((g_usart_rx_sta & 0x8000) == 0) /* δ */
if((g_usart_rx_sta & 0x8000) == 0)
{
if(g_usart_rx_sta & 0x4000) /* յ0x0d */
if(g_usart_rx_sta & 0x4000)
{
if(g_rx_buffer[0] != 0x0a)
{
g_usart_rx_sta = 0; /* մ,¿ʼ */
g_usart_rx_sta = 0;
}
else
{
g_usart_rx_sta |= 0x8000; /* */
g_usart_rx_sta |= 0x8000;
}
}
else /* ûյ0X0D */
else
{
if(g_rx_buffer[0] == 0x0d)
{
@@ -139,7 +95,7 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
g_usart_rx_sta++;
if(g_usart_rx_sta > (USART_REC_LEN - 1))
{
g_usart_rx_sta = 0; /* ݴ,¿ʼ */
g_usart_rx_sta = 0;
}
}
}