一、环境
cubemx安装和搭建见博文
链接: STM32CubeMX安装
keil安装见软件安装管家,注意要是MDK版
二、cubemx操作
1.打开cubemx
2.选择ACCESS TO MCU SLCTOR,创建一个新的工程。
3.选择合适的芯片型号
具体的开发板芯片型号根据自己的板子来。我的是STMF429IG
4.选择IGTx之后,点击开始工程
5.进行引脚和时钟等的配置
引脚配置
要把PH10,PH11,PH12的引脚设置为输出模式。
搜索PH10,引脚会闪烁,然后点击引脚设置为输出模式
同样PH11,PH12都要进行这个操作。
设置完之后
将三个引脚的输出改为高电平。
时钟配置
6.进入工程管理页面,进行路径的选择,以及其他的配置。
点击code generator
j进行其他的设置
设置完成之后,点击GENERATER CODE
在弹出的页面的指示下,点击OPEN PROJECT。
CUBEMX的操作结束,下面进入KEIL界面。
三、keil操作以及实验现象
1.首先是各个地方的基本配置
edit >configuration
勾选Browse Information之后,可以实现程序的跳转。
点击debug选项,将ST—LINK换成CMSIS
之后继续点击settings
这里就表示可以识别到仿真器,并可以进行程序的下载。
点击Flash Download
勾选reset and run 。
设置完后之后,点击ok进行确定。
2.程序的编辑
要把程序写在begin和and之间,这样可以避免重新进行配置的时候把我们自己写的代码刷掉。
①点亮第一个灯的代码如下。
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10,GPIO_PIN_RESET);
/* USER CODE END 2 */
代码解释
使用HAL_GPIO_WritePin对GPIO口进行设置,
其中GPIOH,代表的是对GPIOH进行操作
GPIO_PIN_10,代表的是H组的引脚10。
RESET代表是0,SET代表的是1。
这行代码就实现了一个简单的点灯操作。
实验现象
②咱们继续尝试,继续玩
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOH,GPIO_PIN_11,GPIO_PIN_RESET);
/* USER CODE END 2 */
这段代码的含义和上面差不多,就是让PH10不置0,让PH11置0,从而实现点灯操作。这里是一个灯里面有三个不同颜色的灯珠,这次点亮的是与PH11相连的发光二极管。
实验现象
同样的对PH12进行操作
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOH,GPIO_PIN_11,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOH,GPIO_PIN_12,GPIO_PIN_RESET);
/* USER CODE END 2 */
实验结果
③难度升级,加一个按键操作控制灯的亮灭
我们首先看一下原理图。
这里拿PA0举例。
打开CUBEMX,搜索PA0,找到PA0这个引脚,并将其设置为输入模式。
那么按键就设置好了。我们点击GENERATE CODE。
原来的就被覆盖了,我们按照窗口提示,同意reload。
接下来进行对按键进行编码。
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
// HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10,GPIO_PIN_SET);
//HAL_GPIO_WritePin(GPIOH,GPIO_PIN_11,GPIO_PIN_SET);
//HAL_GPIO_WritePin(GPIOH,GPIO_PIN_12,GPIO_PIN_RESET);
GPIO_PinState k1
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
k1 = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
if(k1 == GPIO_PIN_SET)
{
HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_10,GPIO_PIN_RESET)
}
else
HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_10,GPIO_PIN_SET)
}
/* USER CODE END 3 */
}
Ⅰ、初始化,将Pinstate用k1来标识。
GPIO_PinState k1
Ⅱ、读取按键状态
k1 = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
第一个参数为端口,第二个参数为具体的引脚编号。
Ⅲ、if else,如果检测到按键是高电平,那么红灯亮,否则的话。不亮。
if(k1 == GPIO_PIN_SET)
{
HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10,GPIO_PIN_RESET);
}
else
HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10,GPIO_PIN_SET);
}