第七周实验三

第七周实验三

使用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库容易上手,可以深入学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值