搜索
bottom↓
回复: 4

STM32定时器1PWM输出和USART1配置冲突问题

[复制链接]

出0入0汤圆

发表于 2016-12-8 17:51:25 | 显示全部楼层 |阅读模式
本帖最后由 书9500 于 2016-12-8 17:53 编辑

跪求大神帮我解决问题。
我用TIM1的输出通道1(PA8)和输出通道4(PA11)做PWM输出控制电机,USART1做普通收发用PA9和PA10,理论上不会有什么冲突。但是,现在的问题是这样的,我TIM1和USART1分别进行初始化后,当先调用USART1初始化函数后调用TIM1初始化函数时,TIM1的输出通道OC1竟然不好使(也就是PA8);只有先初始化TIM1在初始化USART1才能好使。(PA11也就是OC4并不受影响)附上代码如下

/**初始化调用函数如下**/
//不知道为什么必须先初始化PWM函数再初始化串口函数
//调转的话就不好使。

                MOTOR_PWM_Configuration();
                Usart1_Configuration();


/*初始化函数实现如下*/
我的时钟有一个专门的函数来开启,在主函数里调用。
void RCC_Configuration(void)
{
        //SystemInit();
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );       
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOC, ENABLE );       

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

       

        PWR_BackupAccessCmd(ENABLE);//取消备份区保护
        RCC_LSEConfig(RCC_LSE_OFF);//外部低速振荡器关闭,释放PC15、PC14
        BKP_TamperPinCmd(DISABLE);//侵入检测TAMPER引脚PC13作为通用IO口使用
        BKP_ITConfig(DISABLE);//打开备份区保护
       
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);  //关闭JTAG功能,使用SWD功能PB4

}

/**        函数名称:电机PWM配置函数
**        函数功能:配置两个电机的PWM输入引脚以及方向控制引脚
*                参    数:无
*                返 回 值:无
*                说    明:                                                pwm |    方向     
                                                ________________|_____________|
                                                电机1        A电机        PA.8|        PB.14/PB.15 |
                                                ________________|_____________|
                                                电机2 B电机PA.11| PB.12/PB.13 |
                                                ________________|_____________|
                                                电机使能 常开               
                                                ______________________________|
*                备    注:2015/08/05_
**/
void MOTOR_PWM_Configuration(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
       
       
        /*配置GPIO端口*/
/***********************************/
        /*配置PWM输出端口*/
//        GPIO_StructInit(&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11; //
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        /*配置方向控制端口*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;                                 //PA.0 PA.1 PA.2端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
/***********************************/
        /*定时器频率设定作为PWM的频率  10KHZ */
/***********************************/
   TIM_DeInit(TIM1);


        TIM_TimeBaseStructure.TIM_Period=7199;//初值  电机频率为10KHZ
        TIM_TimeBaseStructure.TIM_Prescaler=0;//不分频
        TIM_TimeBaseStructure.TIM_ClockDivision=0;
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上

        TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
       
        TIM_ARRPreloadConfig(TIM1,ENABLE);  //

/***********************************/
        /*PWM占空比设定*/
/***********************************/
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_Pulse =5000; //设置待装入捕获比较寄存器的脉冲值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //左电机PWM信号
        TIM_OC4Init(TIM1, &TIM_OCInitStructure);  //右电机PWM信号
/***********************************/
/***********************************/
        TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
        TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);

        TIM_Cmd(TIM1,ENABLE);
        TIM_CtrlPWMOutputs(TIM1,ENABLE); //



}

/**串口初始化函数**/
void Usart1_Configuration(void)
{
        //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
          USART_InitTypeDef USART_InitStructure;
         

          USART_DeInit(USART1);  //复位串口1

    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); //初始化PA9
   
    //USART1_RX          PA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10


   //USART 初始化设置

         USART_InitStructure.USART_BaudRate = 115200;//波特率;
         USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
         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_Cmd(USART1, ENABLE);                    //使能串口
       
       
}

出0入0汤圆

 楼主| 发表于 2016-12-10 15:37:40 | 显示全部楼层
没有人吗?

出0入10汤圆

发表于 2016-12-10 15:41:26 | 显示全部楼层
好长时间没玩STM32了,我猜想是USART1用了TIM1的时基单元引起的吧

出0入0汤圆

 楼主| 发表于 2016-12-10 19:10:39 | 显示全部楼层
dwiller_ARM 发表于 2016-12-10 15:41
好长时间没玩STM32了,我猜想是USART1用了TIM1的时基单元引起的吧

USART有自己独立的波特率发生器

出0入0汤圆

发表于 2022-12-6 21:39:46 | 显示全部楼层
书9500 发表于 2016-12-10 19:10
USART有自己独立的波特率发生器
(引用自4楼)

楼主解决了吗,遇到同样问题
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 05:10

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表