你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32L4R5ZI FFT 1024点速度测试

[复制链接]
pythonworld 提问时间:2018-2-23 15:20 /
本帖最后由 pythonworld 于 2018-2-23 15:52 编辑

      最近Atollic TrueSTUDIO 免费了,于是使用IDE Atollic TrueSTUDIO for STM32测试一下STM32L4R5ZI 的浮点运算能力。使用arm dsp lib中的FFT函数做1000次1024点记录运行时间,系统时钟设置为120MHz结果如下, 每次大约耗时6.343毫秒。比较STM32L4R5ZI的core mark值貌似速度不快。之前测试L432只用1.352毫秒,不知道是什么原因。L432 FFT 测试结果
附件是HEX文件,串口参数如下:
    hlpuart1.Init.BaudRate = 209700;
    hlpuart1.Init.WordLength = UART_WORDLENGTH_7B;
    hlpuart1.Init.StopBits = UART_STOPBITS_1;
    hlpuart1.Init.Parity = UART_PARITY_NONE;
    hlpuart1.Init.Mode = UART_MODE_TX_RX;
    hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
    hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
    hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
    hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
新的板子总会有坑,使用前务必先升级相关的软件尽管我都升级了,但是测试过程中还是遇到了一个坑,直接使用Cube MX设置的时钟居然程序不能运行,没有详细研究什么原因。自己设置使用内部时钟后程序才正常运行。下面时有问题的时钟的设置,不知道是否是有遇到同样问题的网友。另外,个人觉得Atollic TrueSTUDIO还是很好用的,当然最好仔细看看软件带的使用手册。
    /**Initializes the CPU, AHB and APB busses clocks
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLN = 30;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

screen

screen

L4R5.zip

下载

68.12 KB, 下载次数: 10, 下载积分: ST金币 -1

HEX +BIN

收藏 评论5 发布时间:2018-2-23 15:20

举报

5个回答
zhao.zhao 回答时间:2018-2-23 15:30:45
是个坑,HEX文件
斜阳 回答时间:2018-2-24 08:42:48
楼主要不要把工程文件传上来???
pythonworld 回答时间:2018-2-24 18:30:34
斜阳__ 发表于 2018-2-24 08:42
楼主要不要把工程文件传上来???

工程文件太大了,就不上传了,附上main.c文件。
/**
******************************************************************************
* @file           : main.c
* @brief          : Main program body
******************************************************************************
** This notice applies to any and all portions of this file
* that are not between comment pairs USER CODE BEGIN and
* USER CODE END. Other portions of this file, whether
* inserted by the user or by software development tools
* are owned by their respective copyright owners.
*
* COPYRIGHT(c) 2018 STMicroelectronics
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*   1. Redistributions of source code must retain the above copyright notice,
*      this list of conditions and the following disclaimer.
*   2. Redistributions in binary form must reproduce the above copyright notice,
*      this list of conditions and the following disclaimer in the documentation
*      and/or other materials provided with the distribution.
*   3. Neither the name of STMicroelectronics nor the names of its contributors
*      may be used to endorse or promote products derived from this software
*      without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32l4xx_hal.h"

/* USER CODE BEGIN Includes */

#include "arm_math.h"
#include "arm_const_structs.h"
#include "stdio.h"
#include "string.h"
//#include "errno.h"

#define TEST_LENGTH_SAMPLES 2048
/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
UART_HandleTypeDef hlpuart1;
UART_HandleTypeDef huart3;

PCD_HandleTypeDef hpcd_USB_OTG_FS;

/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/
/* -------------------------------------------------------------------
* External Input and Output buffer Declarations for FFT Bin Example
* ------------------------------------------------------------------- */
extern float32_t testInput_f32_10khz[TEST_LENGTH_SAMPLES];
static float32_t testOutput[TEST_LENGTH_SAMPLES / 2];
float32_t testInput_f32_10khz_fixed[TEST_LENGTH_SAMPLES];
/* ------------------------------------------------------------------
* Global variables for FFT Bin Example
* ------------------------------------------------------------------- */
uint32_t fftSize = 1024;
uint32_t ifftFlag = 0;
uint32_t doBitReverse = 1;

