一、点灯实验
1.CUBEMX配置
(1).PC8~PC15:
(2).RCC开启外部高速时钟
(3).SYS下载串口
(4).时钟树配置
(4).通用设置
通过Cubemx的初步配置到此就完成了。
2.keil5中的代码编写
(1).添加文件
a. 添加两个空白页,Ctrl+S保存到自己的创建的文件(我的是bsp)。(一个后缀.h 一个后缀.c)
b.点击魔术棒,添加文件路径,点击左侧文件bsp,在其中添加刚刚保存的.c文件。
(2).在创建的两个文件(.c和.h)里面写代码
led.c
#include"led.h"
void LED_Disp(uchar dsLED)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET); //开始就使所有灯灭
HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET); //左移8位
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET); //打开锁存器
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
led.h
#ifndef _LED_H_
#define _LED_H_
#include"main.h"
void LED_Disp(uchar dsLED);
#endif
main.c
#include"led.h"
LED_Disp(0x00); //led初始化
while (1)
{
LED_Disp(0x01); //选择第一个灯亮
HAL_Delay(500);
LED_Disp(0x00);
HAL_Delay(500); //实现第一个灯闪烁
}
二、按键操作
1.Cubemx配置4个按键串口和定时中断,通过中断函数来配合按键![](https://i-blog.csdnimg.cn/blog_migrate/426438633c4a880dce5d9b88fc44e00c.png)
2.keil5中的代码
interrupt.h
#include"interrupt.h"
struct keys key[4]={0,0,0}; //声明一个结构体变量
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) //中断回调函数
{
if(htim->Instance==TIM3) // 判断中断是否来自TIM3
{
key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0); //读取每一个按键的状态
key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
for(int i=0;i<4;i++)
{
switch (key[i].judge_sta)
{
case 0:
{
if(key[i].key_sta==0) key[i].judge_sta=1;
}
break;
case 1:
{
if(key[i].key_sta==0)
{
key[i].judge_sta=2;
key[i].single_flag=1;
}
else key[i].judge_sta=0;
}
break;
case 2:
{
if(key[i].key_sta==1)
{
key[i].judge_sta=0;
}
}
break;
}
}
}
}
interrupt.h
#ifndef _INTERRUPT_H_
#define _INTERRUPT_H_
#include"main.h"
#include"stdbool.h" //使用bool就要加这个头文件
struct keys //结构体
{
uchar judge_sta;
bool key_sta;
bool single_flag;
};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
#endif
main.c
extern struct keys key[];
HAL_TIM_Base_Start_IT(&htim3); //位置很重要,最好紧挨着while
while (1)
{
LED_Disp(0x01);
HAL_Delay(500);
LED_Disp(0x00);
HAL_Delay(500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
uchar text[30];
OLED_Clear();
if(key[0].single_flag==1)
{
sprintf((char *)text," key0down ");
OLED_ShowString(2,2,(uint8_t *)text);
key[0].single_flag=0;
}
if(key[1].single_flag==1)
{
sprintf((char *)text," key1down ");
OLED_ShowString(2,2,(uint8_t *)text);
key[1].single_flag=0;
}
if(key[2].single_flag==1)
{
sprintf((char *)text," key2down ");
OLED_ShowString(2,2,(uint8_t *)text);
key[2].single_flag=0;
}
if(key[3].single_flag==1)
{
sprintf((char *)text," key3down ");
OLED_ShowString(2,2,(uint8_t *)text);
key[3].single_flag=0;
}
}
/* USER CODE END 3 */
}
第一次写这个,刚好00:00完成。方便自己以后复习,也分享给大家参考。