/* * @Author: mbw * @Date: 2024-08-20 15:51:16 * @LastEditors: mbw && 1600520629@qq.com * @LastEditTime: 2024-09-12 17:14:01 * @FilePath: \USART1_Interrupt - RT-Thread\drivers\src\drv_common.c * @Description: * * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. */ /************************************************************************************************/ /** * @file common.c * @author MCU Ecosystem Development Team * @brief 通用函数或本外设相关的配置实现函数。 * * ************************************************************************************************** * @attention * Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved. * ************************************************************************************************** */ /*------------------------------------------includes--------------------------------------------*/ #include "drv_common.h" /*-------------------------------------------functions------------------------------------------*/ /** * @brief 配置HXTAL时钟参数,包含模式及驱动能力 * @param mode HXTAL模式选择 * @arg RCC_HXTAL_ON: 使能晶体模式 * @arg RCC_HXTAL_BYPASS:使能外部时钟模式 * @param hxtal_drv HXTAL驱动能力配置 * @arg RCC_HXTAL_DRIVE_LEVEL0 * @arg RCC_HXTAL_DRIVE_LEVEL1 * @arg RCC_HXTAL_DRIVE_LEVEL2 * @arg RCC_HXTAL_DRIVE_LEVEL3 * @note 当HXTAL已使能,则不能配置HXTAL时钟相关参数,需将该时钟禁止后,再进行配置。 * @retval 无 */ void bsp_rcc_hxtal_config(uint32_t mode, uint32_t hxtal_drv) { if (mode == RCC_HXTAL_ON) { /* 配置HXTAL驱动能力 */ std_rcc_hxtal_drive_config(hxtal_drv); } /* 使能HXTAL */ std_rcc_hxtal_enable(mode); /* 等待HXTAL时钟稳定 */ while(!std_rcc_get_hxtal_ready()); } /** * @brief NMI中断服务函数 * @retval 无 */ void NMI_Handler(void) { /* 清除HXTAL CSS标志 */ std_rcc_clear_flag(RCC_CLEAR_HXTALCSS); /* 切换系统时钟为RCH 2分频(8MHz) */ /* 用户可根据实际应用,实现HXTAL CSS中断处理函数 */ } /** * @brief 系统时钟配置 * @retval 无 */ void system_clock_config(void) { /* 设置Flash读访问等待时间 */ std_flash_set_latency(FLASH_LATENCY_2CLK); /* 配置HXTAL为晶体模式 */ bsp_rcc_hxtal_config(RCC_HXTAL_ON, RCC_HXTAL_DRIVE_LEVEL1); /* 配置PLL相关参数,并使能 */ std_rcc_pll_config(RCC_PLLSRC_HXTAL, RCC_PLLM_MUL4, RCC_PLLN_DIV1, RCC_PLL_DIV1);//32MHZ std_rcc_pll_enable(); while(!std_rcc_get_pll_ready()); std_rcc_pll_output_enable(); /* 设置系统时钟源为PLL */ std_rcc_set_sysclk_source(RCC_SYSCLK_SRC_PLLCLK); while(std_rcc_get_sysclk_source() != RCC_SYSCLK_SRC_STATUS_PLLCLK); /* 设置AHB分频因子 */ std_rcc_set_ahbdiv(RCC_HCLK_DIV1); /* 设置APB1、APB2分频因子 */ std_rcc_set_apb1div(RCC_PCLK1_DIV1); std_rcc_set_apb2div(RCC_PCLK2_DIV1); SystemCoreClockUpdate(); }