/* Reference index at which max energy of bin ocuurs */
uint32_t refIndex = 213, testIndex = 0;
int err = 0;

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_LPUART1_UART_Init(void);
static void MX_USART3_UART_Init(void);
static void MX_USB_OTG_FS_PCD_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
//int * __errno(void);
void copydata(uint8_t direction);

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
* @brief  The application entry point.
*
* @retval None
*/
int main(void) {
        /* USER CODE BEGIN 1 */

        arm_status status;
        float32_t maxValue;

        status = ARM_MATH_SUCCESS;
        __IO int32_t timer = 0, timer1 = 0, timer2 = 0;

        /* USER CODE END 1 */

        /* MCU Configuration----------------------------------------------------------*/

        /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
        HAL_Init();

        /* USER CODE BEGIN Init */

        /* USER CODE END Init */

        /* Configure the system clock */
        SystemClock_Config();

        /* USER CODE BEGIN SysInit */

        /* USER CODE END SysInit */

        /* Initialize all configured peripherals */
        MX_GPIO_Init();
        MX_LPUART1_UART_Init();
        MX_USART3_UART_Init();
//        MX_USB_OTG_FS_PCD_Init();
        /* USER CODE BEGIN 2 */
        copydata(0);
        /* Process the data through the CFFT/CIFFT module */

        arm_cfft_f32(&arm_cfft_sR_f32_len1024, testInput_f32_10khz, ifftFlag,
                        doBitReverse);

        /* Process the data through the Complex Magnitude Module for
         calculating the magnitude at each bin */
        arm_cmplx_mag_f32(testInput_f32_10khz, testOutput, fftSize);

        /* Calculates maxValue and returns corresponding BIN value */
        arm_max_f32(testOutput, fftSize, &maxValue, &testIndex);

        if (testIndex != refIndex) {
                status = ARM_MATH_TEST_FAILURE;
        }

        /* ----------------------------------------------------------------------
         ** Loop here if the signals fail the PASS check.
         ** This denotes a test failure
         ** ------------------------------------------------------------------- */

        if (status != ARM_MATH_SUCCESS) {
                while (1) {

                }
        }

        /* USER CODE END 2 */

        /* Infinite loop */
        /* USER CODE BEGIN WHILE */
        while (1) {

                /* USER CODE END WHILE */

                /* USER CODE BEGIN 3 */

                __IO uint16_t i;
                timer = HAL_GetTick();
                for (i = 0; i < 1000; i++) {

                        arm_cfft_f32(&arm_cfft_sR_f32_len1024, testInput_f32_10khz,
                                        ifftFlag, doBitReverse);

                        /* Process the data through the Complex Magnitude Module for
                         calculating the magnitude at each bin */
//                        arm_cmplx_mag_f32(testInput_f32_10khz, testOutput, fftSize);
                        /* Calculates maxValue and returns corresponding BIN value */
//                        arm_max_f32(testOutput, fftSize, &maxValue, &testIndex);
//                          printf("MaxValue is %f\n",maxValue);
//                          printf("testIndex is %ld\n",testIndex);
//                          printf("refIndex is %ld\n",refIndex);
                        copydata(1);

//                        HAL_GPIO_TogglePin(GPIOB, LD3_Pin);
//                        HAL_GPIO_TogglePin(GPIOB, LD2_Pin);
//                          HAL_Delay(1000);
                }

                timer1 = HAL_GetTick();
                for (i = 0; i < 1000; i++) {
//                        copydata(0);
                        copydata(1);
//                        HAL_GPIO_TogglePin(GPIOB, LD3_Pin);
//                        HAL_GPIO_TogglePin(GPIOB, LD2_Pin);
                }
                timer2 = HAL_GetTick();
                HAL_GPIO_TogglePin(GPIOB, LD2_Pin);
                HAL_GPIO_TogglePin(GPIOB, LD3_Pin);
                printf("Time is %ld ms\n", 2 * timer1 - timer - timer2);

        }
        /* USER CODE END 3 */

}

