你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

USART2_TX和TIM2_CH3重合问题

[复制链接]
tilblackout 提问时间:2020-2-27 21:19 /
悬赏1ST金币未解决
我要用USART2_RX(PA3)来接受串口发来的数据,USART2_TX(PA2)发送数据不用。但是我要用TIM2_CH3(同样是PA2)来输出PWM输出比较波形。
在串口初始化函数中USART_InitStructure.USART_Mode = USART_Mode_Rx;我没写USART_Mode_Tx。但是在USART2和PWM初始化完后,PWM的PA2口仍然输出不了指定波形,逻辑分析仪上什么也不输出。
把USART2初始化函数去掉,就可以正常输出。
有什么方法可以不用PA2当作串口发送口,而当作PWM输出口吗?

收藏 1 评论8 发布时间:2020-2-27 21:19

举报

8个回答
流水源 回答时间:2020-2-28 10:15:20
修改USART2_TX(PA2)引脚复用功能为PWM。
PWM初始化函数放在USART2初始化后面试下。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

tilblackout 回答时间:2020-2-28 11:54:13
流水源 发表于 2020-2-28 10:15
修改USART2_TX(PA2)引脚复用功能为PWM。
PWM初始化函数放在USART2初始化后面试下。 ...

修改复用功能为PWM时啥意思,PA2设置成复用推挽?我本来就这么设置的。。
我发现只要开启了USART2的时钟PA2就输出不了,关了就正常输出。所以和初始化顺序也没啥没关系。
流水源 回答时间:2020-2-28 14:00:56
GPIO端口配置成PWM外设的复用功能。
你把你的代码放出来看看啊。
tilblackout 回答时间:2020-2-28 17:09:17
void UART_Init(void)
{
        USART_InitTypeDef USART_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
        //GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE);
        /* Configure USARTy Rx as input floating */
  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);
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
        /* Enable USARTy Receive and interrupts */
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
        /* Enable the USARTy */
  USART_Cmd(USART2, ENABLE);
}
————————————————————
void PWM_OC_Init()
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        /* TIM3 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  /* GPIOA and GPIOB clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1 | GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 999;
  TIM_TimeBaseStructure.TIM_Prescaler = 71;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  /* PWM1 Mode configuration: Channel */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 100;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC2Init(TIM2, &TIM_OCInitStructure);
        TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
        TIM_OC3Init(TIM2, &TIM_OCInitStructure);
  TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
  TIM_ARRPreloadConfig(TIM2, ENABLE);
  /* TIM2 enable counter */
  TIM_Cmd(TIM2, ENABLE);
}
aiherong 回答时间:2020-2-29 03:25:41
问题应该出在USART2的设置上
库函数初始化外设大都考虑的是最常用工作状态,串口多为全双工模式
建议试一下用寄存器初始化USART2为单工方式,另外如楼上所说PWM初始化放在其后,别忘了开启复用时钟
可参考我的帖子: www.stmcu.org.cn/module/forum/thread-618512-1-1.html

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

ldptest 回答时间:2020-2-29 18:21:48
cubemx中USART_TX2模式设置为single wire(Haft-Duplex)模式,只占用tx端口,如图
我没试过是否能满足你要求。
无标题.png

tilblackout 回答时间:2020-3-1 00:15:51
“USART可以配置为采用单线半双工协议。在单线半双工模式下,TX和RX引脚内部连接.半双工通信和全双工通信之间的选择是使用控制位‘HALF DUPLEX SEL’(在USART_CR 3中的HDSEL)进行的。”
如果内部TX和RX内部连接的话,应该更不可能空出PA2吧。。。
天臆弄人 回答时间:2020-3-3 15:44:29
很简单禁用串口,要发送时候再打开

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版