基本把论坛里有关串口的帖子都看了一遍,也修改了自己的代码,可是使用串口调试助手时,无法打印数据 也无法接受数据,下面是我的代码,求大神看看呀指教一下,我用的是STM32F407. 有点着急呀
usart2.h函数
#ifndef __USART2_H
#define __USART2_H
#include "stdio.h"
#include "stdarg.h"
#include "string.h"
#include "main.h"
#define USART2_RXBUFF_SIZE 1024 //定义接收缓冲区大小1024字节
#define USART2_TXBUFF_SIZE 1024 //定义接收缓冲区大小1024字节
extern u8 USART2_RX_BUF[USART2_RXBUFF_SIZE]; //接收缓冲数组
extern u16 USART2_RX_STA; //接收状态标记
extern u8 USART2_TX_BUF[USART2_TXBUFF_SIZE]; //发送缓冲数组
void Usart2_init(u32 bound); //串口2初始化函数
void u2_printf(char* fmt,...) ; //串口2printf函数
#endif
usart.c函数
#include "main.h"
#include "usart2.h"
u8 USART2_RX_BUF[USART2_RXBUFF_SIZE]; //接收缓冲数组
u16 USART2_RX_STA=0; //接收状态标记
/*-------------------------------------------------*/
/*函数名:初始化串口2 */
/*参 数:bound:波特率 */
/*返回值:无 */
/*-------------------------------------------------*/
void Usart2_init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE); //使能GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟
GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_USART2); //PA2复用为USART2
GPIO_PinAFConfig(GPIOD,GPIO_PinSource6,GPIO_AF_USART2); //PA3复用为USART2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOD,&GPIO_InitStructure); //按配置设置
USART_InitStructure.USART_BaudRate = bound; //波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式
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); //按配置设置串口2
USART_Cmd(USART2, ENABLE); //使能串口 2
USART_ClearFlag(USART2, USART_FLAG_TC); //清除标志位
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //开启接受中断
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //串口2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3; //抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //中断通道使能
NVIC_Init(&NVIC_InitStructure); //根据配置设置
}
__align(8) u8 USART2_TX_BUF[USART2_TXBUFF_SIZE]; //串口2发送区
/*-------------------------------------------------*/
/*函数名:串口2printf */
/*参 数:无 */
/*返回值:无
*/
/*-------------------------------------------------*/
void u2_printf(char* fmt,...)
{
u16 i,length;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART2_TX_BUF,fmt,ap);
va_end(ap);
length=strlen((const char*)USART2_TX_BUF);
while((USART2->SR&0X40)==0);
for(i = 0;i < length;i ++)
{
USART2->DR = USART2_TX_BUF[i];
while((USART2->SR&0X40)==0);
}
}
主函数如下
#include "main.h"
#include "delay.h"
#include "usart2.h"
int main(void)
{
u16 len;
u8 time;
delay_init(); //延时初始化
Usart2_init(9600); //串口1初始化波特率为115200
while(1)
{
if(time>=50) //time>=50表示500ms时间到
{
time=0; //清除计数位
u2_printf("请您发送数据,以回车结尾
"); //500ms时间到,发送提示信息
}
if(USART2_RX_STA&0x8000) //USART1_RX_STA位15置位,表示接收完成
{
len=USART2_RX_STA&0x3fff; //得到此次接收到的数据长度
USART2_RX_BUF[len]=' ' ; //加入结束符
u2_printf("你发送的数据:%s
",USART2_RX_BUF); //返回接收到的数据
USART2_RX_STA=0; //清除状态位
}
time++; //计数+1
delay_ms(10); //延时10ms
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
一周热门 更多>