OC_ARC学习笔记

一 ARC概念及原理

1 指针分类

强指针:默认的情况下,所有的指针都是强指针,关键字strong
弱指针:__weak关键字修饰的指针(声明一个弱指针  __weak Person *p)    

2 什么是ARC

Automatic Reference Counting, 自动引用计数,即ARC。
基本原则: 永远不写retain  release autorelease
是编译器的特性,在代码编译时为你自动在合适的位置插入release或autorelease 
判断准则: 只要没有强指针指向对象,对象就会被释放。

二 ARC下单对象内存管理


car不在指向对象,Car对象就释放。
局部变量释放,即car不在指向对象,Car对象就释放。

三 ARC下多对象内存管理


无论Person对象中的dog对象是强指针还是弱指针,Person对象销毁,dog对象都将会销毁

四 ARC下@propoty参数

strong : 用于OC对象,相当于MRC中的retain
weak: 用于OC对象,相当于MRC中的assign(一般用于UI控件中)
assign : 用于基本数据类型, 跟MRC中的assign一样
copy: 一般用于NSString,跟MRC中的copy一样

<think> 我们正在配置定时器的输出比较模式,这里涉及两个结构体成员赋值。 在STM32 HAL库中,定时器的输出比较模式通过配置TIM_OC_InitTypeDef结构体来实现。 用户给出的两行代码实际上是相同的操作,但可能存在笔误(第二行中的TMR_OC_MODE_T可能是用户想写TIM_OC_InitTypeDef结构体的某个成员,但写错了)。 通常,我们会这样配置一个定时器的PWM输出: 步骤如下: 1. 初始化定时器时基(使用TIM_HandleTypeDef结构体)。 2. 配置输出比较通道(使用TIM_OC_InitTypeDef结构体)。 3. 调用HAL_TIM_PWM_ConfigChannel函数来配置通道。 4. 启动PWM输出。 其中,输出比较模式设置的是TIM_OC_InitTypeDef结构体的.OCMode成员。 用户给出的第一行:ocConfig.mode = TIM_OC_MODE_PWM1; 是正确的,ocConfig应该是TIM_OC_InitTypeDef类型的一个结构体变量。 第二行:TMR_OC_MODE_T = TIM_OC_MODE_PWM1; 可能是错误的,因为TMR_OC_MODE_T看起来像是一个类型(枚举类型),而不是变量。 因此,我们只需要第一行赋值即可。 下面是一个使用STM32 HAL库配置定时器PWM的示例代码。 假设我们使用TIM3的通道1(CH1)来产生PWM。 </think> 在STM32 HAL库中,这行代码用于配置定时器的输出比较模式为PWM模式1。下面是详细解释和完整实现: ### PWM模式配置详解 **输出比较模式选择**: - `TIM_OC_MODE_PWM1`:计数器向上计数时,当计数器值小于比较寄存器的值时输出有效电平(通常为高电平) - `TIM_OC_MODE_PWM2`:计数器向上计数时,当计数器值大于比较寄存器的值时输出有效电平 ```c TIM_OC_InitTypeDef ocConfig = {0}; // 定义输出比较配置结构体 // 配置PWM模式 ocConfig.OCMode = TIM_OC_MODE_PWM1; // 选择PWM模式1 ocConfig.Pulse = 100; // 设置比较值(占空比) ocConfig.OCPolarity = TIM_OCPOLARITY_HIGH; // 输出极性(高电平有效) ocConfig.OCFastMode = TIM_OCFAST_DISABLE; // 不启用快速模式 // 应用配置到通道 HAL_TIM_PWM_ConfigChannel(&htim3, &ocConfig, TIM_CHANNEL_1); // 启动PWM输出 HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); ``` ### 代码解析: 1. **TIM_OC_InitTypeDef结构体**: - `OCMode`:输出比较模式选择 - `Pulse`:比较寄存器值,决定占空比(计算公式:占空比 = Pulse / ARR * 100%) - `OCPolarity`:输出极性(高/低电平有效) - `OCFastMode`:快速模式开关(用于紧急更新输出状态) 2. **配置流程**: - 初始化定时器时基(设置ARR、PSC等) - 配置输出比较参数 - 启动PWM输出 3. **PWM模式对比**: | 模式 | 向上计数行为 | 向下计数行为 | 适用场景 | |------|-------------|-------------|---------| | PWM1 | CNT < CCR → 有效电平 | CNT > CCR → 有效电平 | 标准PWM | | PWM2 | CNT < CCR → 无效电平 | CNT > CCR → 无效电平 | 反向PWM | ### 完整PWM初始化示例: ```c void PWM_Init(void) { TIM_HandleTypeDef htim3; TIM_OC_InitTypeDef ocConfig = {0}; // 1. 配置时基 htim3.Instance = TIM3; htim3.Init.Prescaler = 83; // 84MHz/84 = 1MHz htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 999; // PWM频率 = 1MHz/1000 = 1kHz htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim3); // 2. 配置输出比较 ocConfig.OCMode = TIM_OC_MODE_PWM1; // 核心配置 ocConfig.Pulse = 500; // 50%占空比 ocConfig.OCPolarity = TIM_OCPOLARITY_HIGH; ocConfig.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim3, &ocConfig, TIM_CHANNEL_1); // 3. 启动PWM HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); } ``` ### 注意事项: 1. 使用前需确保: - 定时器时钟已使能(`__HAL_RCC_TIM3_CLK_ENABLE()`) - GPIO已配置为复用输出模式 - 正确映射定时器通道到引脚 2. 动态调节占空比: ```c __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, new_value); // 或 TIM3->CCR1 = new_value; // 直接寄存器操作更快 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值