OpenEdv-开源电子网

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

[战舰F103] 战舰V3&精英TIM2部分重映射1(PA15,PB3,PA2,PA3)+TIM2部分重映射2(PA0,PA1,PB10,PB11)测试程序

[复制链接]

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10565
金钱
10565
注册时间
2017-2-18
在线时间
1913 小时
发表于 2019-2-16 17:02:36 | 显示全部楼层 |阅读模式
本帖最后由 peng1554 于 2019-2-16 17:08 编辑

有用户想使用精英板子的PB3使用部分重映射为TIM2_CH2来做PWM输出不正常,所以改了这个程序
http://www.openedv.com/forum.php ... 21&page=1#pid928949
两程序实现的是PA15,PB3,PA2,PA3和PA0,PA1,PB10,PB11的不同占空比的PWM输出,对应的关系为
部分重映射1:
        PA15-------------->CH1
        PB3--------------->CH2
        PA2--------------->CH3
        PA3--------------->CH4

部分重映射2:
        PA0---------------->CH1
        PA1---------------->CH2
        PB10-------------->CH3
        PB11-------------->CH4


查手册知道,TIM2的部分重映射分为两种:部分重映射1和部分重映射2,用户的要求使用部分重映射1
部分重映射.JPG
所以讲述一下部分重映射1的用法,部分重映射2的用法与之类似

因为PB3被JTAG相关端口占用,所以需要调用GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);来关闭JTAG,使能SWD
因为是部分重映射,所以需要使用AFIO,所以要使能AFIO时钟,接着再去初始化PA15,PB3,PA2,PA3,具体如下:
[mw_shl_code=c,true]//TIM2 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM2_PWM_Init(u16 arr,u16 psc)
{  
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        //使能定时器2时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);        //关闭jtag 开启sw
        GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);         //Timer2部分重映射1   

    //设置该引脚为复用输出功能,输出TIMx_CHx的PWM脉冲波形
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//TIMx_CHx
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
               
        //设置该引脚为复用输出功能,输出TIMx_CHx的PWM脉冲波形
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_15; //TIMx_CHx
        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;                                                 //设置在下一个更新事件装入活动的自动重装载寄存器周期的值       
        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_OC2Init(TIM2, &TIM_OCInitStructure);        //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
        TIM_OC3Init(TIM2, &TIM_OCInitStructure);        //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
        TIM_OC4Init(TIM2, &TIM_OCInitStructure);        //根据TIM_OCInitStruct中指定的参数初始化外设TIMx       
               
        TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
        TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
        TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
        TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
       
        TIM_CtrlPWMOutputs(TIM2,ENABLE);        //MOE 主输出使能       
        TIM_ARRPreloadConfig(TIM2, ENABLE); //使能TIMx在ARR上的预装载寄存器
        TIM_Cmd(TIM2, ENABLE);                          //使能TIMx
}[/mw_shl_code]
main函数如下[mw_shl_code=c,true] int main(void)
{               
        delay_init();                            //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                         //串口初始化为115200
        LED_Init();                                     //LED端口初始化
        TIM2_PWM_Init(899,0);                 //不分频。PWM频率=72000000/900=80Khz
        TIM_SetCompare1(TIM2,800);        //设置CH1占空比
        TIM_SetCompare2(TIM2,700);        //设置CH2占空比
        TIM_SetCompare3(TIM2,400);        //设置CH3占空比
        TIM_SetCompare4(TIM2,100);        //设置CH4占空比                  
}
[/mw_shl_code]
















战舰V3&精英TIM2部分重映射1(PA15,PB3,PA2,PA3)测试程序.rar

2.31 MB, 下载次数: 84

战舰V3&精英TIM2部分重映射2(PA0,PA1,PB10,PB11)测试程序.rar

2.31 MB, 下载次数: 50

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
286
金钱
286
注册时间
2018-12-31
在线时间
12 小时
发表于 2019-2-17 11:02:47 | 显示全部楼层
回复 支持 反对

使用道具 举报

13

主题

633

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1331
金钱
1331
注册时间
2016-8-1
在线时间
229 小时
发表于 2019-2-20 16:53:15 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

51

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
561
金钱
561
注册时间
2011-4-11
在线时间
43 小时
发表于 2019-10-17 08:09:06 | 显示全部楼层
这样设置,我的还是会出现JTAG也一同禁止的情况。
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-10-29
在线时间
13 小时
发表于 2021-3-31 16:18:34 | 显示全部楼层



        TIM_CtrlPWMOutputs(TIM2,ENABLE);        //MOE 主输出使能      
        TIM_ARRPreloadConfig(TIM2, ENABLE); //使能TIMx在ARR上的预装载寄存器

这两句为啥要加呀,我看的例程里面没有的,是起啥作用
[img][/img]
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2021-5-26
在线时间
1 小时
发表于 2021-6-4 13:58:22 | 显示全部楼层

高级定时器需要加这两条语句才能使用,我也只知道这个
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-5 10:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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