目录
全部代码和文档 百度网盘链接
链接:https://pan.baidu.com/s/1zUDpFD3FFf-5tfISb8_JnQ?pwd=8888
提取码:8888
--来自百度网盘超级会员V3的分享
实验一:LED灯显示实验
led.h
void led_Init(void); 初始化LED引脚的函数。
void led_alloff(void): 关闭所有LED灯的函数。
void led_allon(void): 打开所有LED灯的函数。
void led_liushuideng(void): 控制LED灯流水灯效果的函数。
void led_breath(void): 控制LED灯呼吸灯效果的函数。
void led_666(void): 控制LED灯特殊效果的函数。
led.c
void led_Init(void)
{
GPIO_InitTypeDef gpio; // 定义一个GPIO_InitTypeDef类型的结构体变量gpio,用于配置GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB外设时钟
gpio.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; // 设置GPIO的引脚,这里是设置了GPIOB的引脚8-15
gpio.GPIO_Speed = GPIO_Speed_2MHz; // 设置GPIO的速度,这里是2MHz
gpio.GPIO_Mode = GPIO_Mode_Out_PP; // 设置GPIO的模式为推挽输出模式
GPIO_Init(GPIOB, &gpio); // 初始化GPIOB的引脚为配置好的参数
}
void led_666(void)
{
led_alloff(); // 关闭所有LED灯
uint16_t a = 0x0100; // 定义变量a并初始化为0x0100 (二进制表示:0000 0001 0000 0000)
uint16_t b = 0x8000; // 定义变量b并初始化为0x8000 (二进制表示:1000 0000 0000 0000)
for(int i = 0; i <= 3; i++) {
GPIOB->BSHR = a; // 使用位带操作将变量a的值写入GPIOB的BSHR寄存器
a = a << 1; // 将变量a左移1位
GPIOB->BSHR = b; // 使用位带操作将变量b的值写入GPIOB的BSHR寄存器
b = b >> 1; // 将变量b右移1位
Delay_Ms(500); // 延时500毫秒
}
for(int i = 0; i <= 4; i++) {
GPIOB->BCR = a; // 使用位带操作将变量a的值写入GPIOB的BCR寄存器
a = a >> 1; // 将变量a右移1位
GPIOB->BCR = b; // 使用位带操作将变量b的值写入GPIOB的BCR寄存器
b = b << 1; // 将变量b左移1位
Delay_Ms(500); // 延时500毫秒
}
}
main.c
#include "debug.h"
int main(void)
{
led_Init(); // 初始化LED
Delay_Init(); // 初始化延迟函数
led_alloff(); // 关闭所有LED灯
while(1)
{
led_allon(); // 打开所有LED灯
Delay_Ms(500); // 延迟500毫秒
led_alloff(); // 关闭所有LED灯
led_liushuideng(); // 水流灯效果
Delay_Ms(500); // 延迟500毫秒
led_breath(); // 呼吸灯效果
Delay_Ms(500); // 延迟500毫秒
led_666(); // 自定义的灯效
Delay_Ms(1000); // 延迟1000毫秒
}
}
实验二:独立按键控制实验(中断)
Bsp_button.h
#include "bsp.h"
void bsp_ButtonInit(void);
uint8_t bsp_ReadButton(void);
Bsp_button.c
#include "bsp_Button.h"
//使用特殊的 __attribute__((interrupt("WCH-Interrupt-fast")))来修饰中断服务函数
void EXTI0_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void EXTI1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void EXTI2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void EXTI3_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void EXTI4_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void EXTI9_5_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void EXTI15_10_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
//extern uint8_t SystemStatus;
uint8_t KeyNum = 0;
uint8_t FormarKeyNum = 0;
void bsp_ButtonInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); // 使能PA和PB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; // 选定PA的13和14引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 设定引脚模式为浮动输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度
GPIO_Init(GPIOA, &GPIO_InitStructure); // 根据设定参数初始化GPIOA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4; // 选定PB的3和4引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 设定引脚模式为浮动输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度
GPIO_Init(GPIOB, &GPIO_InitStructure); // 根据设定参数初始化GPIOB
bsp_BeepInit();
//以下为开启中断方式读取键盘
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// 配置GPIOB的引脚3为外部中断输入,并将其连接到EXTI_Line3上
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource3);
EXTI_InitStructure.EXTI_Line = EXTI_Line3; // 外部中断线为EXTI_Line3
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 外部中断模式为中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 触发方式为下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能外部中断线
EXTI_Init(&EXTI_InitStructure);
// 配置NVIC中断向量表的参数,使能EXTI3_IRQn中断通道,设置优先级为2,子优先级为2
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 配置GPIOB的引脚4为外部中断输入,并将其连接到EXTI_Line4上
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource4);
EXTI_InitStructure.EXTI_Line = EXTI_Line4; // 外部中断线为EXTI_Line4
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 外部中断模式为中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 触发方式为下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能外部中断线
EXTI_Init(&EXTI_InitStructure);
// 配置NVIC中断向量表的参数,使能EXTI4_IRQn中断通道,设置优先级为2,子优先级为2
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 配置GPIOA的引脚13为外部中断输入,并将其连接到EXTI_Line13上
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource13);
EXTI_InitStructure.EXTI_Line = EXTI_Line13; // 外部中断线为EXTI_Line13
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 外部中断模式为中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 触发方式为下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能外部中断线
EXTI_Init(&EXTI_InitStructure);