文章目录
实验软件:CubeMx,KeilMDK,mcuisp
实验管脚:PA1,PB1,PB10
实验材料:若干LED,若干跳线,一个面包板,一个F103C8T6,一个USB转TTL
1、Cube点亮流水灯
重做上一个LED流水灯作业,即用GPIO端口完成3只LED红绿灯的周期闪烁。
1.1、安装Cube
安装教程可参考:https://blog.csdn.net/as480133937/article/details/98885316
1.2、新建工程
选择PA1,PB1,PB10
配置时钟,进入上面的rcc,有两个时钟,一个是hse和lse,我们要用是GPIO接口,而这些接口都在APB2里,APB2外设由HSE控制,所以将HSE设置为外部晶振。
(为啥要这样配置?)
最后点击generate即可
在生成的工程文件的main.c循环中编写你的代码即可
1.3、代码编写
我的代码如下(采用的PA1,PB1,PB10):
while (1)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET);
HAL_Delay(1000);
}
1.4、烧录程序
(为啥要选择DTR低电平复位,RTS高电平进BootLoader)
1.5、运行效果
2、中断控制流水灯
用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED流水灯工作;接低电平时,LED流水灯停止工作。
2.1、新建工程
与上述差不多一样,只是需要多选择一个管脚进行中断配置
选择PA3作为开关
使能中断
2.2、重写中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == SWITCH_Pin){
//获取A3的电位,如果是低电平就一直死循环,使流水灯停止工作
while(HAL_GPIO_ReadPin(SWITCH_GPIO_Port,SWITCH_Pin)==GPIO_PIN_RESET){}
}
}
主循环还是流水灯代码:
while (1)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET);
HAL_Delay(1000);
}
2.3、运行效果
3、示波器观察波形图
在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。请用此功能观察第1题中3个GPIO端口流水灯的输出波形,并分析时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。
详细操作可查看https://blog.csdn.net/wakeup_high/article/details/133828393?spm=1001.2014.3001.5502中的示波器部分
点击魔法棒
点击Debug->Logic Analyzer->配置引脚(可直接输入PORTX.X再按Enter键)
波形:
可见周期在1s左右,高电平灯亮,低电平灯灭。
4、中断控制一个灯亮灭
PA4作为LED灯
PA5为按钮
配置过程和上述类似
中断回调函数重写:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == SWITCH_Pin){
GPIO_PinState pinState = HAL_GPIO_ReadPin(SWITCH_GPIO_Port, SWITCH_Pin);
if(pinState == GPIO_PIN_RESET){
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
}else{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
}
}
}
运行效果:
参考:
https://www.cnblogs.com/cqjtu-linzd/articles/17779241.html#3-中断模式控制流水灯