打印

STM32, UART 收不到数据

[复制链接]
3454|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sujingmeng|  楼主 | 2011-2-26 09:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
情况是这样:
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);
沙发
daliny| | 2011-2-26 10:12 | 只看该作者
你用的是中断接收吗?好像没有看到你的串口中断设置和打开串口中断的命令

使用特权

评论回复
板凳
sujingmeng|  楼主 | 2011-2-26 13:02 | 只看该作者
谢谢您的回复。
我一开始是打算用中断的,可是根本进不了中断。
为了简单,我就把初始化部分的中断设置都去掉了。
现在,主程序是用的查询方式:
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。

多谢多谢!!

使用特权

评论回复
地板
daliny| | 2011-2-26 18:00 | 只看该作者
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)是判接收中断是否发生,你关了中断就看不到了,你改为if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)!==RESET)试一试。

使用特权

评论回复
5
sujingmeng|  楼主 | 2011-2-26 22:15 | 只看该作者
谢谢您指出的错误!!
这样确实截住了!
太感谢了,帮了我大忙了!!

使用特权

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

本版积分规则

1

主题

3

帖子

1

粉丝