一、采用中断模式控制LED灯
(一)题目要求
用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。
(二)创建工程
1、STM32CubeMX
(1)配置管脚
我选择PA5接LED,PB9作为外部中断触发
PA5选择Output,PB9选择中断触发EXTI_9
(2)配置GPIO
PA5默认设置即为高电平点亮,不用更改
(3)开启中断
选择NVIC,勾选Enabled
(4)设置时钟树
先配置时钟,选择晶振
配置时钟树
(5)工程相关设置
2、Keil
打开工程
查看一下gpio.c文件,__weak为虚函数,需要我们自己编写
在main.c里加入代码:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if( GPIO_Pin == interrupt_Pin)//判断外部中断源
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);//翻转PA5状态
}
}
编译,生成.hex文件
(三)烧录
(四)运行结果
3.3V时亮,接地时灭
二、采用串口中断方式进行串口通信
(一)代码编写
这里用的是学长已经写好的代码,注释很详细,可以慢慢学习
链接:https://pan.baidu.com/s/1T3pxkaoRwqnduxtEOk0pXA
提取码:9teg
bsp_usart.c:
#include "bsp_usart.h"
// 串口中断服务函数
void DEBUG_USART_IRQHandler(void)
{
uint8_t ucTemp;
//串口一接收中断
if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)
{
//获取接收到的数据
ucTemp = USART_ReceiveData(DEBUG_USARTx);
//如果接收标志为 0 ,则执行下面的部分
if((USART_RX_FLAG & 0x8000) == 0)
{
//接收到了0x0d
if(USART_RX_FLAG & 0x4000)
{
//接收错误,重新开始
if(ucTemp != 0x0a)
USART_RX_FLAG=0;
//接收完成
else
USART_RX_FLAG |= 0x8000;
}
//还未接收到0x0d
else
{
//接收到回车
if(ucTemp == 0x0d)
{
USART_RX_FLAG |= 0x4000