其他分享
首页 > 其他分享> > 串口通讯时,为什么需要同时打开串口时钟和GPIO时钟

串口通讯时,为什么需要同时打开串口时钟和GPIO时钟

作者:互联网

1. 项目:野火stm32f10指南者开发板,使用USART实现数据的发送和接收。

2. 代码

#include "stm32f10x.h"
#include "bsp_usart.h"

int main(void)
{		
	USART_Config();
	//发送一个字符
	Usart_SendByte(DEBUG_USARTx,'A');
	while(1)
	{

	}

}

  

#include "bsp_usart.h"

static void NVIC_Config(void)
{
	NVIC_InitTypeDef	NVIC_InitStruct;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);					/*配置NVIC为优先级组2*/
	NVIC_InitStruct.NVIC_IRQChannel= DEBUG_USART_IRQ;				/*配置USART中断源*/
	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;							/*使能中断通道*/
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;		/*配置抢占优先级:1*/
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;						/*配置子优先级:1*/
	
	NVIC_Init(&NVIC_InitStruct);	/*初始化配置NVIC*/
}

void USART_Config(void)
{
	GPIO_InitTypeDef		GPIO_InitStruct;
	USART_InitTypeDef		USART_InitStruct;
	
	//打开串口GPIO时钟
	DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
	//打开串口外设时钟
	DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
	
	//将USART Tx的GPIO配置为推挽复用模式
	GPIO_InitStruct.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(DEBUG_USART_TX_GPIO_PORT,&GPIO_InitStruct);
	
	//将USART Rx的GPIO配置为浮空输入模式
	GPIO_InitStruct.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(DEBUG_USART_RX_GPIO_PORT,&GPIO_InitStruct);
	
	//配置串口的工作参数
	//配置波特率
	USART_InitStruct.USART_BaudRate = DEBUG_USART_BAUNDRATE;
	//配置针数据字长
	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_Rx | USART_Mode_Tx;
	//完成串口的初始化配置
	USART_Init(DEBUG_USARTx, &USART_InitStruct);
	
	//串口中断优先级配置
	NVIC_Config();
	//使能串口接收中断
	USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);
	//使能串口
	USART_Cmd(DEBUG_USARTx,ENABLE);
	
}

//发送字节函数
void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data)
{
	USART_SendData(pUSARTx, data);
	while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
	
}

 

 

#ifndef __bsp_usart_h
#define __bsp_usart_h

#include "stm32f10x.h"
//串口USART宏定义
#define DEBUG_USARTx								USART1
#define DEBUG_USART_CLK							RCC_APB2Periph_USART1
#define DEBUG_USART_APBxClkCmd			RCC_APB2PeriphClockCmd
#define DEBUG_USART_BAUNDRATE				115200

//USART GPIO宏定义
#define DEBUG_USART_GPIO_CLK				(RCC_APB2Periph_GPIOA)
#define DEBUG_USART_GPIO_APBxClkCmd		RCC_APB2PeriphClockCmd
#define DEBUG_USART_TX_GPIO_PORT			GPIOA
#define DEBUG_USART_TX_GPIO_PIN				GPIO_Pin_9
#define DEBUG_USART_RX_GPIO_PORT			GPIOA
#define DEBUG_USART_RX_GPIO_PIN				GPIO_Pin_10

#define DEBUG_USART_IRQ								USART1_IRQn
#define DEBUG_USART_IRQHandler				USART1_IRQHandler


void USART_Config(void);
void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data);

#endif /*bsp_usart_h*/

 

 

 Keil5编程总览:

 

 

3. 执行结果:

    打开串口调试助手,配置好串口、波特率等参数。按下开发板上的复位键,接收区域显示A 

             

 

 

4. 参考资料

5. 总结

 

6. 常见的几种通讯协议的参数

转自:

(71条消息) 通信方式梳理:GPIO,I2C,SPI,UART,USART,USB的区别_步印的博客-CSDN博客_gpio i2c spi uart

 

 

 

 

标签:USART,void,InitStruct,串口,DEBUG,GPIO,时钟
来源: https://www.cnblogs.com/kevin-hou1991/p/15924437.html