野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20916|回复: 10

STM32学习第16天(20160801)-串口发数据的疑问

[复制链接]
发表于 2016-8-2 08:48:02 | 显示全部楼层 |阅读模式
由于上周末有事情,因此耽误了两天学习时间。今天是STM32学习第16天。
目前串口发送数据还有问题。个人感觉是硬件上的某些跳线或者什么没有跳。我用的是STM32MINI板。代码见附件。
USART学习笔记:
USART支持同步单向通信和半双工单线通信,也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信使用多缓冲器配置的DMA方式,可以实现高速数据通信。
想当年,我以为USART就是同步单向通信和半双工单线通信。
那第一个就先学习用串口收发数据吧。
数据手册如是说:
USART发送数据,步骤如下:
1. 通过在USART_CR1寄存器上置位UE位来激活USART*这个一定要记得*
2. 编程USART_CR1的M位来定义字长。
3. 在USART_CR2中编程停止位的位数。
4. 如果采用多缓冲器通信,配置USART_CR3中的DMA使能位(DMAT)。按多缓冲器通信中的描述配置DMA寄存器。(*这个我还没用过*
5. 利用USART_BRR寄存器选择要求的波特率。
6. 设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。
7. 把要发送的数据写进USART_DR寄存器(此动作清除TXE位)。在只有一个缓冲器的情况下,对每个待发送的数据重复步骤7。
8. 在USART_DR寄存器中写入最后一个数据字后,要等待TC=1,它表示最后一个数据帧的传输结束。当需要关闭USART或需要进入停机模式之前,需要确认传输结束,避免破坏最后一次传输。
我的程序中的实现如下:
1--配置USART
1)使能时钟
使能GPIO时钟--USART_Init(USART3,&USART_InitStructure);
使能USART3的时钟--RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE);       
2配置GPIO--
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
3)配置USART3的模式
USART_InitStructure.USART_BaudRate =        macUSART_BaudRate;
USART_InitStructure.USART_HardwareFlowControl = macUSART_HardwareFlowControl;
USART_InitStructure.USART_Mode = macUSART_Mode;
USART_InitStructure.USART_Parity = macUSART_Parity;
USART_InitStructure.USART_StopBits = macUSART_StopBits;
USART_InitStructure.USART_WordLength = macUSART_WordLength;
USART_Init(USART3,&USART_InitStructure);
4)使能USART3
通过在USART_CR1寄存器上置位UE位来激活USART
USART_Init(USART3,&USART_InitStructure);
2—Usart3发送数据
判断USART_FLAG_TXE,发送数据。
程序如下,用串口调试助手接收不到数据。很郁闷。麻烦大家帮忙看一下,是不是板子上有哪些跳线要短接?

Demo-USART.zip

4.95 MB, 下载次数: 11

Demo

回复

使用道具 举报

发表于 2016-8-2 09:04:40 | 显示全部楼层
大家发帖时,要贴代码的时候请加上格式控制,具体怎么添加看帖子
http://www.firebbs.cn/forum.php? ... 12771&fromuid=1
(出处: 野火论坛)
回复 支持 反对

使用道具 举报

发表于 2016-8-2 09:07:46 | 显示全部楼层
你只配置了接收引脚,发送引脚有没有配置?
回复 支持 反对

使用道具 举报

发表于 2016-8-2 09:17:25 | 显示全部楼层
学到第16天了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-2 09:21:32 | 显示全部楼层
flyleaf 发表于 2016-8-2 09:07
你只配置了接收引脚,发送引脚有没有配置?

我看原理图,那个引脚是发送引脚呀!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-2 09:23:18 | 显示全部楼层
fire 发表于 2016-8-2 09:04
大家发帖时,要贴代码的时候请加上格式控制,具体怎么添加看帖子
http://www.firebbs.cn/forum.php?mod=vi ...

好的,Fire,谢谢
回复 支持 反对

使用道具 举报

发表于 2016-8-2 09:27:37 | 显示全部楼层
空瓶子 发表于 2016-8-2 09:23
好的,Fire,谢谢

PB10是TX,PB11是RX,看数据手册
回复 支持 反对

使用道具 举报

发表于 2016-8-2 09:43:25 | 显示全部楼层
新手问个问题。在地址映射时,*(unsigned int *)(0x40010c0c)=0xFFFF;
这一句话中(unsigned int *)代表什么?前面的*又代表什么?火哥讲的我没太懂。
回复 支持 反对

使用道具 举报

发表于 2016-8-2 09:45:41 | 显示全部楼层
能不能这样写unsigned int *p=0x40010c0c;*p=0xFFFF;
回复 支持 反对

使用道具 举报

发表于 2016-8-2 10:08:41 | 显示全部楼层
supre_me 发表于 2016-8-2 09:45
能不能这样写unsigned int *p=0x40010c0c;*p=0xFFFF;

可以                              
回复 支持 反对

使用道具 举报

发表于 2016-8-2 10:10:15 | 显示全部楼层
supre_me 发表于 2016-8-2 09:43
新手问个问题。在地址映射时,*(unsigned int *)(0x40010c0c)=0xFFFF;
这一句话中(unsigned int *) ...

1、(unsigned int *) 的作用是 把  (0x40010c0c) 这个地址 强制转换 为 指针,如果不强制类型转换的话,在编译器看来  (0x40010c0c) 只是一个立即 数。

2、前面的  * 就是  对指针操作,这个很好理解
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-12-6 03:45 , Processed in 0.046941 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表