叠甲
        大家理性讨论 我要是作为一个初学者分享自己的学习思路 如果有说错的地方欢迎大家和我说

这个学习心得是基于b站一up的视频学习过程中一些问题得来的 我会将视频链接放在下面 大家可以去看完视频 如果有不懂的朋友再回来看我这个文章或许会解答你学习中的疑惑

大卫-史密斯的个人空间-大卫-史密斯个人主页-哔哩哔哩视频 (bilibili.com)
 

今天第4天 我们学习串口的配置 

在stm32中呢 配置串口还是比较简单的 因为他有这个串口这个硬件 只需要你找一个想要使用的引脚看他是否连接有串口这个外设就可以 串口在我们整个学习中还是非常重要的 他担任了一个调试的作用 调试呢你可以与调试工具,串口,oled显示屏等 但是通过串口调试的是比较方便的

现在就来看看配置串口需要哪些东西:

1配置串口对应引脚  所以要配置gpio为复用

2既然是串口肯定哟啊收东西吧 所以当收到东西时候肯定要产生一个中断 所以我们要配置一个中断

3串口的一些基础配置

这样我们就完成了串口的配置

串口配置:

void USART1_IRQHandler(void)
{
	uint16_t d;
	if(USART_GetITStatus(USART1 , USART_IT_RXNE) == SET)
	{
		d = USART_ReceiveData(USART1);

		USART_ClearITPendingBit(USART1,USART_IT_RXNE);
	}
}



void usart_init(uint32_t baud)
{
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA , ENABLE);								//使能端口给他通电
	//配置gpio引脚模式
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9	| GPIO_Pin_10;									//第9和第10根引脚
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;												//配置为复用功能 该引脚交给其他硬件管理
	GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;											//配置为推挽输出
	GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;											//配置无上拉无下拉
	GPIO_InitStruct.GPIO_Speed=GPIO_High_Speed;											//配置引脚速度
	GPIO_Init(GPIOA,&GPIO_InitStruct);													//初始化gpio引脚	
 	
	GPIO_PinAFConfig(GPIOA , GPIO_PinSource9 , GPIO_AF_USART1);							//将 gpio9引脚与定时器相连
	GPIO_PinAFConfig(GPIOA , GPIO_PinSource10 , GPIO_AF_USART1);						//将 gpio9引脚与定时器相连
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);								//使能串口1的时钟
	//配置USART1引脚模式
	USART_InitStruct.USART_BaudRate = baud;												//配置波特率
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;							//数据位问8位
	USART_InitStruct.USART_StopBits = USART_StopBits_1;									//停止位为1位
	USART_InitStruct.USART_Parity = USART_Parity_No;									//没有校验位
	USART_InitStruct.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;							//配置为可接可发
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;		//这个参数可以配置硬件流控制 我们这里没有就配置为无硬件流控制
	USART_Init(USART1, &USART_InitStruct);												//初始化usat1
	
	USART_ITConfig(USART1 ,USART_IT_RXNE , ENABLE);										//配置为接收到信息就产生一个中断,
	
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0x03;								//抢占优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=0x03;									//响应优先级
	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;											//使能
	NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn ;										//打开time2中断的请求通道	
	NVIC_Init(&NVIC_InitStruct);														//初始化外部中断通道
	
	USART_Cmd(USART1 , ENABLE);															//使能串口1
	
}

这里呢我们可以配置一个printf重映射 看着方便一点 这样你就可以在stm32中使用printf了

//------------------------------------这一块直接复制粘贴----------------------------
struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;

int fputc(int ch, FILE *f) //------------------------fputc里面内容按需要定 我现在需要给useart1发送内容所以才是这两行代码
{
	USART_SendData(USART1 , ch);
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
	return ch;
}
//--------------------------------------------------------------------------------------