/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void) {

        RCC_OscInitTypeDef RCC_OscInitStruct;
        RCC_ClkInitTypeDef RCC_ClkInitStruct;
        RCC_PeriphCLKInitTypeDef PeriphClkInit;

        /**Configure the main internal regulator output voltage
         */
        if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST)
                        != HAL_OK) {
                _Error_Handler(__FILE__, __LINE__);
        }

        /**Initializes the CPU, AHB and APB busses clocks
         */
        RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48
                        | RCC_OSCILLATORTYPE_MSI;
        RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
        RCC_OscInitStruct.MSIState = RCC_MSI_ON;
        RCC_OscInitStruct.MSICalibrationValue = 0;
        RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_7;
        RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
        RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
        RCC_OscInitStruct.PLL.PLLN = 30;
        RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
        RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
        RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
        if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
                _Error_Handler(__FILE__, __LINE__);
        }

        /**Initializes the CPU, AHB and APB busses clocks
         */
        RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
                        | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
        RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
        RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
        RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
        RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

        if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {
                _Error_Handler(__FILE__, __LINE__);
        }

        PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART3
                        | RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_USB;
        PeriphClkInit.Usart3ClockSelection = RCC_USART3CLKSOURCE_PCLK1;
        PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
        PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
        if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) {
                _Error_Handler(__FILE__, __LINE__);
        }

        /**Configure the Systick interrupt time
         */
        HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000);

        /**Configure the Systick
         */
        HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

        /* SysTick_IRQn interrupt configuration */
        HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* LPUART1 init function */
static void MX_LPUART1_UART_Init(void) {

        hlpuart1.Instance = LPUART1;
        hlpuart1.Init.BaudRate = 209700;
        hlpuart1.Init.WordLength = UART_WORDLENGTH_7B;
        hlpuart1.Init.StopBits = UART_STOPBITS_1;
        hlpuart1.Init.Parity = UART_PARITY_NONE;
        hlpuart1.Init.Mode = UART_MODE_TX_RX;
        hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
        hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
        hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
        hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
        hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
        if (HAL_UART_Init(&hlpuart1) != HAL_OK) {
                _Error_Handler(__FILE__, __LINE__);
        }

        if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8)
                        != HAL_OK) {
                _Error_Handler(__FILE__, __LINE__);
        }

        if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8)
                        != HAL_OK) {
                _Error_Handler(__FILE__, __LINE__);
        }

}

/* USART3 init function */
static void MX_USART3_UART_Init(void) {

        huart3.Instance = USART3;
        huart3.Init.BaudRate = 115200;
        huart3.Init.WordLength = UART_WORDLENGTH_7B;
        huart3.Init.StopBits = UART_STOPBITS_1;
        huart3.Init.Parity = UART_PARITY_NONE;
        huart3.Init.Mode = UART_MODE_TX_RX;
        huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
        huart3.Init.OverSampling = UART_OVERSAMPLING_16;
        huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
        huart3.Init.ClockPrescaler = UART_PRESCALER_DIV1;
        huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
        if (HAL_UART_Init(&huart3) != HAL_OK) {
                _Error_Handler(__FILE__, __LINE__);
        }

        if (HAL_UARTEx_SetTxFifoThreshold(&huart3, UART_TXFIFO_THRESHOLD_1_8)
                        != HAL_OK) {
                _Error_Handler(__FILE__, __LINE__);
        }

        if (HAL_UARTEx_SetRxFifoThreshold(&huart3, UART_RXFIFO_THRESHOLD_1_8)
                        != HAL_OK) {
                _Error_Handler(__FILE__, __LINE__);
        }

        if (HAL_UARTEx_DisableFifoMode(&huart3) != HAL_OK) {
                _Error_Handler(__FILE__, __LINE__);
        }

}

/* USB_OTG_FS init function */
static void MX_USB_OTG_FS_PCD_Init(void) {

        hpcd_USB_OTG_FS.Instance = USB_OTG_FS;
        hpcd_USB_OTG_FS.Init.dev_endpoints = 6;
        hpcd_USB_OTG_FS.Init.ep0_mps = DEP0CTL_MPS_64;
        hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED;
        hpcd_USB_OTG_FS.Init.Sof_enable = ENABLE;
        hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE;
        hpcd_USB_OTG_FS.Init.lpm_enable = DISABLE;
        hpcd_USB_OTG_FS.Init.battery_charging_enable = ENABLE;
        hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = DISABLE;
        hpcd_USB_OTG_FS.Init.vbus_sensing_enable = ENABLE;
        if (HAL_PCD_Init(&hpcd_USB_OTG_FS) != HAL_OK) {
                _Error_Handler(__FILE__, __LINE__);
        }

}

