oc初始化方法

OC系统自带初始化方法

1.init


alloc : 分配内存空间;

init: 初始化

[[Person alloc] init];    //相当于[Person new]  
new 执行顺序为alloc + init, new的初始化方法默认为init, 如果存在自定义构造方法的话,因此不建议使用new来创建对象。

2.重写init构造方法:

//init方法的重写
- (id)init {
    //一定要调用父类的init方法,因为父类要初始化自己的成员变量和属性
    //没有父类就没有子类
    if(self = [super init]){
        _age = 10;
    }
    return self;
}

3.自定义构造方法:

//声明
- (id)initWithName:(NSString *)name;
- (id)initWithAge:(int)age;
- (id)initWithName:(NSString *)name andAge:(int)age;

//实现
- (id)initWithName:(NSString *)name {
    if(self = [super init]) {
        _name = name;
    }
    return self;
}

- (id)initWithAge:(int)age {
    if (self = [super init]) {
        _age = age;
    }
    return self;
}

- (id)initWithName:(NSString *)name andAge:(int)age {
    if (self = [super init]) {
        _name = name;
        _age = age;
    }
    return self;
}
自定义构造方法注意点:

必须调用父类的初始化方法,来初始化父类中的成员变量和属性;

建议命名规则以initWith开头,方面使用。

<think>嗯,用户现在想找STM32初始化函数的示例代码和配置信息。之前他们问了关于GPIO初始化的内容,我给了他们SPL和HAL库的例子。现在他们可能想扩展了解其他模块的初始化,比如定时器、串口或者其他外设。根据用户提供的引用,里面有提到定时器初始化和串口发送函数的例子,还有提到一种不同的初始化函数写法,比如使用函数指针和内存段分配。需要结合这些引用内容,同时参考用户之前的问题来组织回答。 首先,用户需要的是不同模块的初始化函数示例,所以应该分模块给出代码示例,比如GPIO、定时器、USART等。同时,引用里的另一种初始化方法可能对用户有用,可以介绍一下。需要注意使用正确的库函数,比如标准外设库和HAL库的区别。用户之前的问题里已经涉及了GPIO,所以可能需要补充其他模块,比如定时器和串口,如引用中的例子。 另外,用户引用的内容里提到了使用MODULE_INIT宏来管理初始化函数,这可能是一种模块化的方法,可以解释一下这种方法的优势,比如提高代码可维护性。需要注意代码的正确性,比如时钟使能、结构体配置等步骤是否完整。 还要考虑用户可能的实际应用场景,比如他们可能在开发一个项目,需要多个外设的初始化,这时候模块化的方法会很有帮助。或者他们可能对如何组织初始化代码有疑问,需要最佳实践的建议。因此,在回答中不仅要提供代码示例,还要给出配置要点和注意事项,帮助用户理解每个步骤的重要性。 最后,生成的相关问题需要引导用户深入了解更多细节,比如不同库的区别、模块化设计的优势、时钟配置的重要性等。这样可以帮助他们进一步学习STM32的开发。</think>### STM32初始化函数代码示例与配置说明 以下是STM32常用外设初始化函数的代码示例及关键配置解析,覆盖GPIO、定时器、USART等模块,结合标准外设库(SPL)和模块化设计方法--- #### 一、GPIO初始化(SPL库) ```c // 配置PA5为推挽输出(LED控制) void GPIO_LED_Init(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 使能时钟[^1] GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` --- #### 二、定时器初始化(TIM2,SPL库) ```c void TIM2_PWM_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 使能TIM2时钟[^3] TIM_TimeBaseInitTypeDef TIM_BaseStruct; TIM_BaseStruct.TIM_Prescaler = 84 - 1; // 分频后时钟1MHz(假设主频84MHz) TIM_BaseStruct.TIM_Period = 1000 - 1; // PWM周期1ms TIM_BaseStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_BaseStruct); TIM_OCInitTypeDef TIM_OCStruct; TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1 TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OCStruct.TIM_Pulse = 500; // 初始占空比50% TIM_OC2Init(TIM2, &TIM_OCStruct); // 使用通道2 TIM_Cmd(TIM2, ENABLE); // 启动定时器 } ``` --- #### 三、USART初始化(HAL库) ```c void USART1_Init(void) { __HAL_RCC_USART1_CLK_ENABLE(); // 使能USART1时钟[^4] UART_HandleTypeDef huart1; huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; HAL_UART_Init(&huart1); } ``` --- #### 四、模块化初始化设计(参考引用[1]) 通过宏定义将初始化函数分配到特定内存区域: ```c // 定义初始化函数表 typedef void (*init_function_t)(void); #define MODULE_INIT(func) \ __attribute__((used, section("INIT_SECTION"))) init_function_t _init_##func = func // 注册初始化函数 MODULE_INIT(GPIO_LED_Init); MODULE_INIT(TIM2_PWM_Init); MODULE_INIT(USART1_Init); // 在main()中批量执行初始化 void System_Init(void) { extern init_function_t _init_start, _init_end; for (init_function_t *fn = &_init_start; fn < &_init_end; fn++) { (*fn)(); } } ``` --- ### 关键配置要点 1. **时钟使能优先级**: - GPIO/USART时钟通过`RCC_AHB1`或`RCC_APB2`使能 - 定时器时钟通过`RCC_APB1`或`RCC_APB2`使能(根据型号)[^3][^4] 2. **结构体参数验证**: - 定时器预分频值需满足:$f_{timer} = \frac{f_{clock}}{(TIM\_Prescaler + 1)}$ - USART波特率误差应小于3%(可通过CubeMX自动计算)[^2] 3. **硬件关联配置**: - GPIO复用功能需通过`GPIO_PinAFConfig()`绑定定时器/USART通道[^1] --- ### 常见问题解决方案 - **时钟未使能**:导致外设无响应,需检查`RCC_xxxPeriphClockCmd()`调用 - **引脚冲突**:使用CubeMX工具可视化配置引脚复用功能[^2] - **中断未配置**:对于USART接收等场景,需补充NVIC中断使能代码 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值