关注分享主机优惠活动
国内外VPS云服务器

使用STM32CubeMX初始化STM32F031F6Px系列

总结:采用可视化界面进行相关配置,时钟节拍、定时器、串口等可以直接通过软件生成,无需根据数据手册操作标准库或寄存器。 。

使用STM32CubeMX初始化STM32F031F6Px系列1.简介2.关于STM32CubeMX1,下载链接2.软件安装(Win版)3.STM32F031F6Px1配置,工程创建2.芯片配置A,引脚配置B. 系统时钟设置(插曲系列) C. USART1D、PWM 输出设置设置 E、ADC 设置 3. 输出工程 A、工程 B、代码生成器 C、详细设置 D、Keil5 工程文件设置 生成 4. 生成 Keil 文件 5.结束

1.简介

由于我公司项目的需要,接触到了STM32F031F6Px系列芯片。 虽然有用,但它在未来会变得更加有用。 学习了下面的STM32CubeMX来初始化STM32F031F6Px的相关设置(要求:1路串口通信、3路PWM输出、6路ADC检测)。 我这个时候就创建一个记录,方便我和大家交流,向大家学习。

2、关于STM32CubeMX

从事嵌入式开发的人可能都熟悉STM32CubeMX开发工具,这是近几年流行的又一款STM32开发工具。 STM32CubeMX是ST专门开发的代码生成软件,用于生成STM32 HAL代码。 因此,学习STM32CubeMX也就意味着学习使用HAL库开发STM32的相关技术。 STM32CubeMX 使用可视化界面来配置 STM32,包括时钟、滴答定时器、DMA、串行端口和 GPIO。可以直接由软件生成,无需根据数据手册操作标准库或寄存器。

1.下载链接

链接:STM32CubeMX STM32CubeMX下载网页(提供Linux、Mac、Windows版本,本文使用6.3.0版本,2021/8/31):

2.软件(Win版)

下载完成。 将安装包解压如下图,打开安装包如下图(最好以管理员身份运行)。 运行安装包开始安装。 接下来将是一个复选标记,下一步将是“下一步,请注意安装位置”。 也可以放在D盘,这里就省略了。 (主要原因是已经安装过了,再装一次很痛苦。)

3、配置STM32F031F6Px。 1、创建一个工程

(配色非常好)进入界面,点击ACCESS TO MCU SELECTOR。 并开始配置项目。 这里我们选择STM32F031F6Px芯片,点击右上角“Start Project”进入芯片配置界面,进入如下界面进行配置。

2.芯片配置A、引脚配置

这里我们需要配置三个PWM引脚。 和六个 ADC 输入引脚。 点击任意引脚即可完成配置(这里讲一个小轶事:我误以为芯片有外接晶振,所以将PF0/PF1配置为外接晶振,如果将PWM输出配置为PA1/PA2/PA7不能提前配置,否则无法用TIM配置PWM输出)

B. 系统时钟配置(Interlude系列)

插曲:我以为芯片有外部晶振。 这是HSE,但是当我仔细查看电路图时,我意识到它不起作用。 ,使用HSI(晶振也要花钱!!!)点击上面的Clock Configuration,配置系统时钟(注意!上图中只配置了外部晶振,下图中的HSE可用)。 如果不明白,请参考STM32系统时钟RCC的详细说明。 当然,这篇CSDN文章和F0这个系列是有区别的,我们来类比一下吧。 HSE是:(根据你的要求是错误的,插曲)(如果你像我一样选择了错误的引脚配置模式,请选择Reset)_State返回默认状态)实际中应该使用内部高速时钟信号HSI(High Speed Internal Clock Signal)。 HSI为:(按要求修改,插曲) RCC外部高速时钟信号HSE(高速外部时钟信号)禁用

C. 配置USART1

1. 点击 。 USATR1; 2. 将MODE 设置为异步通信(Asynchronous)。 3、基本参数:波特率115200bit/s。 传输数据长度为8Bit。 无奇偶校验。 停止位 1。 接收和发送均已启用。 4. GPIO 引脚设置:USART1_RX/USART_TX; 5. 在 NVIC 设置栏中启用接收中断(见下文)。

D. PWM 输出设置

(基本原理请参见《STM32CubeMX 教程 7 - PWM 输出(呼吸灯)》) 需要从 PA1、PA2、PA7 输出 PWM。 由于上述部分被配置为 GPIO 输出,因此我们需要通过执行 Reset_State 将其重置为初始化状态以外的状态,如下所示。 根据STM32F031xx英文参考手册中的图,出现如下解释(抱怨,相关信息太少)

然后,设置TIM2,将Channel2设置为PWM Generation CH2,配置PA1端口。 将通道 3 设置为 PWM 生成通道 3。 在参数设置页面配置 PA2 端口,将预分频因子设置为 47,计数周期(自动加载值)设置为 499,定时器溢出频率(即 PWM 周期)设置为 48MHz。 /(47+1)/(499+1) = 2kHz PWM 频率: Fpwm =Tclk / ((arr+1)*(psc+1)) (单位:Hz) arr 为计数器值 psc 为预分频器值 占空比:示例:定时器频率 Tclk = 48Mhz arr=499 psc=47 此时 PWM 频率为 480000/500/48= 2000Hz,即 2KHz arr=499,TIM3->CCR1=250,pwm 占空比为 50%。

设置 TIM3,将设置通道 2 设置为 PWM 生成 CH2,并按上述 TIM2 的方式配置 PA7 端口设置。

E. ADC配置

