目录
一、2只LED灯的周期闪烁
新建CubeMX项目
在File中新建项目,选择STM32F103C8芯片
RCC选择
进行如图设置。
配置SYS
在Debug处选择“Serial Wire”。
配置GPIO输出
选择A0、B0口设置为“GPIO_Output”,同时设置为高电平工作方式。
Clock Configuration设置
进行如图设置。
文件设置
为文件命名并选择存储位置,同时在Toolchain/IDE处设置“MDK-ARM”,以便在Kile中运行文件。
代码设置
进行如图设置,之后完成代码生成,打开Kile。
代码修改
在自动生成的代码中找到main.c文件,在main函数中找到while(1),在该循环中加入如下代码。
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 灯1亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 灯1灭
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // 灯2亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // 灯2灭
实物演示
修改代码后进行编译,无误后在如图位置进行与实物的连接。
二、中断控制2只LED灯的周期闪烁。
基础的设置如RCC、SYS等与上述差不多,这里对中断需要进行的额外操作进行演示。
设置输出端口和中断端口
对于输出端口还是设置为高电平工作方式,中断端口选择设置为“GPIO_EXTI”,同时设置为下拉触发。
NVIC设置
开启中断使能和中断优先级分组,这里抢占优先级均为0
代码修改
在生成的代码中找到stm32f1xx_it.c文件,找到HAL_GPIO_EXTI_IRQHandler函数,并跳转到该函数。
继续找到HAL_GPIO_EXTI_Callback函数,重写该函数。
void HAL_GPIO_EXTI_Callback(unint16_t GPIO_Pin)
{
if(GPIO_Pin==GPIO_PIN_12)
HAL_GPIO_WritePin(GPIOA,GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
else if(GPIO_Pin==GPIO_PIN_13)
HAL_GPIO_WritePin(GPIOA,GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
}
接着在main.c文件找到main函数,在while(1)循环中编写如下函数。
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 灯1亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 灯1灭
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET); // 灯2亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET); // 灯2灭
实物演示
三、时序波形分析
基础设置
在Kile设置中,找到Debug,进行如下设置。
端口设置
从如下位置进入对应界面,并选择波形图。
设置对应端口。
输入“GPIOx_IDR.n”并回车,即可表示端口为x,引脚为n的端口。同时设置为Bit类型。
波形演示
四、总结
本次利用HAL库进行了STM编程的练习,相较于之前,利用HAL库可以直接将想要进行操作的端口进行初始化的代码编写,省去了一些步骤,只需进行主要操作的代码编写,更为简便。