USART 调试

有几个USART ;现在说明是串口1
串口1是的TX和RX引脚是PA9、PA10,他们是复用,通过下面的引脚配置,设置 GPIO alternate function low register (GPIOx_AFRL) 的 0111: AF7:表示该引脚用着USART1
/* 连接 PXx 到 USARTx_Tx*/
GPIO_PinAFConfig(DEBUG_USART_RX_GPIO_PORT,DEBUG_USART_RX_SOURCE,DEBUG_USART_RX_AF);

/* 连接 PXx 到 USARTx__Rx*/
GPIO_PinAFConfig(DEBUG_USART_TX_GPIO_PORT,DEBUG_USART_TX_SOURCE,DEBUG_USART_TX_AF);
在这里插入图片描述
波特率设置,通过设置USART->CR1的OVER8,选择多久采一位,当OVER8的值控制如下行为
When OVER8=0, the fractional part is coded on 4 bits and programmed by the
DIV_fraction[3:0] bits in the USART_BRR register
• When OVER8=1, the fractional part is coded on 3 bits and programmed by the
DIV_fraction[2:0] bits in the USART_BRR register, and bit DIV_fraction[3] must be kept
cleared
设置波特率的公式,然后算出USARTDIV写入USART->BRR寄存器,
在这里插入图片描述
在这里插入图片描述
设置波特率的几个特性,0是起始位,数据位,校验位,停止位。一般为8N1

代码产生如下

static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

/* 嵌套向量中断控制器组选择 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

/* 配置USART为中断源 /
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
/
抢断优先级为1 /
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
/
子优先级为1 /
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
/
使能中断 /
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
/
初始化配置NVIC */
NVIC_Init(&NVIC_InitStructure);
}

void Debug_USART_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;

RCC_AHB1PeriphClockCmd(DEBUG_USART_RX_GPIO_CLK|DEBUG_USART_TX_GPIO_CLK,ENABLE);

/* 使能 USART 时钟 */
RCC_APB2PeriphClockCmd(DEBUG_USART_CLK, ENABLE);

/* GPIO初始化 */
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

/* 配置Tx引脚为复用功能 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_PIN ;
GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

/* 配置Rx引脚为复用功能 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_PIN;
GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);

/* 连接 PXx 到 USARTx_Tx*/
GPIO_PinAFConfig(DEBUG_USART_RX_GPIO_PORT,DEBUG_USART_RX_SOURCE,DEBUG_USART_RX_AF);
/* 连接 PXx 到 USARTx__Rx*/
GPIO_PinAFConfig(DEBUG_USART_TX_GPIO_PORT,DEBUG_USART_TX_SOURCE,DEBUG_USART_TX_AF);//(GPIOx_AFRL) 的 0111: AF7

/* 配置串DEBUG_USART 模式 /
/
波特率设置:DEBUG_USART_BAUDRATE /
USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
/
字长(数据位+校验位):8 /
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
/
停止位:1个停止位 /
USART_InitStructure.USART_StopBits = USART_StopBits_1;
/
校验位选择:不使用校验 /
USART_InitStructure.USART_Parity = USART_Parity_No;
/
硬件流控制:不使用硬件流 /
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
/
USART模式控制:同时使能接收和发送 /
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
/
完成USART初始化配置 */
USART_Init(DEBUG_USART, &USART_InitStructure);

/* 嵌套向量中断控制器NVIC配置 */
NVIC_Configuration();

/* 使能串口接收中断 */
USART_ITConfig(DEBUG_USART, USART_IT_RXNE, ENABLE);
USART_ITConfig ( DEBUG_USART, USART_IT_IDLE, ENABLE ); //使能串口总线空闲中断 	

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

//中断接收数据
void USART1_IRQHandler(void)
{
uint8_t ucTemp;
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//获取 UART状态寄存器USART_IT_RXNE 的位,有数据来硬件置位
{
ucTemp=USART_ReceiveData(USART1);
USART_SendData(USART1,ucTemp);
}
}

重定向后可使用printf函数

//重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE f)
{
/
发送一个字节数据到串口 */
USART_SendData(DEBUG_USART, (uint8_t) ch);

	/* 等待发送完毕 */
	while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TXE) == RESET);		

	return (ch);

}

//重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE f)
{
/
等待串口输入数据 */
while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_RXNE) == RESET);

	return (int)USART_ReceiveData(DEBUG_USART);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值