相关知识:《STM32CubeMX教程9-ADC》采样时间越长,稳定性越高。 不过,这也需要根据实际情况而定。 如果信号强,则采样周期短,信号准确。 如果信号较弱,则需要根据实际测试确定最佳周期。

至此,芯片的基本配置就完成了。 基本参数为:

3.输出项目A,项目

我用的是Keil5。 这里我选择MDK-ARM,选择版本V5(只是为了保险起见,有更新版本)没有什么奇怪的bug。 请选择V5)

B. 代码生成器

代码生成器设置

C. 高级设置

D. 生成Keil5工程文件

最后,点击GENERATE CODE生成代码。

4.生成Keil文件

生成的文件如下。 在生成过多的 .c 文件之前,您应该在代码生成器中检查“生成外设初始化”。 否则,您只有 main.c、stm32f0xx_it.c 和 stm32f0xx_hal_msp。 c. main.c 文件代码

/* USER CODE BEGIN header *//** **************************** ** ************************************************** *********** * ** * @文件: main.c * @brief : 程序体******************************************** ********** ** ****************************************** * @attention * * © 版权所有 (c) 2021 ST 微电子。 *未经授权禁止转载。 * * 该软件组件由 ST 根据 BSD 3- 条款许可证 *“许可证”获得许可。 * 除非按照许可,否则您不得使用此文件。 许可证副本可在以下位置获取: * opensource.org/licenses/BSD-3-Clause * ********************* ** * **** ************************************************** ******** * ****** *//* 用户代码结束头 *//* -------[k4 ]--[ 包含 k4]-[ k4]----------- ----------------[k4 ]-[ k4]- ]------------------ ----*/#include "main.h"#include "adc.h"#include "dma.h"#include "tim.h"#include "usart.h"#包含“gpio.h”/* 用于私有 ------------- [包含 k4]--------------[ k4][k4 ] ----------------[ k4] ]-----------*//* 包含用户代码 BEGIN * //* 包含用户代码结束 *//* 私有 typedef ------------ -- - ]-------------[ k4]-[ k4][ k4]--------------- - -----------*//* 用户代码开始 PTD *//* 用户代码结束PTD*//* 私有定义 --------------[k4 ] ]---------------- ----------------[k4 ] ------------*//* 用户代码 BEGIN PD *//* 用户代码 END PD *//* 私有宏 -------------[k4 ] ----------------[ k4] ]---------------[k4 ][ k4]-------------*//* 用户代码 BEGIN PM * //* 用户代码结束 PM *//* 私有变量 -----------[k4 ][ k4]---------------[ k4] ---------------------------- *//* 用户代码开始PV *//* 用户代码结束PV *//* 私有函数原型 --------- ----------------[k4 ] ]---------------- [ k4]----*/void SystemClock_Config(void);/* 用户代码开始 PFP *//* 用户代码结束 PFP *//* 私有用户代码 -- ----------------[k4 ] ----------------[ k4] ]---------------[k4 ][ k4]----*//* 用户代码开始 0 *//* 用户代码结束 0 *//** * @brief 应用程序入口点。 * @retval int */int main(void){ /* 用户代码BEGIN 1 */ /* 用户代码 END 1 */ /* MCU 配置 -----------[ k4]---------------- ----------------[k4 ] ]-----------*/ /* 复位所有外设并复位 flash 接口和 Systick 初始化。 。 */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* 设置系统时钟 */ SystemClock_Config(); /* 用户代码 BEGIN SysInit */ /* 用户代码 END SysInit */ /* 初始化所有配置的外设 */ MX_DMA_Init(); MX_TIM2_Init(); MX_USART1_UART_Init(); /* 用户代码 2 结束 */ * 无限循环 */ /* 用户代码 WHILE 开始 */ while (1) { /* 用户代码 WHILE 结束 */ /* 用户代码 3 开始 */ } /* 用户代码 3 结束 */}/** * @brief 系统时钟设置 * @retval None */void SystemClock_Config(void ){RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; /** 根据 RCC_OscInitTypeDef 结构中指定的参数初始化 RCC 振荡器。 振荡器类型 = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSI14; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSI14State = RCC_HSI14_ON; I nitStruct.HSI14CalibrationValue = 16; RCC_OscInitStruct.PLL.PLState = RCC_PLL_ON;LLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12; RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); APB总线时钟*/ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; APB1CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) { Error_Handler(); PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1; OURCE_PCLK1; 如果 (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { Error_Handler(); }}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//** * @brief 发生错误时执行该函数。 * @retval None * /void Error_Handler(void){ /* 用户代码 BEGIN Error_Handler_Debug */ /* 用户可以添加自己的实现来报告 HAL 错误返回状态 */ __disable_irq(); while (1 ) { } /* 用户代码END Error_Handler_Debug */ }#ifdef USE_FULL_ASSERT/** * @brief 报告发生断言_param 错误的源文件名和源行号。 * @param file: 指向源文件名的指针 * @param line:assert_param 错误行的源编号 * @retval None */voidassert_failed(uint8_t *file, uint32_t line){ /* USER CODE BEGIN 6 */ /* User You can添加您自己的实现报告文件名和行号。 示例: printf("Wrongparametersvalue:file %s on line %d/r/n", file, line) */ /* USER CODE END 6 */}#endif / * USE_FULL_ASSERT *//******** ************** (C) 版权所有意法半导体 *****文件结束****/ 5. 结束

生产力只能通过学习新知识来实现​​。能够持续改进并创造更多价值。

未经允许不得转载:主机频道 » 使用STM32CubeMX初始化STM32F031F6Px系列

评论 抢沙发

评论前必须登录!