<STM32>STM32CubeMX-基础工程创建及LED灯控制 (1)

绪论:
STM32CubeMX 是一个图形工具,可以非常轻松地配置 STM32 微控制器和微处理器。所以再初始开发过程成可以减少时间周期。或者是对入门初学者使用,能更快的上手应用开发。
本系列教程主要是针对基础运用下的,选用的开发工具如下:
1、STM32CubeMX
2、IDE为:MDK-Keil
3、开发板子芯片为:STM32F407ZET6
4、HAL库

注: 提前安装好STM32CubeMX 和Keil

本节主要讲解工程创建过程 以及LED灯控制

过程如下
1、打开工程选择开发芯片
在这里插入图片描述
1)打开STM32CubeMX后,得到界面入上图所示,旧版有区别,注意,但是界面的相关操作都差不多,主要是布局有变化;
2)选择箭头处的“ACCESS TO MCU SELECTOR”,意思是选择MCU的型号进行配置工程的开始;也可以选择其它两个,根据自己使用情况,或可尝试看看。
3)在(2)点击后会进入下一步芯片具体类型的选择。

2、开发芯片选择
在这里插入图片描述
1)在上图箭头处输出具体的电路板上的芯片型号,作者使用的芯片型号是"STM32F407ZET6",搜索时输入“STM32F407”,得到下图所示:
在这里插入图片描述
2)根据上图搜索的型号选择具体芯片,选中后会有深色,选后按照下图说是点击“Star Project”,开始进入工程配置。
在这里插入图片描述

3、工程配置界面介绍
1)进入配置后的界面如下图所示:
在这里插入图片描述
上图标志 1:主要是配置芯片的使用,包括:GPIO、时钟源、Debug、定时器、DMA、ADC、DAC、CAN、FSMC、I2C、SPI、SDIO、UART\USART、等底层驱动使用的配置,以及中间层驱动:FATFS、FREERTOS、LIBJPEG、LWIP等等。详细选型可以查看图标7各位置。

上图标志2:芯片的时钟配置,可以详细的看到每一路的时钟,及配置大小。(后面会有截图)

上图标志3:工程输出的一些配置,包括目录,工程名称、选用的IDE、堆栈大小配置等;(后面会讲解到)

上图标志4:一些开发工具的使用配置,目前暂不涉及使用;

上图标志8:以图形的方式展示芯片,可放大缩小查看每一个引脚,并通过鼠标左右键配置IO引脚。

上图标志5:在所有配置完成后,点击即可生成代码工程,并用配置的IED打开工程即可。

4、工程配置
1)配置RCC,即晶振的选择配置;
选择"Pinout&Configuration"->“System Core”->“RCC”,如下图步骤1、2、3;
High Speed Clock(HSE):表示外部高速晶振;
High Speed Clock(HSE):表示外部低速晶振,使用RTC实时时钟是一般用这个;
在步骤4、5可选择晶振的配型,“BYPASS Clock Source”和“Crystal/Ceramic Resonator”两种,第一个是旁路时钟源,第二个是晶体/陶瓷谐振器,一般电路使用的是“Crystal/Ceramic Resonator”。
本教程作者选用的高速和低速都是“Crystal/Ceramic Resonator”。
如下图:
在这里插入图片描述
2)配置SYS,即DEBUG的方式选择

选择"Pinout&Configuration"->“System Core”->“SYS”,如下图步骤1、2、3;
下图步骤4则是选择Debug的方式,一般选择SDW的方式能满足使用,如果想用JTAG也可选择JTAG。

本教程在这里作者选中SDW的方式即“Serial Wire”。
在这里插入图片描述
3)配置LED灯的GPIO
教程选择用的开发板LED0连接的是GPIOF9,LED1是GPIOF10,采用共阳电路,所以是低电平有效点亮,如下图所示:
第一步:选择GPIOF9,点击鼠标左键,会出现下图标注3的选项,选择GPIO_Output,即输出模式。同理选择GPIOF10;
在这里插入图片描述
第二步:更改引脚的名称鼠标右击对应的GPIO,弹出 选项列表,选择“Enter User Lable”,然后输入名称;这里作者的GPIOF9的标签名称为LED0,GPIOF10的标签为LED1;可根据自己的命名习惯填写,后续在代码中对其的控制,则是通过这个宏定义的名称进行的。

在这里插入图片描述
以上三个方面 就完成了对使用的功能配置。。。。

  1. 时钟配置
    时钟配置,点击“Clock Configuration”,如下图标注1位置;
    在下图标注2位置,输入时钟总线的最终频率,根据芯片有效范围设定,一般F1的芯片为72,F4的为168或180,这里作者选用180MHZ,输入后回车,会有提示,对提示进行确认即可。这样时钟的大小配置即可完成。

在这里插入图片描述
5)输出工程文件配置

第一个:项目配置,如下图标注,
标注1:选择“Project Manager”,进入项目配置;
标注2:项目工程文件相关的配置;
标注3:设置工程的名称,这里作者就用”LED“,可根据自己要求写;
标注4:工程文件存放的路径目录,不要包含中文路径,否则可能会报错。。
标注5:工程的IDE选择,此教程选用的是keil,所以选择的是MKD-ARM,可根据自己使用的IDE选择对应的。
标注6:IDE的版本,默认最新版本即可,如果是keil4则选择低的版本;
标注7:堆栈大小的设置,目前这个LED工程使用不大,所以默认大小即可,后续的其它功能的教程会涉及堆栈大小的修改。

在这里插入图片描述
6)代码生成配置

