打印
[STM32F1]

stm32 IO口的多个复用功能求教

[复制链接]
7512|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
flashtt|  楼主 | 2014-11-13 16:15 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
PA2有两个复用功能,分别是USART2_TX和TIM2_CH3,我在配置串口时并没有配置该IO口,仅使能了串口接收模式,但将PA2设置为复用推挽输出后仍无法使用TIM2_CH3,十分不解,求教。
沙发
SLHSu37| | 2014-11-13 16:22 | 只看该作者
高深的问题····

使用特权

评论回复
板凳
jiaxinhui| | 2014-11-13 17:27 | 只看该作者
要想使用TIM2_CH3功能,你必须先初始化TIM2,使能相关设置后,才行。

使用特权

评论回复
地板
flashtt|  楼主 | 2014-11-13 18:15 | 只看该作者
我遇到的问题其实就是一个IO口有多个复用功能的问题,显然我在使能USART后,即使我没有配置PA2即USART2的发送口,这个IO口还是被复用了,所以之后我再将这个IO口配置为TIM_CH3就没用了,难道这是默认设置吗,配置USART2时我明明没有配置PA2,
请各路大神加入讨论

使用特权

评论回复
5
flashtt|  楼主 | 2014-11-13 18:19 | 只看该作者
void USART_Config(void)   //这是我配置USART2的函数,可以看到没有配置PA2
{
        USART_InitTypeDef USART_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
       
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        USART_InitStructure.USART_BaudRate =9600;
        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_Init(USART2, &USART_InitStructure);
       
        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
       
        USART_Cmd(USART2, ENABLE);
}   

void TIM_Config(void)  //配置TIM,PA1正常,PA2无法使用,在主函数中注释掉USART_Config()后PA2就可以正常输出PWM波了
{
        GPIO_InitTypeDef GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  TIM_OCInitTypeDef TIM_OCInitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

  TIM_TimeBaseInitStructure.TIM_Period = 999;
  TIM_TimeBaseInitStructure.TIM_Prescaler = 71;
  TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
       
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_Pulse = Pulse2;
        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
        TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
  TIM_OCInitStructure.TIM_OutputState = ENABLE;
  TIM_OCInitStructure.TIM_OutputNState = ENABLE;
  TIM_OC2Init(TIM2,&TIM_OCInitStructure);

        TIM_OCInitStructure.TIM_Pulse = Pulse3;
  TIM_OC3Init(TIM2,&TIM_OCInitStructure);

  TIM_SetCompare2(TIM2, 0);
        TIM_SetCompare3(TIM2, 0);

  TIM_Cmd(TIM2, ENABLE);

        TIM_CtrlPWMOutputs(TIM2, ENABLE);
}

十分不解

使用特权

评论回复
6
diweo| | 2014-11-13 18:21 | 只看该作者
你没配置就表示你没有管脚重映射,那PA2当然被占用了。虽然功能不一定正常。

使用特权

评论回复
7
mmuuss586| | 2014-11-13 18:34 | 只看该作者
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
那把这段也注释掉看看;

另外程序初始化,先初始化UART再初始化定时器;

使用特权

评论回复
8
flashtt|  楼主 | 2014-11-13 19:54 | 只看该作者
好像还是不行,必须把USART_Config()注释掉PA2才能正常工作,但现在明明USART_Config()中已经没有任何IO口配置了,不解

使用特权

评论回复
9
flashtt|  楼主 | 2014-11-13 19:59 | 只看该作者
不过USART2可以正常工作,那么问题来了,为什么没有配置IO口USART2还可以正常接收数据,难道PA2,PA3默认是USART的收发口吗

使用特权

评论回复
10
flashtt|  楼主 | 2014-11-13 20:16 | 只看该作者
没道理啊,太没道理了,这块板子上只有USART2连接了USB,PA2是USART2的发送口,同时也是TIM_CH3,我没有用到
USART2的发送端,模式也选择的是接收模式,为什么不能用TIM_CH3,板子是死的,又不能把它串口重映射到其他端口

使用特权

评论回复
11
mmuuss586| | 2014-11-13 20:37 | 只看该作者
flashtt 发表于 2014-11-13 20:16
没道理啊,太没道理了,这块板子上只有USART2连接了USB,PA2是USART2的发送口,同时 ...

只要你使能了UART2,PA2,PA3就会被默认设置成串口了;
除非你选择的型号,有其它引脚可以设置;

或者你PWM输出通道换下;

捕获.JPG (53.85 KB )

捕获.JPG

使用特权

评论回复
12
icecut| | 2014-11-13 22:20 | 只看该作者
本帖最后由 icecut 于 2014-11-13 22:43 编辑

这么牛X的需求,千万别调用库函数!!

我用stm32cubeMx 试了一下,只有半双工模式才是一根腿.你重新看看手册,确认一下模式吧.

使用特权

评论回复
13
flashtt|  楼主 | 2014-11-14 17:36 | 只看该作者
懂了,不过设置半双工模式的库函数还是有的,我用USART_HalfDuplexCmd(USART2, ENABLE)试试,不过好像也没有达到我的要求,默认释放掉的是Rx端口,哎,不过还是谢谢大家的帮忙

25.3.10 单线半双工通信
单线半双方模式通过设置USART_CR3寄存器的HDSEL位选择。在这个模式里,下面的位必须保持清零状态:
● USART_CR2寄存器的LINEN和CLKEN位
● USART_CR3寄存器的SCEN和IREN位
USART可以配置成遵循单线半双工协议。在单线半双工模式下,TX和RX引脚在芯片内部互连。使用控制位”HALF DUPLEX SEL”(USART_CR3中的HDSEL位)选择半双工和全双工通信。
当HDSEL为’1’时
● RX不再被使用
● 当没有数据传输时,TX总是被释放。因此,它在空闲状态的或接收状态时表现为一个标准I/O口。这就意味该I/O在不被USART驱动时,必须配置成悬空输入(或开漏的输出高)。
除此以外,通信与正常USART模式类似。由软件来管理线上的冲突(例如通过使用一个中央仲裁器)。特别的是,发送从不会被硬件所阻碍。当TE位被设置时,只要数据一写到数据寄存器上,发送就继续。

使用特权

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

本版积分规则

5

主题

23

帖子

0

粉丝