STM32实现HAL库LED点灯

目录

一、相关环境

STM32CubeMX

介绍

安装下载

相关配置完善

尝试使用该软件,点亮LED灯

项目创建

代码示例 

二、任务实现

1、使用HAL库方式完成LED灯的周期闪烁

要求1

项目创建

代码示例

要求2

项目创建 

代码示例

2、使用仿真软件分析仪功能观察时序波形

项目创建

结果

代码示例(同上,也可在上面粘贴)

总结


学习目标:

一.  使用HAL库方式完成LED灯的周期闪烁;

二. 使用仿真软件分析仪功能观察时序波形。

一、相关环境

STM32CubeMX

介绍

STM32CubeMX是STMicroelectronics推出的图形化配置工具,简化了STM32微控制器的初始化和配置过程。其直观的界面和自动生成初始化代码的特点,使开发人员能够轻松配置引脚分配、时钟设置和外设参数。支持多种STM32系列微控制器,包括常用的STM32F系列。集成外设配置功能,包括GPIO、UART、SPI等,同时提供硬件资源冲突检测,帮助开发人员避免潜在问题。总之,STM32CubeMX是一款强大而方便的工具,加速了STM32微控制器应用的开发过程。

安装下载

下载地址:https://www.st.com/en/development-tools/stm32cubemx.html

根据以上地址进入官网,选择合适的版本,

再根据以下步骤进行操作,完成下载安装;

 点击应用程序,进入安装:

 接下来选择安装位置;

 等待上述进度条走完,再点击 "Next";

 点击 "Done" 过后,安装成功。

相关配置完善

注意:使用之前要完成用户信息的注册

点击 "Help" ,再选择其目录下的 "Manage ......" ,进入配置界面;

选择 "STM32F1" ,再选择 1.8.5 版本。

下载过后即可完成配置。

尝试使用该软件,点亮LED灯

项目创建

 左上角选择 "STM32F103C8T6" ,再选择下面的 "STM32F103C8T6" ,双击选择,即成功创建项目;

 在 "Categories" 下选择 "SYS" ,然后在 "Debug" 处选择 "Serial Wrie" ;

再选择上方的 "RCC" ,在高速时钟配置下选择最后一项 "Crysta......." ; 

 选择Clock Configuration,根据上图所示进行调整配置;

再配置引脚PC13,选择 "GPIO_Output" ;

 根据指示选择 "MDK-ARM"  ,并且选择 V4 版本;

勾选合适上图所示的部分,完成基本配置。

代码示例 

 注意:主函数代码中在while函数中添加下列代码


 while (1)
  {
    /* USER CODE END WHILE */
    
    /* USER CODE BEGIN 3 */
//自定义部分
        HAL_Delay(500);
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);//电平翻转函数
		HAL_Delay(500);
 
  }
  /* USER CODE END 3 */

连接开发板,即可点亮。 

二、任务实现

1、使用HAL库方式完成LED灯的周期闪烁

要求1

重做上一个LED流水灯作业,用GPIO端口完成2只LED灯的周期闪烁

项目创建

接上述点亮LED灯的 RCC 配置过后,操作如下:


选择PC13,PA15,PB0,设置GPIO_OUTPUT;

并将输出改为高电频模式;

 再根据上述操作过后,接上上述点卡亮LED灯的后续操作,将代码同样处理即可。

代码示例
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);  // 灯1亮
	HAL_Delay(1000); // 延时1s
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);  // 灯1灭
	  
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);  // 灯2亮
	HAL_Delay(1000); // 延时1s
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);  // 灯2灭
	  
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);  // 灯3亮
	HAL_Delay(1000); // 延时1s
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);  // 灯3灭

要求2

再用GPIO端某一管脚接2个开关(用杜邦线模拟代替)。采用中断模式编程,当2分开关接高电平时,对应的两个LED灯停止工作(即停止周期性闪烁),接低电平时,恢复工作。

项目创建 

较上述区别如下:

 将0、1调整为下降沿触发

 再保存编写代码,和上述操作一致。

代码示例

代码操作较上有区别:在main主函数外加入下述代码。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	
	switch(GPIO_Pin){
		case GPIO_PIN_0:
			if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET)
				HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
		break;
		case GPIO_PIN_1:
			if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1) == GPIO_PIN_RESET)
				HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
		break;
	}
}