第二个:代码生成配置,如下图标注,
标注1:选择“Project Manager”,进入代码项目配置;
标注2:代码生成相关的配置;
标注3:设置使用的库文件
第一个选项是:复制所有的库文件到工程中;
第二个选型是:只复制需要用到的库文件;
第三个选项是:在工具链项目配置文件中添加必要的库文件作为参考
此处作者选用第一个,复制所有的库文件。。。

标注4:生成文件的配置
第一个:为每个外设生成一对“.c/.h”文件的外设初始化;
第二个:重新生成时备份以前生成的文件;
第三个:重新生成时保留用户代码;
第四个:不重新生成时删除以前生成的文件;
此处作者选用 第一个,第三个,第四个;

标注5:以上所有配置好后,点击“GENERATE CODE”,生成代码工程;
在这里插入图片描述

5、代码生成

点击“GENERATE CODE”,生成代码工程;提示如下,点击“Open Project”打开工程;
在这里插入图片描述
6、添加LED控制代码

1)打开工程后如下所示:
在这里插入图片描述
2)添加LED控制代码

第一步:打开工程后,先点击“在这里插入图片描述”编译一下,确保相关的.h文件能够找得到。

第二步:在“main.h”添加如下图所示代码:

//写GPIO
#define LED0(n) HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, n?GPIO_PIN_SET:GPIO_PIN_RESET )
#define LED1(n) HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, n?GPIO_PIN_SET:GPIO_PIN_RESET )

//GPIO状态取反-即反转
#define ToggLED0() HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin)
#define ToggLED1() HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin)

在这里插入图片描述
第三步:在主函数添加控制代码

下图代码方法1是采用单独设置状态的方式控制LED0的闪烁,方法2是采用反转的方式控制LED1闪烁;
使用其中一种即可;这里作者选用第一种进行测试。

如下图:

/*******************方法1**************************/
	  LED0(1);			//关闭LED0
	  HAL_Delay(300);	//延时300ms
	  LED0(0);			//关闭LED0
	  HAL_Delay(300);	//延时300ms
/*******************方法2**************************/
	  ToggLED1();			//LED1状态取反
	  HAL_Delay(300);	//延时300ms
	  
	

在这里插入图片描述
2)编译下载
第一步:点击“ 在这里插入图片描述”进行编译;
第二步:下载器选择,根据自己的下载器选择,这里作者选用J-LINK;

在这里插入图片描述
第三步:下载方式配置,相关选项参考下图即可:
在这里插入图片描述
在这里插入图片描述
第四步:下载
点击“ 在这里插入图片描述”下载代码即可。

7、效果
由于视频无法直接上传,这里就看不见了。
作者下载后能看到LED0闪烁。

总结:至此,整个LED工程的创建,及控制闪烁,已完成;

欢迎交流:QQ759521350

-------------------以上内容如有不足之处,还望指出,交流----------------

--------------------------------转载标明出处--------------------------------

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32中使用矩阵键盘控制LED的方法如下: 1. 配置GPIO引脚:首先,需要配置矩阵键盘的行和列对应的GPIO引脚。可以使用STM32CubeMX工具来进行配置。选择对应的GPIO引脚,并将其设置为输入模式。 2. 配置外部中断:为了检测按键的按下事件,需要配置外部中断。在STM32CubeMX中,选择对应的GPIO引脚,并将其配置为外部中断模式。 3. 编写中断处理函数:在代码中编写中断处理函数,用于处理按键的按下事件。在中断处理函数中,可以根据按下的按键来控制LED的亮度。 4. 配置PWM输出:使用STM32CubeMX工具配置PWM输出。选择对应的GPIO引脚,并将其配置为PWM输出模式。根据需要,可以设置不同的占空比来控制LED的亮度。 5. 编写主程序:在主程序中,初始化外部中断和PWM输出,并进入主循环。在主循环中,可以根据按键的按下事件来改变PWM输出的占空比,从而控制LED的亮度。 下面是一个示例代码,演示了如何使用矩阵键盘控制LED的亮度: ```c #include "stm32f1xx_hal.h" // 定义按键对应的行和列 #define ROW_NUM 2 #define COL_NUM 3 // 定义按键矩阵 uint8_t keyMap[ROW_NUM][COL_NUM] = { {1, 2, 3}, {4, 5, 6} }; // 定义按键状态 uint8_t keyState[ROW_NUM][COL_NUM] = {0}; // 定义PWM输出的占空比 uint32_t pwmDutyCycle = 0; // 外部中断回调函数 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { // 检测按键的按下事件 if (GPIO_Pin == GPIO_PIN_0 || GPIO_Pin == GPIO_PIN_1 || GPIO_Pin == GPIO_PIN_2 || GPIO_Pin == GPIO_PIN_3 || GPIO_Pin == GPIO_PIN_4 || GPIO_Pin == GPIO_PIN_5) { // 获取按键的行和列 uint8_t row = 0, col = 0; for (row = 0; row < ROW_NUM; row++) { for (col = 0; col < COL_NUM; col++) { if (keyMap[row][col] == GPIO_Pin) { break; } } } // 更新按键状态 keyState[row][col] = !keyState[row][col]; // 根据按键状态更新PWM输出的占空比 pwmDutyCycle = keyState[row][col] ? (col + 1) * 20 : 0; } } // PWM输出初始化函数 void MX_PWM_Init(void) { // 配置PWM输出引脚 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置PWM输出定时器 TIM_HandleTypeDef htim2 = {0}; htim2.Instance = TIM2; htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 999; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim2); // 配置PWM输出通道 TIM_OC_InitTypeDef sConfigOC = {0}; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1); // 启动PWM输出 HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); } int main(void) { // 初始化外设 HAL_Init(); MX_GPIO_Init(); MX_PWM_Init(); while (1) { // 更新PWM输出的占空比 __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwmDutyCycle); // 延时一段时间 HAL_Delay(100); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

waterfxw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值