OpenEdv-开源电子网

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

求教:TIM3部分重映射,PB5(CH2)可以输出PWM,PB0(CH3)无PWM输出

[复制链接]

2

主题

5

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2020-11-11
在线时间
1 小时
发表于 2021-10-13 12:53:45 | 显示全部楼层 |阅读模式
2金钱
///////////////////////////////////////////////////////////
//°′¼üÇD»»Õ¼¿Õ±è
///////////////////////////////////////////////////////////
#include <stm32f10x.h>

#define KEY1        GPIO_Pin_0
#define KEY2        GPIO_Pin_13

#define KEY1_STATUS  GPIO_ReadInputDataBit(GPIOA,KEY1)//&#182;áè&#161;°′&#188;ü1
#define KEY2_STATUS  GPIO_ReadInputDataBit(GPIOC,KEY2)//&#182;áè&#161;°′&#188;ü2

////////////////////////////////////////////////////////////////////////
//í¨ó&#195;&#209;óê±oˉêy
////////////////////////////////////////////////////////////////////////
#define TIME_MS 12000                        //@72M

//3¤&#209;óê±oˉêy
void Delay_ms(unsigned int n)
{
        unsigned int i,j;
       
        for(i=n;i>0;i--)
                for(j=TIME_MS;j>0;j--);
}

//&#197;&#228;&#214;&#195;KEY&#182;&#212;ó|&#182;&#203;&#191;ú
void KEY_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE );
       
        GPIO_InitStructure.GPIO_Pin = KEY1;//KEY1(PA.0)
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
         
        GPIO_InitStructure.GPIO_Pin = KEY2;//KEY2(PC.13)
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
}

//&#197;&#228;&#214;&#195;í¨ó&#195;&#182;¨ê±&#198;÷TIM3£&#172;ó&#195;óúPWMμ÷&#203;ù
void TIM3_PWMInit(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO
                                                            |RCC_APB2Periph_GPIOB, ENABLE);                        

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                                //PB0(LED_R′úì&#230;·&#231;éè)&#184;′ó&#195;&#206;aTIM3_CH2
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;                                        //&#184;′ó&#195;&#191;a&#194;&#169;ê&#228;3&#246;&#196;£ê&#189;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                                //PB1(LED_G)&#206;aTIM3_CH3
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                        //&#184;′ó&#195;í&#198;íìê&#228;3&#246;&#196;£ê&#189;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        TIM_TimeBaseStructure.TIM_Prescaler =1 ;                                                //&#212;¤·&#214;&#198;μ&#214;μ1+1=2£&#172;ê&#228;è&#235;&#188;&#198;êy&#198;÷36MHz
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;        //&#214;D&#209;&#235;&#182;&#212;&#198;&#235;&#196;£ê&#189;
        TIM_TimeBaseStructure.TIM_Period =35999;                                                //&#214;ü&#198;ú35999+1=36000£&#172WM&#198;μ&#194;ê500Hz                      
        TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;                                        //ê±&#214;ó·&#214;&#198;μòò×ó

        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);               
       
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);                                ////TIM32&#191;·&#214;&#214;&#216;ó3é&#228;

        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                //PWM&#196;£ê&#189;1£o&#214;D&#209;&#235;&#182;&#212;&#198;&#235;&#196;£ê&#189; &#212;ú&#207;òé&#207;&#188;&#198;êyê±&#214;D&#182;&#207;±ê&#214;&#190;&#214;&#195;&#206;&#187;£&#172;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                //&#213;y&#207;òê&#228;3&#246;&#188;&#171;D&#212;  &#184;&#223;μ&#231;&#198;&#189;óDD§
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        //&#213;y&#207;òê&#228;3&#246;&#212;êDí
        TIM_OCInitStructure.TIM_Pulse = 999;                                                        //è·&#182;¨&#213;&#188;&#191;&#213;±è£&#172;&#213;a&#184;&#246;&#214;μ&#190;&#246;&#182;¨á&#203;óDD§μ&#231;&#198;&#189;μ&#196;ê±&#188;&#228;

        TIM_OC2Init(TIM3, &TIM_OCInitStructure);                                                //ê&#228;3&#246;í¨μà2&#197;&#228;&#214;&#195;oˉêy
        TIM_OC3Init(TIM3, &TIM_OCInitStructure);                                                //ê&#228;3&#246;í¨μà3&#197;&#228;&#214;&#195;oˉêy
       
        TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);                                //ê1&#196;ü&#212;¤×°&#212;&#216;&#188;&#196;′&#230;&#198;÷
        TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);                                //ê1&#196;ü&#212;¤×°&#212;&#216;&#188;&#196;′&#230;&#198;÷

        TIM_Cmd(TIM3,ENABLE);                                                                                        //&#198;&#244;&#182;ˉTIM3
}

