OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4052|回复: 13

pwm怎么换输出IO口,我想把PA8口换成其他的口,求大神帮忙,改了一些不大会该,,,,

[复制链接]

13

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2018-4-6
在线时间
55 小时
发表于 2018-4-6 20:49:39 | 显示全部楼层 |阅读模式
5金钱
#include "pwm.h"
#include "led.h"
void TIM1_PWM_Init(u16 arr,u16 psc)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
       
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //TIM_CH1
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

       
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
        TIM_TimeBaseStructure.TIM_Prescaler = psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OC1Init(TIM2, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

        TIM_CtrlPWMOutputs(TIM2,ENABLE);         
        TIM_ARRPreloadConfig(TIM2, ENABLE); //使能TIMx在ARR上的预装载寄存器
       
        TIM_Cmd(TIM2, ENABLE);  //使能TIM1
               
}


最佳答案

查看完整内容[请看2#楼]

这一章好好研究一下。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-4-6 20:49:40 | 显示全部楼层
QQ截图20180408092325.jpg
这一章好好研究一下。。
回复

使用道具 举报

19

主题

51

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1906
金钱
1906
注册时间
2017-10-8
在线时间
230 小时
发表于 2018-4-6 21:11:31 | 显示全部楼层
您看看是不是您这里配置的问题啊        TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
回复

使用道具 举报

19

主题

51

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1906
金钱
1906
注册时间
2017-10-8
在线时间
230 小时
发表于 2018-4-6 21:14:35 | 显示全部楼层
天耀中华 发表于 2018-4-6 21:11
您看看是不是您这里配置的问题啊        TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器 ...

如果想改端口的话,使能对应的端口复用时钟,并改变相应的端口应该就可以了吧
回复

使用道具 举报

13

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2018-4-6
在线时间
55 小时
 楼主| 发表于 2018-4-6 21:21:51 | 显示全部楼层
我的是改的原子哥的,
回复

使用道具 举报

13

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2018-4-6
在线时间
55 小时
 楼主| 发表于 2018-4-6 21:23:34 | 显示全部楼层
新手上路,不大会改,改了半天还没有解决, ,,,
回复

使用道具 举报

13

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2018-4-6
在线时间
55 小时
 楼主| 发表于 2018-4-6 21:24:38 | 显示全部楼层
本帖最后由 duoduolong 于 2018-4-6 21:35 编辑

我就是想改一下端口,想学一下该端口的方法,改成那个都可以,只要不是PA8就行。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-4-7 01:37:20 | 显示全部楼层
你得看明白原理才能改。原理都没看明白,怎么改? 看你的PA3,是TIM2_CH4,你居然用TIM_OC1Init在初始化,就肯定出不了波形了。
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-4-7 07:38:57 来自手机 | 显示全部楼层
寄存器手册里,GPIO一章,有端口重映射。开启一下定时器的重映射,就会把输出脚转移到另一个位置(固定位置,不是想换哪就换哪哦,管脚太少的可能不让换太多)
回复

使用道具 举报

13

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2018-4-6
在线时间
55 小时
 楼主| 发表于 2018-4-7 08:12:57 | 显示全部楼层
孟亮 发表于 2018-4-7 07:38
寄存器手册里,GPIO一章,有端口重映射。开启一下定时器的重映射,就会把输出脚转移到另一个位置(固定位置 ...

#include "pwm.h"
#include "led.h"
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK Mini STM32开发板
//PWM  驱动代码                          
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2010/12/03
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////           


//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM1_PWM_Init(u16 arr,u16 psc)
{  
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  | RCC_APB2Periph_AFIO , ENABLE);  //使能GPIO外设时钟使能
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);                                                                            

   //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //TIM_CH1
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

       
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
        TIM_TimeBaseStructure.TIM_Prescaler = psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OC4Init(TIM2, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

        //TIM_CtrlPWMOutputs(TIM2,ENABLE);         
        //TIM_ARRPreloadConfig(TIM2, ENABLE); //使能TIMx在ARR上的预装载寄存器
        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);
        TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
        TIM_Cmd(TIM2, ENABLE);  //使能TIM1

}
这样该还是不行
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-4-7 16:27:39 来自手机 | 显示全部楼层
duoduolong 发表于 2018-4-7 08:12
#include "pwm.h"
#include "led.h"
////////////////////////////////////////////////////////////// ...

重映射,remap什么的一个指令,记得开时钟
回复

使用道具 举报

13

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2018-4-6
在线时间
55 小时
 楼主| 发表于 2018-4-7 17:09:55 | 显示全部楼层
还是不行,#include "pwm.h"
#include "led.h"
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK Mini STM32开发板
//PWM  驱动代码                          
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2010/12/03
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////           


//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM1_PWM_Init(u16 arr,u16 psc)
{  
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  | RCC_APB2Periph_AFIO , ENABLE);  //使能GPIO外设时钟使能
        //RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);                                                                        

   //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //TIM_CH1
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

       
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
        TIM_TimeBaseStructure.TIM_Prescaler = psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OC4Init(TIM2, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

        TIM_CtrlPWMOutputs(TIM2,ENABLE);         
        TIM_ARRPreloadConfig(TIM2, ENABLE); //使能TIMx在ARR上的预装载寄存器
        TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);
        //TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
        TIM_Cmd(TIM2, ENABLE);  //使能TIM2

}


#include "led.h"
#include "delay.h"
#include "sys.h"
#include "pwm.h"
#include "usart.h"
int main()
{
        u16 led0pwmval = 0;
        u8 dir = 1;
        delay_init();
        LED_Init();
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
        uart_init(9600);         //串口初始化为9600
        TIM1_PWM_Init(899,0);
        while(1)
        {
               
                delay_ms(10);
                if(dir)
                {
                        led0pwmval++;
                }
                else
                {
                        led0pwmval--;
                }
                if(led0pwmval>100)
                {
                        dir = 0;
                }
                if(led0pwmval==0)
                {
                        dir = 1;
                }
                TIM_SetCompare1(TIM1,led0pwmval);
        }
}


回复

使用道具 举报

19

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2018-1-28
在线时间
30 小时
发表于 2018-4-11 13:16:04 | 显示全部楼层
孟亮 发表于 2018-4-6 20:49
这一章好好研究一下。。

像VET6芯片的那块板子  有8个LED灯  如果我都要做成PWM输出的效果  是不是要看8个IO口是否都有定时器通道   如果都有定时器通道就能设置  如果没有就设置不了  是这么回事吗
回复

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2018-4-26
在线时间
7 小时
发表于 2018-4-26 17:34:09 | 显示全部楼层
M3初学者 发表于 2018-4-11 13:16
像VET6芯片的那块板子  有8个LED灯  如果我都要做成PWM输出的效果  是不是要看8个IO口是否都有定时器通道 ...

如果你要达到这样的效果的话,应该是把你LED的io口复用到你的定时器的通道上,每个IO口都是可以复用的,只是说可能这个定时器没这么多通道,可能要多加一个定时器
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 17:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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