11981|4

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM32,UART收不到数据 [复制链接]

情况是这样:
UART 的数据发送已经可以,在 PC 上能看到发送过来的数据。
但是,从 PC 向 STM32 发数据,怎么也不对。
我用 JLINK 可以看到,STM32 的 USART_DR 寄存器实际上已经收到了从 PC 过来的数据(我发不同数据的时候,这个寄存器有变化。)
可是 USART_SR 的 RXNE 总是不 SET,弄得我查询都不行,更甭说中断了。

以下是 UART 的设定代码,前辈帮我看看好吗?


/* Enable GPIO clock */
// 首先,要打开 UART 所在的 GPIO 口的 CLK.
// USART1,2 的管脚只在 RCC_APB2Periph_GPIOA
// USART3 使用 GPIOB, GPIOD
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

// 打开 RCC 中 UART1 模块的时钟
// 注意,在 RCC 看来 UART 和 GPIO 是不同的模块,但是 UART 要借用 GPIO 的管脚,
// 所以需要在打开 GPIO 的时钟之后,还要打开 UART 的时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
// 打开 RCC 中 UART2,UART3 模块的时钟,这两个的时钟控制在 APB1
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

// 设定 UART1, PA.9, PA.10
// 设定 GPIO 控制器将 UART TX 脚设为 特别功能推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

// 设定 UART RX 脚为 floating 输入。
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

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_Rx | USART_Mode_Tx;

// USART configuration
USART_Init(USART1, &USART_InitStructure);

USART_Cmd(USART1, ENABLE);
此帖出自stm32/stm8论坛

最新回复

                                 谢谢您指出的错误!! 这样确实截住了! 太感谢了,帮了我大忙了!!  详情 回复 发表于 2011-2-26 22:15
点赞 关注
 

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 你用的是中断接收吗?好像没有看到你的串口中断设置和打开串口中断的命令
此帖出自stm32/stm8论坛
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
谢谢您的回复。
我一开始是打算用中断的,可是根本进不了中断。
为了简单,我就把初始化部分的中断设置都去掉了。
现在,主程序是用的查询方式:
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
        uint8_t tempch;
        tempch = USART_ReceiveData(USART1);
        LEDSet(1, TRUE);
}
我在 if 里面设了断点,根本进不去。(if 的条件总是不成立)
我在 IAR 里面强制断下来,用调试工具带的寄存器查询,可以看到 USART_DR 已经有数据了。
比如,我从串口发个 0,就能看到 0x30 在 USART_DR 里面。
但是 USART_SR 的 RXNE 一直是 0。
而程序应该是检测到 RXNE=1 才能判断读到数据了。
我就不理解,是哪里弄得不对,以至于 USART 事实上把数据收到 USART_DR 里面了却不给 RXNE 置1。

多谢多谢!!
此帖出自stm32/stm8论坛
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)是判接收中断是否发生,你关了中断就看不到了,你改为if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)!==RESET)试一试。
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
谢谢您指出的错误!!
这样确实截住了!
太感谢了,帮了我大忙了!!
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表