20150617_OC之父类指针指向子类对象

本文详细介绍了Objective-C中使用父类指针指向子类对象实现多态的方法,通过定义Animal类及其子类Cat和Dog,展示了如何通过方法重写和多态特性来打印不同动物的特定行为和属性。
//
//  Animal.h
//  IOS150617_ObjectiveC_父类指针指向子类对象
//
//  Created by qianfeng on 15/6/17.
//  Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Animal : NSObject
{
    NSString    *_name;
    NSInteger    _age;
}

@property (copy,nonatomic)NSString *name;
@property (assign ,nonatomic)NSInteger age;

- (void)printAnimalFood;
@end

<pre name="code" class="objc">//  Animal.m
//  IOS150617_ObjectiveC_父类指针指向子类对象
//
//  Created by qianfeng on 15/6/17.
//  Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

#import "Animal.h"

@implementation Animal

- (void)printAnimalFood
{
    
}

- (NSString *)description
{
    return [NSString stringWithFormat:@"name = %@,age = %li",[self name],[self age]];
}

@end

//  Cat.h
//  IOS150617_ObjectiveC_父类指针指向子类对象
//
//  Created by qianfeng on 15/6/17.
//  Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

#import "Animal.h"

@interface Cat : Animal
{
    NSString *_colorOfCat;
}
@property (copy,nonatomic)NSString *colorOfCat;
@end

//  Cat.m
//  IOS150617_ObjectiveC_父类指针指向子类对象
//
//  Created by qianfeng on 15/6/17.
//  Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

#import "Cat.h"

@implementation Cat
- (void)printAnimalFood
{
    NSLog(@"Cat like to eat fish");
}

- (NSString *)description
{
    return  [NSString stringWithFormat:@"name = %@,age = %li,color = %@",_name,_age,self->_colorOfCat];
}
@end

//  Dog.h
//  IOS150617_ObjectiveC_父类指针指向子类对象
//
//  Created by qianfeng on 15/6/17.
//  Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

#import "Animal.h"

@interface Dog : Animal
{
    float _weight;
}
@property (assign,nonatomic)float weight;
@end



<pre name="code" class="objc">//
//  Dog.m
//  IOS150617_ObjectiveC_父类指针指向子类对象
//
//  Created by qianfeng on 15/6/17.
//  Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

#import "Dog.h"

@implementation Dog

- (void)printAnimalFood
{
    NSLog(@"Dog like to eat bone");
}

- (NSString *)description
{
    return [NSString stringWithFormat:@"name = %@,age = %li,weight = %.2f",_name,_age,_weight];
}
@end



<pre name="code" class="objc">//  main.m
//  IOS150617_ObjectiveC_父类指针指向子类对象
//
//  Created by qianfeng on 15/6/17.
//  Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Cat.h"
#import "Dog.h"

//多态,父类指针指向子类对象,
void printInfo(Animal *animal)
{
    [animal printAnimalFood];
    NSLog(@"%@",animal.description);
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Dog *dog = [[Dog alloc]init];
        dog.name = @"狗";
        dog.age  = 12;
        dog.weight = 12.34;
        [dog printAnimalFood];
        NSLog(@"%@",dog.description);
        
        //父类的对象指针指向子类的对象
        //调用的方法看具体对象的类型,先从子类查找对应方法的实现,子类没有实现对应的方法,跳到父类查找对应的方法实现,父类没有实现对应的方法,再继续向上追踪到父类的父类
        Animal *dogAnimal = dog;
        [dogAnimal printAnimalFood];
        NSLog(@"%@",dogAnimal.description);
    
        Cat *cat = [[Cat alloc] init];
        cat.name = @"猫";
        cat.age  = 10;
        cat.colorOfCat = @"白色";
        [cat printAnimalFood];
        NSLog(@"%@",[cat description]);
        
        Animal *catAnimal = cat;
        [catAnimal printAnimalFood];
        NSLog(@"%@",catAnimal.description);
        
        NSLog(@"==========多态=========");
        //多态,根据不同的对象,打印不同的结果
        printInfo(cat);
        printInfo(dog);
    }
    return 0;
}