/** Configure pins as
* Analog
* Input
* Output
* EVENT_OUT
* EXTI
*/
static void MX_GPIO_Init(void) {

        GPIO_InitTypeDef GPIO_InitStruct;

        /* GPIO Ports Clock Enable */
        __HAL_RCC_GPIOC_CLK_ENABLE()
        ;
        __HAL_RCC_GPIOH_CLK_ENABLE()
        ;
        __HAL_RCC_GPIOB_CLK_ENABLE()
        ;
        __HAL_RCC_GPIOD_CLK_ENABLE()
        ;
        __HAL_RCC_GPIOG_CLK_ENABLE()
        ;
        HAL_PWREx_EnableVddIO2();
        __HAL_RCC_GPIOA_CLK_ENABLE()
        ;

        /*Configure GPIO pin Output Level */
        HAL_GPIO_WritePin(GPIOB, LD3_Pin | LD2_Pin, GPIO_PIN_RESET);

        /*Configure GPIO pin Output Level */
        HAL_GPIO_WritePin(USB_PowerSwitchOn_GPIO_Port, USB_PowerSwitchOn_Pin,
                        GPIO_PIN_RESET);

        /*Configure GPIO pin : B1_Pin */
        GPIO_InitStruct.Pin = B1_Pin;
        GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);

        /*Configure GPIO pins : LD3_Pin LD2_Pin */
        GPIO_InitStruct.Pin = LD3_Pin | LD2_Pin;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

        /*Configure GPIO pin : USB_PowerSwitchOn_Pin */
        GPIO_InitStruct.Pin = USB_PowerSwitchOn_Pin;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        HAL_GPIO_Init(USB_PowerSwitchOn_GPIO_Port, &GPIO_InitStruct);

        /*Configure GPIO pin : USB_OverCurrent_Pin */
        GPIO_InitStruct.Pin = USB_OverCurrent_Pin;
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(USB_OverCurrent_GPIO_Port, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

//int * __errno(void) {
//        return &err;
//}
void copydata(uint8_t direction) {
        uint32_t i;
        if (direction == 0) {
                for (i = 0; i < TEST_LENGTH_SAMPLES; i++)
                        testInput_f32_10khz_fixed = testInput_f32_10khz;
        } else {
                for (i = 0; i < TEST_LENGTH_SAMPLES; i++)
                        testInput_f32_10khz = testInput_f32_10khz_fixed;
        }
}

/* USER CODE END 4 */

/**
* @brief  This function is executed in case of error occurrence.
* @param  file: The file name as string.
* @param  line: The line in file as a number.
* @retval None
*/
void _Error_Handler(char *file, int line) {
        /* USER CODE BEGIN Error_Handler_Debug */
        /* User can add his own implementation to report the HAL error return state */
        while (1) {
        }
        /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
* @brief  Reports the name of the source file and the source line number
*         where the assert_param error has occurred.
* @param  file: pointer to the source file name
* @param  line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{
        /* USER CODE BEGIN 6 */
        /* User can add his own implementation to report the file name and line number,
         tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
        /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/**
* @}
*/

/**
* @}
*/

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
斜阳 回答时间:2018-2-27 09:26:03
你用的是哪一块板子说明白,如果是自己做的检查晶振。把修改的东西发出来。
ps:去掉生成文件后工程很小。

下面是NUCLEO-L4R5ZI的原理图的一部分,看了一下,晶振是默认断开的。



pythonworld 回答时间:2018-2-27 18:26:42
本帖最后由 pythonworld 于 2018-2-27 18:29 编辑
斜阳__ 发表于 2018-2-27 09:26
你用的是哪一块板子说明白,如果是自己做的检查晶振。把修改的东西发出来。
ps:去掉生成文件后工程很小。

你说的对,我仔细看了一下Nucleo板的电路图外部晶振没有焊接,而且和ST-link连接的MCO的锡桥也是断开的。非常感谢!
我以为和其他Nucleo板一样ST-link 为板子提供外部时钟呢,没仔细看电路图。
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; Cube MX默认生成的是使用外部高速时钟,更改时钟设置后可以运行了。
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48// 使用高速内部时钟。
                        | RCC_OSCILLATORTYPE_MSI;
        RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
        RCC_OscInitStruct.MSIState = RCC_MSI_ON;

电路图

电路图

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版