马上要毕业了,随便发点东西记录一下搞毕设的过程
这篇文章记录的是毕设第二周买回最小系统板和下载器这些东西以后导师安排的一些任务以及我自己的完成情况
先展示一下这周导师安排的任务
- 点亮一个led
- 熟悉并理解GPIO输出模式和输出速度
- 让LED闪烁
- 会使用延时函数
- 思考使用延时函数的缺点
- 使用按键控制LED亮灭
- 轮询方式的按键输入
- 中断方式的按键输入
- 总结外部中断和软中断的使用
- 主函数延时小于5ms时,让led闪烁(亮、灭时间分别为500ms和500ms)
- 思考如果用一个LED作为状态指示,怎么设计表示不同的状态
以上就是第二周导师安排的任务,接下来是对任务的分析以及实现
分析之前先简单交待一下开发的平台:
- 项目生成:QubeMX
- 工具链:Keil
- 开发板:常见的STM32F103C8T6最小系统板
任务一的要求是点亮一个LED,所使用的开发板上默认PC13连接了一颗LED灯,可以用于完成本实验。在QubeMX中将PC13初始化为推挽输出模式并且设置初始化电平为高电平,同时为PC13添加标签 【LED】
生成代码之后打开项目。可以在主函数内调用
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
来将LED点亮,同理,可以通过调用
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
来将LED熄灭。
为了进一步搞明白LED的输出模式和输出速度等内容,可以找到main函数内的
MX_GPIO_Init();
来查看具体的初始化内容:
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = LED_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);
可以看到在初始化时首先开启对应GPIO外设的时钟,这里对应的是GPIOC,随后设置初始化时的输出状态,这里调用
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
的效果是将GPIOC外设的ODR寄存器的bit13置位,使PC13初始化后输出高电平。
下方便是对PC13的配置内容,可以看到这里的模式为 GPIO_MODE_OUTPUT_PP 也就是推挽输出模式,速率为 GPIO_SPEED_FREQ_HIGH 也就是此芯片能够配置的最大输出速度为50MHz。由于是输出模式,所以Pull项不起作用。这里附上数据手册中GPIO位的基本结构示意图
任务二要求实现LED闪烁,这里将LED的点亮,熄灭,翻转等功能封装为对应的函数
void LED_ON(void)
{
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
}
void LED_OFF(void)
{
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
}
void LED_TOGGLE(void)
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
所谓LED闪烁无非令LED的亮灭状态不断交换,最基础的闪烁代码如下
LED_ON();
HAL_Delay(200);
LED_OFF();
HAL_Delay(200);
效果便是LED每400ms闪烁一次,点亮时长200ms。