2、使用仿真软件分析仪功能观察时序波形

具体要求:

在没有示波器条件下,使用Keil的软件仿真逻辑分析仪功能观察LED管脚的时序波形,分析上面作业按键中断时,LED灯的波形变化情况。 

项目创建

接上述要求1过后的操作

保存并打开项目,自动跳转KEIL

 将代码放入主函数中的while(1)

照上进行配置;

输入(PORTB & 0X00000000)>>0Display Type选择Bit,依次输入(PORTA & 0X00008000)>>15(PORTC & 0X00002000)>>13

完成配置后点击Close即可。

 最后点击图上的位置,完成观察。

结果

代码示例(同上,也可在上面粘贴)

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);  // 灯1亮
	HAL_Delay(1000); // 延时1s
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);  // 灯1灭
	  
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);  // 灯2亮
	HAL_Delay(1000); // 延时1s
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);  // 灯2灭
	  
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);  // 灯3亮
	HAL_Delay(1000); // 延时1s
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);  // 灯3灭

总结

相较于传统的标准外设库(SPL)和汇编语言,使用STM32的硬件抽象层(HAL)库可以带来更简化和高效的开发体验。HAL库提供了简单易用的编程接口,通过高级函数封装了对硬件的直接操作,使得代码更易读、易维护,并具有跨系列的代码兼容性。与此相比,传统方法需要更深的硬件了解、代码复杂度更高,并且在移植性方面存在挑战。因此,对于大部分应用而言,HAL库提供了更便捷、高效的开发路径,尤其是在商业应用中追求开发周期和成本效率的情况下。

### IAA 游戏生命周期价值 (LTV) 预估方法 对于IAA(广告变现)游戏而言,预估用户生命周期价值(LTV)是一个复杂的过程,涉及多个因素的考量。为了更精确地预测不同时间范围内的LTV值,可以采用基于历史数据的时间序列模型来估计特定时间段(如3天、5天、15天或30天)[^1]。 #### 数据收集与准备 要构建有效的LTV预估模型,首先需要确保拥有足够的高质量输入数据。这些数据通常包括但不限于: - 用户首次安装日期 - 每日活跃度指标(DAU/MAU) - 日均ARPU(Average Revenue Per User),即单个用户的平均每日贡献金额 - AIPU(Average Impressions Per User), 表示每位用户每天看到的广告数量 - ECPM(Efficient Cost Per Mille),代表每千次展示带来的收入 ```python import pandas as pd data = { 'install_date': ['2023-07-01', '2023-07-02'], 'daily_active_users': [100, 110], 'arpu': [0.5, 0.6], 'aipu': [5, 6], 'ecpm': [5.0, 5.5] } df = pd.DataFrame(data) print(df.head()) ``` #### 构建线性回归模型 一种简单而有效的方法是利用线性回归算法建立LTV与其他变量之间的关系。假设存在如下公式用于描述第n天的预期LTV: \[ \text{LTV}_n = w_0 + w_1\cdot(\sum_{i=1}^{n}\text{ARPU}) + w_2\cdot(\sum_{i=1}^{n}\text{AIPU}) + w_3\cdot(\sum_{i=1}^{n}\text{ECPM}) \] 其中\(w_i\)表示权重系数,可以通过最小二乘法或其他优化技术求解得出最优参数组合[^3]。 #### 时间衰减因子的应用 考虑到随着时间推移新用户可能会逐渐减少参与度甚至流失,在计算长期LTV时引入时间衰减因子是非常必要的。这有助于更加贴近实际情况反映未来可能产生的收益变化趋势。 例如,如果设定一个简单的指数衰减速率r,则可以在上述基础上调整为: \[ \text{Adjusted LTV}_{n,days}=\text{LTV}_n\times e^{-rdays} \] 这里days指距离初始注册后的天数间隔;e自然常数约等于2.71828... #### 实际案例应用 具体实施过程中还需要考虑更多细节问题,比如季节效应的影响以及市场环境的变化等因素都会影响最终的结果准确性。因此建议定期更新训练集并重新校准模型以保持其时效性和可靠性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值