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

为什么使用了串口初始化之后,TIM8的PWM就不能正常输出了?

[复制链接]
vention123456 提问时间:2016-12-12 08:36 /
1ST金币
本帖最后由 vention123456 于 2016-12-12 12:00 编辑

STM32F103RC的芯片,有TIM8的。
随便写了一个串口的初始化函数,和一个TIM8的pwm输出,发现,屏蔽掉串口初始化,TIM8正常PWM输出,开启了usart1初始化,TIM8的PWM就没有输出了。铺上代码:
附件附上CubeMX生成的HAL库工程,做对比

#include "stm32f10x.h"

void uart_init(u32 bound);
void time_init(void);

int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         
        
    uart_init(115200);
    time_init();                    

    while(1)
        {  
        }
}

void uart_init(u32 bound)
{

  GPIO_InitTypeDef        GPIO_InitStructure;
  USART_InitTypeDef       USART_InitStructure;
  NVIC_InitTypeDef         NVIC_InitStructure;
         
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);         

        //USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         
  GPIO_Init(GPIOA, &GPIO_InitStructure);

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

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                 
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        
        NVIC_Init(&NVIC_InitStructure);         

        USART_InitStructure.USART_BaudRate = bound;
        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_Mode_Tx;         

  USART_Init(USART1, &USART_InitStructure);  
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  USART_Cmd(USART1, ENABLE);                     

}
void time_init()
{

      GPIO_InitTypeDef            GPIO_InitStructure;
      TIM_TimeBaseInitTypeDef     TIM_TimeBaseStructure;
      TIM_OCInitTypeDef           TIM_OCInitStructure;

   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC| RCC_APB2Periph_TIM8, ENABLE);   

    /* TIM8 channels as alternate function push-pull */   
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;  
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOC, &GPIO_InitStructure);   

    /* Time Base configuration */
    TIM_TimeBaseStructure.TIM_Prescaler = 720-1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseStructure.TIM_Period = 98-1;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 5;  
    TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);

    /* Channels Configuration in Toggle mode */
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
    TIM_OC1Init(TIM8, &TIM_OCInitStructure);
    TIM_OC3Init(TIM8, &TIM_OCInitStructure);
    TIM_OC2Init(TIM8, &TIM_OCInitStructure);
    TIM_OC4Init(TIM8, &TIM_OCInitStructure);

    TIM_CtrlPWMOutputs(TIM8, ENABLE);
    TIM_SelectOnePulseMode(TIM8, TIM_OPMode_Repetitive);
    TIM_Cmd(TIM8, ENABLE);      

}
void USART1_IRQHandler(void)                        
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
    {
    u8  Res =USART_ReceiveData(USART1);                                 
    }

}



pwm.zip

下载

9.25 MB, 下载次数: 222, 下载积分: ST金币 -1

收藏 1 评论27 发布时间:2016-12-12 08:36

举报

27个回答
andypanfan 回答时间:2016-12-12 09:02:11
应该没有问题  ,我原来做过   ,只是代码现在找不到了!!!
斜阳 回答时间:2016-12-12 09:17:16
mark一下等待解答
vention123456 回答时间:2016-12-12 09:23:32
andypanfan 发表于 2016-12-12 09:02
应该没有问题  ,我原来做过   ,只是代码现在找不到了!!!

我找不到原因。上面的程序也十分的简短,就两个功能函数,一个usart1 初始化, 一个TIM8的PWM输出。貌似之前也看到过有帖子别人也遇到类似问题。
废鱼 回答时间:2016-12-12 09:29:07
楼主,TIM8的中断优先级调高一些,串口中断中尽量不要处理数据,只接收到缓冲区中。看一下是不是串口频繁中断导致的。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

vention123456 回答时间:2016-12-12 09:54:23
安 发表于 2016-12-12 09:29
楼主,TIM8的中断优先级调高一些,串口中断中尽量不要处理数据,只接收到缓冲区中。看一下是不是串口频繁中 ...

有怀疑没有uart1的中断入口, 我把uart1的中断补上,中断里面几乎不做什么。那我如何调TIM8的中断级别?TIM8默认的中断级别是什么?
小道道 回答时间:2016-12-12 10:15:21
先初始tim8再初始化uart试试看

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

vention123456 回答时间:2016-12-12 10:27:01
本帖最后由 vention123456 于 2016-12-12 10:28 编辑
daolong 发表于 2016-12-12 10:15
先初始tim8再初始化uart试试看

那样是可以的。我之前试过了。 先初始化TIM8 再初始化Uart1,就没有问题了,我就是想不明白为什么。而我用CubeMX 生成的HAL库函数,是没有问题的,无论放TIM8初始化在前面,还是放Uart1初始化在前面,都不会有这个问题。
废鱼 回答时间:2016-12-12 11:07:39
应该还是TIM的中断问题,楼主看一下HAL库里面的tim8的初始化代码。
vention123456 回答时间:2016-12-12 11:16:28
安 发表于 2016-12-12 11:07
应该还是TIM的中断问题,楼主看一下HAL库里面的tim8的初始化代码。

尝试去看,看不太懂,还对比着。基础水平太差了
废鱼 回答时间:2016-12-12 11:21:41
你把HAL的工程传上来,你测试不影响的。
vention123456 回答时间:2016-12-12 11:46:46
安 发表于 2016-12-12 11:21
你把HAL的工程传上来,你测试不影响的。

已经附上HAL库工程。
调换
MX_USART1_UART_Init();
  MX_TIM8_Init();
两者前后顺序,可以正常输出PWM
xmshao 回答时间:2016-12-12 11:48:41
完整的型号是多少?

PWM是硬件输出。很怀疑你管脚配置是否有冲突。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

vention123456 回答时间:2016-12-12 11:59:02
xmshao 发表于 2016-12-12 11:48
完整的型号是多少?

PWM是硬件输出。很怀疑你管脚配置是否有冲突。

STM32F103RC

TIM8和Uart1 完全是不一样的引脚啊,一个是PC6,7,8,9     一个是PA9,10
xmshao 回答时间:2016-12-12 12:14:53
vention123456 发表于 2016-12-12 11:59
STM32F103RC

TIM8和Uart1 完全是不一样的引脚啊,一个是PC6,7,8,9     一个是PA9,10

oh,那再看看代码方面。
12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版