打印

STM32串口应该如何正确配置及疑问?

[复制链接]
8548|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
雨落沉轩|  楼主 | 2013-1-7 14:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
串口配置的部分程序:
static void USART_Config(void)
{
  USART_InitTypeDef USART_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  
  /* Enable GPIOC and GPIOE clock */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC , ENABLE);
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE , ENABLE);
  
  /* Enable USART1 APB clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  
  /* USART1 Pins configuration

************************************************/
  /* Connect pin to Periph */
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_7);   
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource1, GPIO_AF_7);
  
  /* Configure pins as AF pushpull */
       
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOE, &GPIO_InitStructure);

}
这是官方下载的例子,我跑这个例子,用串口调试助手检查不到端口。

对于F3串口初始还有几点疑惑:
1:通过查看手册发现STM32有两个,USART1:PC3、PC4和PE0、PE1.为什

么要设两个呢?而且上面例子中,UARTTX选择PC4,UARTRX选择PE1,这

又是为什么?
2:上面USART1 Pins两个都配置成了推免输出,我查看以一下其他STM32的串口是这样配置的,串口TX对应I/O口配置成推免输出模式,RX口配置成浮空,如:

这是芯达STM32入门系列教程USART串口编程里的配置:
结构的成员设置如下:
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA , &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);

上面那个配置成推免,下面配置成GPIO_Mode_IN_FLOATING。但我的stm32f30x_gpio.h的文件里对于GPIO_Mode模式里并没有GPIO_Mode_IN_FLOATING选项,于是我修改成下面形式,不知道是否表示浮空
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOE, &GPIO_InitStructure);

但结果烧写完程序还是无法检测到串口工作。请高手指点
   
沙发
jiaxinhui| | 2013-1-7 16:40 | 只看该作者
你还没有说明你用的芯片的具体型号呢

使用特权

评论回复
板凳
uet_cache| | 2013-1-7 16:49 | 只看该作者
F3 要配置重映射功能的,而且配置方法与F1不同。
帖段代码给你看吧:

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA , ENABLE);  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  
  GPIO_DeInit(GPIOA);
  
  /* Connect pin to Periph */
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_7);   
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_7);
  
  /* Configure pins as AF pushpull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

使用特权

评论回复
地板
uet_cache| | 2013-1-7 16:49 | 只看该作者
不行,就买我开发板吧,配了各种例程,

使用特权

评论回复
5
雨落沉轩|  楼主 | 2013-1-7 17:46 | 只看该作者
uet_cache 发表于 2013-1-7 16:49
F3 要配置重映射功能的,而且配置方法与F1不同。
帖段代码给你看吧:

哦,看到过重映射,但对这个不是很理解。你的这几行:
  /* Configure pins as AF pushpull */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
意思是把A9、A10都配置成推免上拉方式,而不像F1中一个要上拉,一个要浮空吧。这样理解可以吗?还有哪段代码是体现重映射思想,不是很理解。

使用特权

评论回复
6
雨落沉轩|  楼主 | 2013-1-7 17:47 | 只看该作者
jiaxinhui 发表于 2013-1-7 16:40
你还没有说明你用的芯片的具体型号呢

不好意思,没说清楚,是STM32F3DISCOVERY,之前活动中申请到的

使用特权

评论回复
7
uet_cache| | 2013-1-7 17:51 | 只看该作者
/* Connect pin to Periph */
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_7);   
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_7);
为重映射,,可以查看手册,,

使用特权

评论回复
8
雨落沉轩|  楼主 | 2013-1-7 18:10 | 只看该作者
uet_cache 发表于 2013-1-7 17:51
/* Connect pin to Periph */
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_7);   
  GPIO_PinAF ...

好的,这句话我原本以为就是将普通I/O配置成UART串口功能的意思,原来这就是重映射,多谢讲解。那请问你我上述的理解对吗?就是在F3中就不需要吧串口对应的端口配置为一个上拉,一个浮空,而只需要像上述你的配置就行了。是吧?

使用特权

评论回复
9
uet_cache| | 2013-1-7 18:43 | 只看该作者
上面我帖的代码是测试通过了的

使用特权

评论回复
10
uet_cache| | 2013-1-7 18:44 | 只看该作者
我有个专门帖F3例程的帖,上传了8个例程的,,你可以参考下

使用特权

评论回复
11
雨落沉轩|  楼主 | 2013-1-7 19:43 | 只看该作者
uet_cache 发表于 2013-1-7 18:44
我有个专门帖F3例程的帖,上传了8个例程的,,你可以参考下

能发给链接吗,没找到,谢谢

使用特权

评论回复
12
uet_cache| | 2013-1-7 19:50 | 只看该作者
13
sunnyhey| | 2013-1-8 15:13 | 只看该作者
其实串口是STM32的所有外设中最简单的,配置好管脚,TX配置成输出模式(推挽还是开漏要看你的硬件有没有上拉电阻),RX配置成输入模式(上拉、下拉或浮空,也要看硬件连接),是复用的管脚需要映射下,不是复用的直接用,至于收发数据,你可以开个中断,先自发自收。

使用特权

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

本版积分规则

19

主题

250

帖子

0

粉丝