打印

求教各位老大一个关于USART的问题

[复制链接]
3498|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lphaff|  楼主 | 2010-11-13 10:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
在调试STM32F103的USART的时候,
USART1初始化后在一个while(1)里面循环发数据正常
用USART1的初始化配置改成USART2后,包括时钟、引脚等配置都改成USART2
然后在while(1)循环里面发数据,用串口接收的时候只能接收到一次,而且接收完一次数据后最后一个是乱码。

不知何故,请高手指教
沙发
dbayj| | 2010-11-13 12:32 | 只看该作者

这个改了吗

使用特权

评论回复
板凳
dbayj| | 2010-11-13 12:38 | 只看该作者
定义的哪两个引脚?不是配置到需要重映射的引脚上了吧?
再就是上面说的时钟使能配置。
别的我也不知道了。
也刚开始学。

使用特权

评论回复
地板
lphaff|  楼主 | 2010-11-13 13:55 | 只看该作者
谢谢楼上的新手兄弟:)

USART2 在没有被 REmap 之前:
USART2_TX——>PA2——>CORE_PIN25
USART2_RX——>PA3——>CORE_PIN26
USART2_CTS——>PA0——>CORE_PIN23
USART2_RTS——>PA1——>CORE_PIN24
USART2_CK——>PA4——>CORE_PIN29

不是你说的那个GPIOC。
USART1在APB1总线上,而USART2在APB2总线上
USART1只有TX和RX两个引脚
但是USART2除了TX和RX,还有CTS和RTS和CK

使用特权

评论回复
5
lphaff|  楼主 | 2010-11-13 13:55 | 只看该作者
我的硬件是直接连到PA2和PA3,没有用其他的pin引脚。
没有REMAP。

使用特权

评论回复
6
dbayj| | 2010-11-13 14:25 | 只看该作者
本帖最后由 dbayj 于 2010-11-13 14:34 编辑

“USART1在APB1总线上,而USART2在APB2总线上”
这个应该看看手册

至于重映射的问题我只是问问,因为我不知道你怎么连的。毕竟还是有这种可能的。

澄清下GPIOC的问题,我只是从一个文档里截的图,不是我自己标注的,
那图只是想说明USART1和USART2时钟。

使用特权

评论回复
7
dbayj| | 2010-11-13 14:28 | 只看该作者
本帖最后由 dbayj 于 2010-11-13 14:33 编辑



不知道我的资料有没有错误

使用特权

评论回复
8
dbayj| | 2010-11-13 14:37 | 只看该作者
我刚学没几天,细节不太明白,还得仔细看手册

使用特权

评论回复
9
lphaff|  楼主 | 2010-11-13 14:50 | 只看该作者
嗯。。谢谢你。

使用特权

评论回复
10
dbayj| | 2010-11-13 15:09 | 只看该作者
不客气,我也不会太多
遇上自己知道的就回复一个
还得努力学习

使用特权

评论回复
11
香水城| | 2010-11-13 18:12 | 只看该作者
楼主你怎么知道配置是否正确?

使用特权

评论回复
12
lphaff|  楼主 | 2010-11-14 15:06 | 只看该作者
11# 香水城


老大,您的建议很犀利。。
以下是我的初始化,您能顺便帮我指出一下我的配置哪里有问题吗?
谢谢版主。


void USART2_SETUP()
{
GPIO_InitTypeDef GPIO_InitStructure;   //声明一个GPIO初始化的结构变量 GPIO_InitTypeDef
USART_InitTypeDef USART_InitStructure;  //声明一个USART初始化的结构变量 USART_InitStructure
USART_ClockInitTypeDef USART_ClockInitStruct;//声明一个USARTx时钟初始化的结构变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //屏蔽RCC_APB2Periph_AFIO
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 , ENABLE);
//使能使用到的功能模块的时钟
   //一,以下用来配置USART2的AFIO引脚
   //1,配置USART_TX引脚为AF_PP模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;    //选择PA2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
   //2,配置USART_RX引脚为AF_OD模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;    //选择PA3
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
   //二,以下用来配置USART2的相关初始化
    USART_InitStructure.USART_BaudRate = 115200;
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_Tx | USART_Mode_Rx;
USART_Init(USART2, &USART_InitStructure);
   //三,以下用来配置USART2的时钟初始化
    USART_ClockInitStruct.USART_Clock   = USART_Clock_Disable   ;
USART_ClockInitStruct.USART_CPOL   = USART_CPOL_Low        ;
USART_ClockInitStruct.USART_CPHA   = USART_CPHA_1Edge     ;
USART_ClockInitStruct.USART_LastBit   = USART_LastBit_Disable    ;
USART_ClockInit(USART2, &USART_ClockInitStruct);
USART_Cmd(USART2, ENABLE);//使能USART2外设
}

使用特权

评论回复
13
lphaff|  楼主 | 2010-11-16 13:03 | 只看该作者
顶到让你看见。。

使用特权

评论回复
14
hjiongh| | 2010-11-16 17:27 | 只看该作者
没有看到你的USART_ITConfig ,你如何进入接收中断?

其实只要遵循以下几步,就不会有问题:
1. Enable RCC_APB1PeriphClockCmd
2. TX 设为 GPIO_Mode_AF_PP GPIO_Speed_50MHz
    RX 设为 GPIO_Mode_IN_FLOATING, GPIO_Speed_50MHz
3. NVIC_Init 中断向量设置
4.  USART_Init
5. USART_ITConfig
6. USART_Cmd (enable)
只要你没有遗漏,USART就能正常工作。 剩下的就是具体看你的需求配置了,包括波特率等等。

使用特权

评论回复
15
lphaff|  楼主 | 2010-11-17 12:39 | 只看该作者
to 14楼:
谢谢兄弟的关注。

我只是用USART2来发送数据
没有用来接收数据。

我的初始化流程基本包括了你所说的流程。

昨晚得高人指点,准备去查一下USART2的错误寄存器
可能原因是USART2的错误寄存器有些标志位置位了没有处理。

使用特权

评论回复
16
lphaff|  楼主 | 2010-11-19 12:56 | 只看该作者
因为后面人为的造成了硬件问题,所以这个问题最后不了了之了。
对这个程序有兴趣的朋友可以联系我,我把源代码发给你试一下。

个人觉得这个程序代码是没有问题的。

谢谢楼上各位热心的兄弟。
谢谢版主你犀利的建议。

使用特权

评论回复
17
hjiongh| | 2010-11-25 11:01 | 只看该作者
如果你设置了ORE这些,必须在中断中处理掉出错。否则usart当然会有问题了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

540

帖子

2

粉丝