/* °′&#188;ü′|àíoˉêy
·μ&#187;&#216;°′&#188;ü&#214;μ
0£&#172;&#195;&#187;óDè&#206;o&#206;°′&#188;ü°′&#207;&#194;
1£&#172;KEY1°′&#207;&#194;
2£&#172;KEY2°′&#207;&#194;
×¢òa′&#203;oˉêyóD&#207;ìó|ó&#197;&#207;è&#188;&#182;,KEY1>KEY2!! */
u8 KEY_Scan()
{         
        if(KEY1_STATUS==0        || KEY2_STATUS==0)                //&#188;ì2a°′&#188;üê&#199;·&#241;°′&#207;&#194;
        {
                Delay_ms(100);                                                                                //·à&#182;&#182;&#209;óê±

                if(KEY1_STATUS==1)                //&#188;ì2aKEY1ê&#199;·&#241;°′&#207;&#194;
                        return 1;
               
                else if(KEY2_STATUS==1)        //&#188;ì2aKEY2ê&#199;·&#241;°′&#207;&#194;
                        return 2;
        }
        return 0;                                                                                                //&#206;T°′&#188;ü°′&#207;&#194;
}

//&#197;&#228;&#214;&#195;&#203;ùóDíaéè
void Init_All_Periph(void)
{
        SystemInit();

        KEY_Configuration();
        TIM3_PWMInit();
}

//&#214;÷oˉêy
int main(void)
{
        u16 width[3]={25000,35000};
        u16 i=0,pwm=width[0];
       
        Init_All_Periph();       

        while(1)
        {
                i=KEY_Scan();
                if(i!=0)
                {
                        pwm=width[i-1];
                        TIM_SetCompare1(TIM3, pwm);
                        TIM_SetCompare2(TIM3, pwm);
          }       
        }
}


最佳答案

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

不是CH3吗,你的主函数while没有使用ch3吧
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3627
金钱
3627
注册时间
2019-8-14
在线时间
1054 小时
发表于 2021-10-13 12:53:46 | 显示全部楼层
不是CH3吗,你的主函数while没有使用ch3吧
回复

使用道具 举报

11

主题

2148

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4911
金钱
4911
注册时间
2015-1-10
在线时间
615 小时
发表于 2021-10-13 15:44:02 | 显示全部楼层
两个GPIO为啥一个复用开漏一个复用推挽?
回复

使用道具 举报

4

主题

912

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2019-9-4
在线时间
916 小时
发表于 2021-10-13 15:49:19 | 显示全部楼层
复用开漏的话,需要有外围电路上拉吧
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2020-11-11
在线时间
1 小时
 楼主| 发表于 2021-10-14 11:19:56 | 显示全部楼层
阿侑kevin 发表于 2021-10-13 15:44
两个GPIO为啥一个复用开漏一个复用推挽?

PB5为控制电动机的PWM,状态正常,PB0为控制LED的PWM,无输出。
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2020-11-11
在线时间
1 小时
 楼主| 发表于 2021-10-14 11:23:12 | 显示全部楼层
A571157242 发表于 2021-10-13 15:49
复用开漏的话,需要有外围电路上拉吧

开漏为CH2状态正常,现在主要是CH3/CH4无输出
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2020-11-11
在线时间
1 小时
 楼主| 发表于 2021-10-14 11:28:14 | 显示全部楼层
谢谢各位帮助,找到原因了是TIM_SetCompare1(TIM3,pwm)应为TIM_SetCompare3(TIM3,pwm)
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 22:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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