第七周实验三
使用stm32CubeMX,配合keil,使用HAL库完成流水灯及其中断
一、安装stm32CubeMX、使用stm32CubeMX、以及keil配置
寻找安装教程,安装好stm32CubeMX,安装HAL库
打开使用,选择芯片
点开system core,点击sys配置,在debug下选择serial wire
再配置时钟,进入上面的rcc,有两个时钟,一个是hse和lse,我们要用是GPIO接口,而这些接口都在APB2里
接下来观察时钟架构,APB2总线的时钟由hse控制,同时在这个界面得把PLLCLK右边选上
将hse那里设为Crystal/Ceramic Resonator
接下来点击相应的引脚设置输出寄存器了,也就是output,一共选了三个,是PA4,PB9,PC15
点击project manager,配置好自己的路径和项目名,然后IDE那项改为MDK-ARM
进入 code generate界面,选择生成初始化.c/.h文件,后面点击generate code,选择open project,然后就到KEIL5了
然后就可以在keil里面进行仿真调试了
打开main.c函数,并将main函数替换为以下内容
SystemClock_Config();//系统时钟初始化
MX_GPIO_Init();//gpio初始化
while (1)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//PA4亮灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
HAL_Delay(1000);//延时1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
HAL_Delay(1000);//延时1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15亮灯
HAL_Delay(1000);//延时1s
}
实物电路图连接如下
烧录程序后结果如下
然后再观察GPIO端口输出波形
Target界面中,选择跟正确的晶振大小,这里选择8MHz的外部晶振。这个选项在软件仿真中起到很重要的作用,如果选择错误,那么时间就会不准确,波形也是错误的
设置Debug
进入调试界面,观察波形的窗口可以放大
再点击setup,选择要观察的端口,点击close
运行程序
观察波形
二、实现中断
这里由于我们没有开关,所以我们使用一根导线模拟开关来控制流水灯的中断。这里我们的思路是再引出一个引脚,当这个引脚为高电平时,触发中断。
在STM32CubeMX中,点击GPIO,设置PA8口,,选择EXTI
点开NVIC,注意将图示位置勾上
然后再打开工程,找到stm32f1xx_hal_gpio.c,位置如图中所示
找到下图中这个函数
将以下代码替换函数中的内容
int i=0;
if(GPIO_Pin==GPIO_PIN_8)//读取PA8电平
{
GPIO_PinState State=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8);//写入PA8电平
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_All,GPIO_PIN_SET);
if (State==GPIO_PIN_SET) {//如果是高电平,进行流水灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);//
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);//
for(i=0;i<1000000;i++)//用for循环代替延时函数
{
}
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);//
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);//
for(i=0;i<1000000;i++)
{
}
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);//
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);//
for(i=0;i<1000000;i++)
{
}
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);//
for(i=0;i<1000000;i++)
{
}
}
else if(State==GPIO_PIN_RESET)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_All,GPIO_PIN_SET);
}
然后再进行编译,烧录程序,在观察结果如下:
for(i=0;i<1000000;i++)
{
}
}
else if(State==GPIO_PIN_RESET)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_All,GPIO_PIN_SET);
}
电路连接图如下图所示
然后再进行编译,烧录程序,在观察结果如下:
三、总结
使用HAL库来做,可以使过程变得更加简便,不需要自己导入头文件什么的,不容易在这方面出错,然后自己所需要做的就是修改一些主函数和一些简单的配置就行,并且HAL库容易上手,可以深入学习。