打印
[STM32F3]

求助!为什么串口接收程序不好使???应该怎样修改

[复制链接]
2430|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
646582045|  楼主 | 2015-5-26 17:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include"stm32f10x_map.h"
int main()
{
RCC->APB2ENR|=1<<14;
RCC->APB2ENR|=1<<2;
RCC->APB2ENR|=1<<5;
GPIOA->CRH&=0xfffff00f;
GPIOA->CRH|=0x000004b0;
USART1->BRR=0x0045;
USART1->CR1|=1<<2;
USART1->CR1|=1<<3;
USART1->CR1|=1<<13;
if(USART1->SR&1<<5)
return USART1->DR;
}
  
沙发
luofeng2g| | 2015-5-26 17:51 | 只看该作者
表示没看懂你在干嘛,你这把main作为函数,你要在哪里读接收数据呢?

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
646582045 + 1 赞一个!
板凳
646582045|  楼主 | 2015-5-26 18:40 | 只看该作者
luofeng2g 发表于 2015-5-26 17:51
表示没看懂你在干嘛,你这把main作为函数,你要在哪里读接收数据呢?

我是初学者,也有点迷糊,能不能帮我修改一下呢?我就是想用串口调试助手给单片机发送一个数据,然后返回我发送的数据

使用特权

评论回复
地板
airwill| | 2015-5-26 18:44 | 只看该作者
你这样肯定收不到数据.

USART1->CR1|=1<<2;
USART1->CR1|=1<<3;
USART1->CR1|=1<<13;
if(USART1->SR&1<<5)
return USART1->DR;

串口是异步的, 初始化后需要等待好久才可能收到数据, 直接判断当然收不到数据.
另外, 你的代码连主循环都没有, 建议楼主先拿例程参考了开始玩吧

使用特权

评论回复
5
646582045|  楼主 | 2015-5-26 18:53 | 只看该作者
airwill 发表于 2015-5-26 18:44
你这样肯定收不到数据.

USART1->CR1|=1

#include"stm32f10x_map.h"
char Usart1_Rxd()
{if(USART1->SR&1<<5)
  return USART1->DR;
  else
  return 0;
  }

int main()
{
RCC->APB2ENR|=1<<14;
RCC->APB2ENR|=1<<2;
GPIOA->CRH&=0xfffff00f;
GPIOA->CRH|=0x000004b0;
USART1->BRR=0x0045;
USART1->CR1|=1<<2;
USART1->CR1|=1<<3;
USART1->CR1|=1<<13;
while(1)
{
if(USART1->SR&1<<5)
return USART1->DR;
}
}
这样呢?我是初学者,不太明白,例程很多都是操作库函数啊,没找到操作寄存器的

使用特权

评论回复
6
airwill| | 2015-5-26 18:58 | 只看该作者
首先: 操作库函数是简捷快速的控制方式,希望先适应它, 熟练后再考虑操作寄存器的方式.

main() 里面一般不直接 return 有意义的值, 因为 main 是不会执行到 return 的.

使用特权

评论回复
7
646582045|  楼主 | 2015-5-26 19:18 | 只看该作者
airwill 发表于 2015-5-26 18:58
首先: 操作库函数是简捷快速的控制方式,希望先适应它, 熟练后再考虑操作寄存器的方式.

main() 里面一般不 ...

那我应该怎么修改这个程序呢

使用特权

评论回复
8
zh113214| | 2015-5-26 20:16 | 只看该作者
不是很懂,希望高手帮到你。。

使用特权

评论回复
9
yhy123456| | 2015-5-26 20:19 | 只看该作者
建议先 下载别人的程序看看

使用特权

评论回复
10
646582045|  楼主 | 2015-5-26 20:28 | 只看该作者
yhy123456 发表于 2015-5-26 20:19
建议先 下载别人的程序看看

找了很多,都是使用库函数编的,哎。。。

使用特权

评论回复
11
NE5532| | 2015-5-26 22:13 | 只看该作者
main函数都return了,楼主,你还是暂时不要研究串口了,先研究IO取反输出吧。把程序的基本运行先搞清楚了再研究复杂外设。

使用特权

评论回复
12
949155525| | 2015-5-26 23:06 | 只看该作者
找个历城不就是了 ,官网上一大把   

使用特权

