HAL+M4学习记录_4

一、按键

记录学习使用HAL库读取板载按键输入键值

板载三颗按键,引脚配置如下
按键配置
其中K_UP按键按下为高电平,那么PA0引脚要配置为下拉模式;K0和K1按下为低电平,那么PE4和PE3引脚要配置为上拉模式。

二、通过按键控制LED

这里实现的功能是,按键K_UP按下同时点亮两个LED,再次按下熄灭两个LED;按键K0和K1分别按下,分别点亮LED1和LED2,再次分别按下,分别熄灭LED1和LED2。

代码如下

  • bsp_keys.c文件
/*
*********************************************************************************************************
*	                                   Module Description
*
*	独立按键驱动模块,板载三个按键K_UP、K0和K1,所接引脚分别是PA0、PE4和PE3
*	按键K_UP(WK_UP可作为待机唤醒选项)按下为高电平,设置为下拉输入模式
*	按键K0和按键K1按下为低电平,设置为上拉输入模式
*********************************************************************************************************
*/

#include "bsp.h"
									
/*
**********************************************************************************
*   @brief    按键硬件初始化,配置按键对应的GPIO
*   @param	  None
*   @return	  None
*   @note	  	
**********************************************************************************
*/
static void bsp_InitKeyHard()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	/* 打开GPIO时钟 */
	GPIO_CLK_ENABLE_K_UP();
	GPIO_CLK_ENABLE_K0();
	GPIO_CLK_ENABLE_K1();
	/* 配置K_UP为下拉输入,K0和K1为上拉输入 */
	GPIO_InitStructure.Mode 	= GPIO_MODE_INPUT;				// 输入模式
	GPIO_InitStructure.Speed 	= GPIO_SPEED_FREQ_VERY_HIGH;	// GPIO速度
	GPIO_InitStructure.Pin 		= GPIO_PIN_K_UP;				// K_UP引脚
	GPIO_InitStructure.Pull 	= GPIO_PULLDOWN;				// 下拉模式
	HAL_GPIO_Init(GPIO_PORT_K_UP, &GPIO_InitStructure);
	
	GPIO_InitStructure.Pin 		= GPIO_PIN_K0 | GPIO_PIN_K1;	// K0和K1引脚
	GPIO_InitStructure.Pull		= GPIO_PULLUP;					// 上拉模式
	HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
}

/*
**********************************************************************************
*   @brief    初始化按键驱动
*   @param	  None
*   @return	  None
*   @note	  	
**********************************************************************************
*/
void bsp_InitKey()
{
	bsp_InitKeyHard();
}

/*
**********************************************************************************
*   @brief    阻塞式按键扫描函数
*   @param	  None
*   @return	  键值,如下
*				K_UP按下返回3
*				K0按下返回1
*				K1按下返回2
*   @note	  
**********************************************************************************
*/
uint8_t bsp_ScanKey()
{
	uint8_t key_value 			= 0;			// 键值
	// K_UP按键检测
	if(K_UP_NOW == 1)
	{
		bsp_DelayMs(20);
		while(K_UP_NOW == 1);
		bsp_DelayMs(20);
		key_value = 3;
	}
	// K0按键检测
	if(K0_NOW == 0)
	{
		bsp_DelayMs(20);
		while(K0_NOW == 0);
		bsp_DelayMs(20);
		key_value = 1;
	}
	// K1按键检测
	if(K1_NOW == 0)
	{
		bsp_DelayMs(20);
		while(K1_NOW == 0);
		bsp_DelayMs(20);
		key_value = 2;
	}
	return key_value;
}

  • bsp_keys.h文件
#ifndef __BSP_KEYS_H
#define __BSP_KEYS_H

/* private define */
#define HARD_KEY_NUM			3											// 实体按键个数
// 按键引脚定义
#define GPIO_CLK_ENABLE_K_UP()	do{__HAL_RCC_GPIOA_CLK_ENABLE();}while(0)
#define GPIO_PORT_K_UP			GPIOA
#define GPIO_PIN_K_UP			GPIO_PIN_0

#define GPIO_CLK_ENABLE_K0()	do{__HAL_RCC_GPIOE_CLK_ENABLE();}while(0)
#define GPIO_PORT_K0			GPIOE
#define GPIO_PIN_K0				GPIO_PIN_4

