添色增香 2021-05-12 16:07 采纳率: 0%
浏览 384

stm32f030 usart2 发送不出去


#include "main.h"
#include "stm32f0xx.h"


int main(void)
{
	uint16_t i=0;
	
	//定义串口结构体
	USART_InitTypeDef USART_InitStructure;
	//定义IO口结构体
	GPIO_InitTypeDef GPIO_InitStructure;
	
	NVIC_InitTypeDef NVIC_InitStructure;

	
	//初始化系统时钟
	RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);

	//使能端口时钟
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
	
	//配置PA2,PA3的串口复用功能Alternate functions 
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);    
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);
		  	
	GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_AF;         //端口复用模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;	      //推挽方式输出
	GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;	    //悬空
	GPIO_Init(GPIOA, &GPIO_InitStructure);	

	//使能串口时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

	//设置串口硬件参数	
	USART_DeInit(USART2);
	USART_InitStructure.USART_BaudRate = 4800;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No ;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_Init(USART2, &USART_InitStructure);
	
	/* Enable the USART1 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);


	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);	/* 使能接收中断 */
  
	/* 
		USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
		注意: 不要在此处打开发送中断
		发送中断使能在SendUart()函数打开
	*/

	USART_Cmd(USART2, ENABLE);		/* 使能串口 */ 

	/* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去
		如下语句解决第1个字节无法正确发送出去的问题 */
	USART_ClearFlag(USART2, USART_FLAG_TC);     /* 清发送完成标志,Transmission Complete flag */
	
	
	Delay_ms(10);
	
	Usart_SendByte(USART2, 0x99);	
	
	while (1)
  {
		i=i+1;
		Usart_SendByte(USART2, i);	
		Delay_ms(1000);
  }
}

void USART2_IRQHandler(void)
{
	/* 1个字节接收完毕的中断 */
	if (USART_GetITStatus(USART2,USART_IT_RXNE) != RESET)//RX
	{ 				
  	Usart_SendByte(USART2, 0x66);	
	}
	/* 1个字节发送完毕的中断 */
	if (USART_GetITStatus(USART2, USART_IT_TC) != RESET)//TX
	{
		
	}
}


void Usart_SendByte(USART_TypeDef* USARTx,uint16_t data)
{
	USART_SendData(USARTx,data);Delay_ms(5);
	while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET);
	while(USART_GetFlagStatus(USARTx,USART_FLAG_TC) == RESET);
}

void Delay_ms(uint16_t data)
{
  uint16_t i;

	for(i=0;i<data;i++)	
	{
		Delay_us(100);
		IWDG_ReloadCounter();
	}
}

void Delay_us(uint16_t data)
{
	uint16_t i,x;

	for(i=0;i<data;i++)
	{
		for(x=0;x<3;x++)
		{
			;
		}	
	}
}
  • 写回答

1条回答 默认 最新

  • xiongxiangsheng 2021-08-10 09:41
    关注

    如果芯片为 STM32F030F4、K6、C6,则内部只有一个USART1。
    即便其它芯片,使用 USART2 时需要将一下语句改为:
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_2);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_2);

    评论

报告相同问题?

悬赏问题

  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。
  • ¥20 在easyX库下编写C语言扑克游戏跑的快,能实现简单的人机对战