目录
一、实现LED流水灯
1.STM32CubeMX工程搭建
利用GPIOA 2端口、GPIOB 0端口、GPIOC 13端口轮流闪烁实现LED流水灯 |
-
打开STM32CubeMX,点击File>new project创建新工程,芯片选型stm32f103c8t6
双击进入。 -
点击system core>gpio 配置
将PA2、PB0、PC13设为GPIO_output模式,如下图:
-
配置时钟
- 点击RCC中的High Speed Clock 设置为Crystal/Ceramic Resonator
- 点击上方的Clock Configuration完成配置如下图:
-
点击SYS,Debug设置为Serinal Wrie
-
上方Project Manager配置工程
- 工程命名
- 地址选址(不可包含中文地址,可能打不开keil文件)
- 选择所用IDE
- 单击GENERATE COOE生成项目。
2.代码分析
在生成项目路径中找到MDK-ARM文件夹,打开.uvprojx文件。
置高电平
HAL_GPIO_WritePin(GPIOX,GPIO_PIN_x,GPIO_PIN_SET);
置低电平
HAL_GPIO_WritePin(GPIOX,GPIO_PIN_x,GPIO_PIN_RESET);
main.c中函数已经配置好,找到main函数中while(1),编写我们的代码
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
HAL_Delay(500);
运行生成.hex文件,烧录之。
3.硬件展示
二、外部中断控制LED亮灭
1.STM32CubeMX工程配置
- 在前面配置的基础上增加PA5作为中断口,GPIO选为GPIO_EXTI5
输出模式选下降沿触发外部中断,上拉电阻。
- GPIO mode:
上升沿触发检测的外部中断模式(External Interrupt Mode with Rising edge trigger detection) |
下降沿触发检测的外部中断模式(External Interrupt Mode with Falling edge trigger detectiort) |
上升/下降沿触发检测的外部中断模式(External Interrupt Mode with Risinq/Falling edge trigger detection) |
上升沿触发检测的外部事件模式(External Event Mode with Rising edge trigger detection) |
下降沿触发检测的外部事件模式(External Event Mode with Falling edge trigger detection) |
上升/下降沿触发检测的外部事件模式(External Event Mode with Rising/Falling edge trigger detectiont) |
- 左侧NVIC,打开EXTI中的line[9:5] interrupt
或者GPIO中的NVIC也可设置
- 配置工程中勾选图中选项,GENERATE COOE。
2.代码部分
生成代码以后,进入程序;
1.首先,我们在左边stm32f1xx_it.c 里面找到中断处理函数;
2. 按F12跳转到此函数往下滑找到
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
函数
可以将所有操作都写在中断回调函数里面,代码如下:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==GPIO_PIN_5)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)==GPIO_PIN_RESET)//获取PA5电位
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
while(1)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)==GPIO_PIN_SET)
break;
}
}
}
}
3.硬件展示
三、仿真逻辑分析仪观察管脚的时序波形
周期正好为1秒。