#define GPIO_CLK_ENABLE_K1()	do{__HAL_RCC_GPIOE_CLK_ENABLE();}while(0)
#define GPIO_PORT_K1			GPIOE
#define GPIO_PIN_K1				GPIO_PIN_3
// 按键引脚当前电平
#define K_UP_NOW				HAL_GPIO_ReadPin(GPIO_PORT_K_UP, GPIO_PIN_K_UP)
#define K0_NOW					HAL_GPIO_ReadPin(GPIO_PORT_K0, GPIO_PIN_K0)
#define K1_NOW					HAL_GPIO_ReadPin(GPIO_PORT_K1, GPIO_PIN_K1)
// 键值定义
#define PRES_K_UP				3
#define PRES_K0					1
#define PRES_K1					2

/* public statement */
void bsp_InitKey();
uint8_t bsp_ScanKey();
#endif

  • main.c文件
#include "bsp.h"

/* public statement */
static void PrintInfo();

/* public define */
uint32_t key_num = 0;

int main()
{
	bsp_Init();
	//PrintInfo();			/* 打印开发板信息 */
	while(1)
	{
		key_num = bsp_ScanKey();
		if(key_num == 1)
		{
			bsp_LedToggle(1);
		}
		if(key_num == 2)
		{
			bsp_LedToggle(2);
		}
		if(key_num == 3)
		{
			bsp_LedToggle(1);
			bsp_LedToggle(2);
		}
	}
}
### Python实现视频分割处理 要通过Python实现视频分割,可以采用多种方式。以下是基于`PySceneDetect`库以及FFmpeg工具的解决方案。 #### 方法一:使用 PySceneDetect 进行场景检测并分割视频 PySceneDetect 是一种专门用于视频场景检测和分割的工具[^2]。它能够识别视频中的不同场景,并根据设定的阈值自动生成分割点。具体操作如下: 1. **安装依赖项** 需要先安装 `scenedetect` 库及其所需的外部工具(如 FFmpeg 或 mkvmerge)。 ```bash pip install scenedetect ``` 2. **编写脚本** 下面是一个简单的例子,展示如何利用 PySceneDetect 对视频进行分割: ```python import scenedetect from scenedetect.video_manager import VideoManager from scenedetect.scene_manager import SceneManager from scenedetect.detectors import ContentDetector video_path = 'input_video.mp4' output_dir = './output_scenes/' # 创建VideoManager对象 video_manager = VideoManager([video_path]) scene_manager = SceneManager() # 设置场景变化检测器 scene_manager.add_detector(ContentDetector(threshold=30.0)) base_timecode = video_manager.get_base_timecode() try: # 初始化视频管理器 video_manager.set_downscale_factor() video_manager.start() # 执行场景检测 scene_manager.detect_scenes(frame_source=video_manager) # 获取场景列表 scene_list = scene_manager.get_scene_list(base_timecode) print('Detected scenes:', scene_list) # 保存分割后的视频片段到指定目录 for i, scene in enumerate(scene_list): start_time = str(scene[0].get_seconds()) end_time = str(scene[1].get_seconds()) command = f"ffmpeg -i {video_path} -ss {start_time} -to {end_time} -c copy {output_dir}/scene_{i}.mp4" os.system(command) finally: video_manager.release() ``` 上述代码会读取输入视频文件,执行场景检测,并按照检测结果将视频切分为多个独立的小片段。 --- #### 方法二:手动设置时间间隔进行视频分割 如果不需要复杂的场景检测,而是希望简单地按固定的时间间隔来分割视频,则可以直接调用 FFmpeg 工具完成此任务[^3]。下面提供了一个封装好的函数示例: ```python import subprocess def split_video_by_interval(input_file, interval_sec, output_template="clip_%03d.mp4"): """ 按照给定的时间间隔分割视频 :param input_file: 输入视频路径 :param interval_sec: 时间间隔(秒) :param output_template: 输出文件名模板,默认为 clip_XXX.mp4 """ duration_command = ['ffprobe', '-i', input_file, '-show_entries', 'format=duration', '-v', 'quiet', '-of', 'csv=%s' % ("p=0")] result = subprocess.run(duration_command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) total_duration = float(result.stdout.strip()) # 总时长(单位:秒) current_start = 0 index = 1 while current_start < total_duration: next_end = min(current_start + interval_sec, total_duration) ffmpeg_cmd = [ "ffmpeg", "-i", input_file, "-ss", str(current_start), "-to", str(next_end), "-c:v", "copy", "-c:a", "copy", output_template.replace("%03d", "%03d" % (index,)) ] subprocess.call(ffmpeg_cmd) current_start += interval_sec index += 1 ``` 该函数接受三个参数:输入视频路径、每段视频持续时间和输出文件命名规则。运行后即可得到一系列短片断。 --- #### 注意事项 - 如果需要更精确控制或者支持更多格式转换选项,请考虑引入额外插件或调整命令行参数。 - 上述两种方案均需确保系统已正确配置好 FFmpeg 路径环境变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值