<think>我们正在讨论STM32标准外设库中的定器输出比较(OC)配置函数。用户特别询问了TIM_OC1Init和TIM_OC2Init的使用方法和功能。 根据引用[1]和[5]: - TIM_OCxInit函数用于配置定器的输出比较通道x(x=1,2,3,4) - 每个定器最多有4个输出比较通道,分别对应TIM_OC1Init, TIM_OC2Init, TIM_OC3Init, TIM_OC4Init - 这些函数需要传入定器外设指针(如TIM1, TIM2等)和配置结构体指针 功能详解: 1. 配置输出比较模式(如PWM模式、翻转模式等) 2. 设置输出状态(使能/禁用) 3. 设置比较值(决定PWM占空比或事件发生机) 4. 配置输出极性(高电平有效或低电平有效) 使用方法: 1. 先定义并初始化TIM_OCInitTypeDef结构体变量(建议用TIM_OCStructInit初始化默认值) 2. 配置该结构体的成员(如模式、输出状态、脉宽、极性等) 3. 调用对应的通道初始化函数(TIM_OC1Init用于通道1,TIM_OC2Init用于通道2) 4. 可选:使能预装载寄存器(TIM_OCxPreloadConfig) 5. 使能定器和PWM输出(高级定器需要TIM_CtrlPWMOutputs) 注意: - 不同通道的配置相互独立 - 同一个定器的不同通道共用基 - 必须提前配置好基(TIM_TimeBaseInit) 对比TIM_OC1Init与TIM_OC2Init: - 功能完全相同,仅针对不同通道 - 通道1对应CH1引脚,通道2对应CH2引脚 - 寄存器映射不同(TIM_OC1Init配置CCR1等寄存器,TIM_OC2Init配置CCR2等) 示例代码(通道1和通道2配置为PWM): ```c // 基配置(省略)... // 通道1配置 TIM_OCInitTypeDef oc1; TIM_OCStructInit(&oc1); oc1.TIM_OCMode = TIM_OCMode_PWM1; oc1.TIM_OutputState = TIM_OutputState_Enable; oc1.TIM_Pulse = 300; // 占空比由ARR和此值决定 oc1.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &oc1); // 配置TIM3通道1 // 通道2配置(似,可不同参数) TIM_OCInitTypeDef oc2; TIM_OCStructInit(&oc2); oc2.TIM_OCMode = TIM_OCMode_PWM1; oc2.TIM_OutputState = TIM_OutputState_Enable; oc2.TIM_Pulse = 600; // 不同的占空比 oc2.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM3, &oc2); // 配置TIM3通道2 // 使能预装载(可选) TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); // 通道1预装载使能[^2] TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); // 通道2预装载使能 // 启动定器 TIM_Cmd(TIM3, ENABLE); ``` 常见问题: - 未添加stm32f10x_tim.c文件导致链接错误(引用[5]) - 高级定器需要额外使能PWM主输出(TIM_CtrlPWMOutputs) - 占空比计算:$Duty = \frac{TIM\_Pulse}{ARR+1} \times 100\%$ 注意事项: - 同一个定器的不同通道PWM频率相同(因为ARR相同) - 每个通道可以独立设置占空比(通过不同的TIM_Pulse) 相关问题: 1. 如何同配置定器的多个输出比较通道? 2. TIM_OCxPreloadConfig函数有什么作用? 3. 定器输出比较能否产生中断? </think>### TIM_OC1Init和TIM_OC2Init详解 #### 1. 功能定位 在STM32标准外设库中,`TIM_OC1Init`和`TIM_OC2Init`是定器输出比较(Output Compare)功能的初始化函数: - **TIM_OC1Init**:配置定器的**通道1**输出比较功能 - **TIM_OC2Init**:配置定器的**通道2**输出比较功能 两者功能相同,仅是针对不同硬件通道(CH1/CH2)的配置入口[^1][^5]。 #### 2. 核心功能 ```mermaid graph TD A[TIM_OCxInit函数] --> B[配置输出比较模式] A --> C[设置输出状态] A --> D[写入比较值CCRx] A --> E[配置输出极性] B --> F[PWM模式/Toggle模式等] C --> G[使能/禁用输出] D --> H[决定占空比/翻转点] E --> I[高电平有效/低电平有效] ``` ##### 关键操作: - **设置比较寄存器**:写入`CCRx`值(x=1,2),决定PWM占空比或输出翻转刻 $$ \text{占空比} = \frac{\text{TIM\_Pulse}}{\text{ARR} + 1} \times 100\% $$ - **模式配置**:支持6种工作模式 ```c TIM_OCMode_Timing // 冻结模式(无输出) TIM_OCMode_Active // 匹配置有效电平 TIM_OCMode_Inactive // 匹配置无效电平 TIM_OCMode_Toggle // 匹配电平翻转 TIM_OCMode_PWM1 // PWM模式1 TIM_OCMode_PWM2 // PWM模式2 ``` - **极性控制**:`TIM_OCPolarity_High`(高电平有效)或`TIM_OCPolarity_Low`(低电平有效)[^4] #### 3. 使用方法 **标准配置流程:** ```c // 1. 定义配置结构体 TIM_OCInitTypeDef ocConfig; // 2. 加载默认参数(重要!) TIM_OCStructInit(&ocConfig); // 避免未初始化错误[^1] // 3. 配置参数 ocConfig.TIM_OCMode = TIM_OCMode_PWM1; ocConfig.TIM_OutputState = TIM_OutputState_Enable; ocConfig.TIM_Pulse = 250; // 比较值=250 ocConfig.TIM_OCPolarity = TIM_OCPolarity_High; // 4. 应用配置到指定通道 TIM_OC1Init(TIM3, &ocConfig); // 通道1 TIM_OC2Init(TIM3, &ocConfig); // 通道2 // 5. 使能预装载寄存器(可选但推荐) TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); // 通道1[^2] TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); // 通道2 // 6. 启动定器 TIM_Cmd(TIM3, ENABLE); ``` #### 4. 通道差异说明 | **特性** | TIM_OC1Init (通道1) | TIM_OC2Init (通道2) | |---------------|-----------------------------|-----------------------------| | **对应寄存器** | CCR1, CCMR1低位 | CCR2, CCMR1高位 | | **引脚映射** | TIMx_CH1 (如PA8/TIM1_CH1) | TIMx_CH2 (如PA9/TIM1_CH2) | | **特殊功能** | 可连接TRGO/从模式控制器 | 无特殊功能 | | **中断/DMA源** | TIM_IT_CC1 / TIM_DMA_CC1 | TIM_IT_CC2 / TIM_DMA_CC2 | #### 5. 典型应用场景 **PWM输出配置实例(双通道):** ```c // 基配置 TIM_TimeBaseInitTypeDef tb; tb.TIM_Period = 999; // ARR=999 tb.TIM_Prescaler = 71; // 72MHz/(71+1)=1MHz → 1KHz PWM TIM_TimeBaseInit(TIM3, &tb); // 通道1配置(50%占空比) TIM_OCInitTypeDef oc1; TIM_OCStructInit(&oc1); oc1.TIM_OCMode = TIM_OCMode_PWM1; oc1.TIM_OutputState = TIM_OutputState_Enable; oc1.TIM_Pulse = 500; // 占空比 = 500/(999+1)=50% TIM_OC1Init(TIM3, &oc1); // 通道2配置(30%占空比) TIM_OCInitTypeDef oc2; TIM_OCStructInit(&oc2); oc2.TIM_OCMode = TIM_OCMode_PWM1; oc2.TIM_OutputState = TIM_OutputState_Enable; oc2.TIM_Pulse = 300; // 占空比 = 300/(999+1)=30% TIM_OC2Init(TIM3, &oc2); // 启用定器 TIM_Cmd(TIM3, ENABLE); ``` #### 6. 常见问题解决 - **未定义符号错误**:确认已添加`stm32f10x_tim.c`到工程(引用[5]) - **无输出信号**: 1. 检查GPIO是否配置为复用推挽输出 2. 高级定器需调用`TIM_CtrlPWMOutputs(TIMx, ENABLE)` 3. 验证`TIM_OutputState`是否使能 - **占空比异常**:确认`TIM_Pulse`值小于等于ARR值
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值