默认参数与初始化列表补充

针对前天默认参数与初始化列表机制的一些深究
const类型和引用类型,在创建时,必须进行初始化。就是用参数列表初始化,移到构造函数体内部,则无法通过编译。也就是说,一旦进入构造函数体,初始化就已经完成了。那么其他内置类型或者自定义类型是不是这样的呢

#include<iostream>
using namespace std;
class CExample {
public:
    int a;
    float b;
    //构造函数初始化列表
    //CExample(): a(0),b(8.8)
    //{}
    //构造函数内部赋值
    CExample()
    {
        cout<<this->a<<this->b<<endl;
        a=0;
        b=8.8;
    }
};
int main(){
      CExample c1;
      cout<<c1.a<<c1.b<<endl;
}

在本地做了个test,编译器migwin 答案是肯定的,

结论:构造函数内中对类成员给初值,这之前函数成员是不是已经被初始化过了,给的是垃圾值,说是构造函数,在进入函数体前,已经初始化了函数成员,一旦进入函数体所做的操作只是重新赋值,无论是给了默认参数,还是在函数体内直接赋值

只有参数化列表是真正意义上的初始化,豁然开朗

<think>好的,用户之前已经让我介绍了STM32C8T6软件模拟主机SPI的实现,并且他们现在需要补充一个串口初始化函数。我需要先回顾之前的对话,确保理解用户的需求。 用户之前给出的代码中,主函数里调用了USART1_Init(115200),但该函数的具体实现被省略了。现在用户要求补充这个串口初始化函数。因此,我需要提供一个完整的USART1_Init函数,配置USART1以指定的波特率工作,比如115200bps。 首先,我需要确定用户使用的STM32型号是STM32C8T6,属于STM32F1系列,因此对应的寄存器配置和时钟设置需要符合F1系列的标准。USART1通常挂载在APB2总线上,所以需要启用APB2的时钟,包括USART1和对应的GPIO端口。 接下来,考虑USART1使用的引脚。通常USART1的TX是PA9,RX是PA10。所以需要配置这两个引脚为复用推挽输出(TX)和浮空输入(RX)。不过,有些情况下,RX可能配置为输入模式,但根据标准配置,可能需要检查是否正确。 然后,配置USART的参数:波特率115200,8位数据位,无校验,1停止位,无硬件流控制,收发使能。需要计算正确的波特率寄存器值,对于STM32F1,计算公式是USARTDIV = (APB2_CLK / (16 * baudrate)),然后取整数和小数部分。假设系统时钟是72MHz,APB2时钟也是72MHz,那么计算115200的波特率:USARTDIV=72000000/(16*115200)=39.0625,所以DIV_Mantissa=39,DIV_Fraction=0.0625*16=1,因此USART_BRR=0x271。 接下来,编写初始化步骤:使能时钟,配置GPIO,配置USART参数,使能USART,可能还需要使能接收中断,如果用户在主函数中使用了查询方式接收数据,可能不需要中断,但根据用户之前的代码,主循环中是通过USART_ReceiveData函数来检测接收,所以可能需要使能接收器,并可能开启接收中断,但原代码中没有中断服务函数,所以可能用户使用轮询方式。不过为了正确接收,可能需要使能接收中断,或者确保接收使能。 另外,用户可能需要发送数据,所以需要确保发送器使能。同时,可能需要包含必要的库文件,比如stm32f10x_usart.h等,但用户可能已经熟悉这些,所以代码中需要包含正确的头文件。 还需要考虑可能的错误,例如时钟配置是否正确,如果用户的系统时钟不是72MHz,波特率的计算会不同,但STM32C8T6通常使用8MHz外部晶振,通过PLL倍频到72MHz,所以假设系统时钟正确配置的情况下,USARTDIV的值是正确的。如果用户没有正确配置系统时钟,可能需要调整,但这个问题可能超出当前问题的范围,用户可能需要自行处理时钟配置,或者在此函数中假设时钟已经正确配置。 总结,我需要提供一个USART1的初始化函数,包括GPIO配置,USART参数配置,使能USART,并且确保能够发送和接收数据。同时,可能需要处理中断,但根据用户之前的代码,主循环中使用的是查询方式接收,所以可能不需要中断配置。不过,原用户代码中的USART_ReceiveData函数可能需要接收器使能,并且正确读取接收寄存器。 可能的遗漏点:在初始化函数中是否使能了USART的接收和发送,是否配置了正确的模式,以及是否启用了USART外设本身。需要检查这些步骤是否都包含在初始化函数中。 现在,将这些思考转化为具体的代码步骤,确保每一步都正确无误,并且符合STM32F1的标准外设库的配置方法。</think>--- ### **五、补充串口初始化函数(USART1)** 以下为完整的USART1初始化代码,支持115200波特率通信: ```c // USART1初始化函数(TX:PA9, RX:PA10) void USART1_Init(uint32_t baudrate) { GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; // 1. 使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 2. 配置GPIO // TX(PA9) 复用推挽输出 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); // RX(PA10) 浮空输入 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStruct); // 3. 配置USART参数 USART_InitStruct.USART_BaudRate = baudrate; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART1, &USART_InitStruct); // 4. 使能USART USART_Cmd(USART1, ENABLE); } // 补充发送函数(供参考) void USART_SendByte(USART_TypeDef* USARTx, uint8_t data) { USART_SendData(USARTx, data); while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); } ``` --- ### **关键配置说明** 1. **时钟配置**: - 必须同时使能USART1和GPIOA的时钟 - 计算公式(72MHz系统时钟时): $$ \text{USARTDIV} = \frac{72\text{MHz}}{16 \times 115200} \approx 39.0625 $$ 2. **GPIO模式**: - TX引脚必须配置为**复用推挽输出**(`GPIO_Mode_AF_PP`) - RX引脚建议使用浮空输入(`GPIO_Mode_IN_FLOATING`) 3. **典型问题排查**: - 若无法通信,检查PA9/PA10是否被复用功能占用 - 用示波器测量TX引脚是否有波形输出 - 确认系统时钟配置正确(默认使用内部8MHz时钟时需重新计算波特率) --- ### **测试验证** 在`main`函数初始化后,可发送测试数据: ```c // 发送测试字符串 USART_SendByte(USART1, 'S'); USART_SendByte(USART1, 'T'); USART_SendByte(USART1, 'M'); USART_SendByte(USART1, '3'); USART_SendByte(USART1, '2'); ``` 串口助手应正确接收`STM32`字符序列,验证串口通信正常后再进行SPI测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值