评论回复
13
anjf163| | 2015-5-27 10:20 | 只看该作者
建议还是使用ST的厂家固件库,做底层驱动,安全可靠。
在关键的地方再使用寄存器操作。

串口操作在ST的固件库里有例子,很容易懂。

使用特权

评论回复
14
yhy123456| | 2015-5-27 11:29 | 只看该作者
646582045 发表于 2015-5-26 20:28
找了很多,都是使用库函数编的,哎。。。

库函数 是主流

使用特权

评论回复
15
646582045|  楼主 | 2015-5-27 11:57 | 只看该作者
哪位大神能帮我写一个串口接收程序啊!!!操作寄存器的,实在找不出问题所在啊
#include"stm32f10x_map.h"
u8 res;

int main()
{
RCC->APB2ENR|=1<<14;          //开启USART时钟
RCC->APB2ENR|=1<<2;          //开启GPIOA时钟
GPIOA->CRH&=0xfffff00f;
GPIOA->CRH|=0x000004b0;   //PA.09(TX1)复用推挽输出,PA.10(RX1)浮空输入
USART1->BRR=0x0045;           //设置波特率为115200
USART1->CR1|=1<<2;                   //接收允许
USART1->CR1|=1<<3;                   //发送允许
USART1->CR1|=1<<13;           //USART允许
RCC->APB2ENR|=1<<5;           //开启GPIOD时钟
GPIOD->CRH&=0x0000ffff;
GPIOD->CRH|=0x33330000;    //设置PD.13位通用推挽输出

while(1)
{
if(USART1->SR&1<<5)     
{res=USART1->DR;
if(res==1)
GPIOD->ODR=0xffff;}        //如果接收到1,点亮点亮小灯           
}
}

使用特权

评论回复
16
airwill| | 2015-5-27 12:37 | 只看该作者
还不如这样写:

while(1) {
if(USART1->SR&1<<5)   {  
GPIOD->ODR=USART1->DR;       //如果接收到数据, 将数据放到端口         
}   
}

使用特权

评论回复
17
diweo| | 2015-5-27 12:42 | 只看该作者
初学者就老老实实从跑马灯搞起。

使用特权

评论回复
18
646582045|  楼主 | 2015-5-27 13:49 | 只看该作者
airwill 发表于 2015-5-27 12:37
还不如这样写:

while(1) {

这样写 还是点亮不了小灯,到底哪里有问题呢????

使用特权

评论回复
19
lgq_123| | 2015-5-27 17:38 | 只看该作者
,1,建议首先直接点灯,看控制亮灭的时钟和IO相关的寄存器配置是否正确;2,再检查串口初始化相关的配置是否正确(波特率设置如果不对的话,也收不到);3,通过串口发送一些数据,看串口调试助手能不能收到数据。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
646582045 + 1 很给力!
20
646582045|  楼主 | 2015-5-27 18:38 | 只看该作者
我加上了注释的那段程序,程序就没问题啦,请问各位大神,为什么要加上那段程序啊????
#include"stm32f10x_map.h"
u8 res;
// char Usart1_Rxd()
// {
//  if (USART1->SR&1<<5)
//  return USART1->DR;
//  else
//  return 0;
//  }
//
int main()
{
RCC->APB2ENR|=1<<14;          //开启USART时钟
RCC->APB2ENR|=1<<2;          //开启GPIOA时钟
GPIOA->CRH&=0xfffff00f;
GPIOA->CRH|=0x000004b0;   //PA.09(TX1)复用推挽输出,PA.10(RX1)浮空输入
USART1->BRR=0x0045;           //设置波特率为115200
USART1->CR1|=1<<2;                   //接收允许
USART1->CR1|=1<<3;                   //发送允许
USART1->CR1|=1<<13;           //USART允许
RCC->APB2ENR|=1<<5;           //开启GPIOD时钟
GPIOD->CRH&=0x0000ffff;
GPIOD->CRH|=0x33330000;    //设置PD.13位通用推挽输出

while(1)
{
if(USART1->SR&1<<5)     
{res=USART1->DR;                                     
if(res==0x36)
GPIOD->ODR=0xffff;   }    //如果接收到1,点亮点亮小灯           
}
}

使用特权

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

本版积分规则

2

主题

9

帖子

0

粉丝