STM32F030 USART2配置函数 波特率不对导致无法进入中断

今天调试STM32F030 USART2,收发不了数据,仿真的时候进入不了中断,但是配置也是正确的。搞了很久,原因是先初始化的串口再初始化Flash数据,导致读入的波特率是0,进而无法正常使用USART2,浪费了大量的时间,血的教训呀。


void UartIntial(void){
	int i;
	GPIO_InitTypeDef   GPIO_uInitStructure;
	USART_InitTypeDef  USART_uInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure; 

	
	for(i=0; i<MAX_UART_PORT_NUM; i++){
		memset((unsigned char*)&uart[i], 0x00, sizeof(struct UartApiBuf));
		uart[i].Snd.IsSndIng = FALSE;
		uart[i].Snd.IsRcvIng = FALSE;
		uart[i].Snd.lpChar = 0;
		uart[i].Snd.lpIdle = 0;
		
		uart[i].Rcv.IsSndIng = FALSE;
		uart[i].Rcv.IsRcvIng = FALSE;
		uart[i].Rcv.lpChar = 0;
		uart[i].Rcv.lpIdle = 0;
	}

	

	// USART2_EN -> PA0 
	// USART2_TX -> PA2 
  // USART2_RX -> PA3
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
	
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);
	
	GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_uInitStructure.GPIO_OType = GPIO_OType_PP;  
	GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_50MHz;  // 50M
	GPIO_Init(GPIOA,&GPIO_uInitStructure);

	GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_uInitStructure.GPIO_OType = GPIO_OType_PP;  
	GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_50MHz;  // 50M
	GPIO_Init(GPIOA,&GPIO_uInitStructure);
	GPIO_ResetBits(GPIOA, GPIO_Pin_0);
	
	
	NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;	
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);	
	
	
	USART_uInitStructure.USART_BaudRate = s.Baud;
	USART_uInitStructure.USART_Parity = USART_Parity_No;
	USART_uInitStructure.USART_StopBits = USART_StopBits_1;
	USART_uInitStructure.USART_WordLength = USART_WordLength_8b;
	USART_uInitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_uInitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_Init(USART2,&USART_uInitStructure);
	
	USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
	
  USART_Cmd(USART2,ENABLE);
}


STM32F030是一款32位的单片机芯片,具有丰富的外设资源和强大的计算能力。其中USART1是该芯片上的一个串行通信外设,可用于数据的发送和接收。 要使用USART1进行发送数据,首先需要进行初始化设置。可以通过寄存器配置的方式来实现。具体步骤如下: 1. 配置USART1的时钟源,可以选择主时钟、内部时钟或外部时钟。 2. 配置USART1的波特率,可以通过寄存器设置预分频系数和分频系数来实现。 3. 配置USART1的数据位、停止位、奇偶校验位等参数,可以通过寄存器设置相应的控制位来实现。 4. 配置USART1的工作模式,可以选择单工或双工模式,通过设置控制寄存器的相关位来实现。 5. 编写发送函数,通过调用相关API函数,将要发送的数据写入USART1的数据寄存器中。 6. 在主函数或其他需要发送数据的地方,调用发送函数进行数据的发送。 以下是一个示例代码: ``` #include "stm32f0xx.h" void USART1_Init(void) { // 配置USART1的时钟源 RCC->APB2ENR |= RCC_APB2ENR_USART1EN; // 配置USART1的波特率、数据位、停止位、奇偶校验位等参数 USART1->BRR = 0x271; // 波特率为115200 USART1->CR1 = USART_CR1_TE; // 使能发送 // 配置USART1的工作模式为单工模式 USART1->CR3 &= ~USART_CR3_HDSEL; // 使能USART1 USART1->CR1 |= USART_CR1_UE; } void USART1_SendData(uint8_t data) { while (!(USART1->ISR & USART_ISR_TXE)); // 等待发送寄存器为空 USART1->TDR = data; // 将要发送的数据写入发送寄存器 } int main(void) { // 初始化USART1 USART1_Init(); // 发送数据 USART1_SendData('H'); USART1_SendData('e'); USART1_SendData('l'); USART1_SendData('l'); USART1_SendData('o'); while (1) { // 其他业务处理 } } ``` 在上述示例代码中,我们通过USART1_Init()函数进行了USART1的初始化设置,然后通过调用USART1_SendData()函数来逐个发送数据,最后在主函数中添加了一个无限循环,用于其他业务的处理。 以上是关于STM32F030使用USART1进行发送的简要介绍,希望对您有所帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄大刀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值