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

为什么使用了串口初始化之后,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, 下载次数: 224, 下载积分: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版