OpenEdv-开源电子网

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

TIM1_CH1从PA8重映射到PE9输出PWM---程序分享(库函数和寄存器版)

[复制链接]

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2013-1-3 14:47:51 | 显示全部楼层 |阅读模式
由于板子布局等问题,有时需要对一些引脚重映射,现分享一个TIM1_CH1从PA8重映射到PE9输出PWM的程序,希望对大家有所帮助。
注:不知什么原因,重映射后,软件仿真不出来,需要示波器测试。

(1)库函数版:
//arr:自动重装值
//psc:时钟预分频数
void TIM1_CH1_PWM_RmapInit(u16 arr,u16 psc)
{  
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;

TIM_DeInit(TIM1);//初始化TIM1寄存器
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOE  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE); //Timer1完全重映射  TIM1_CH1->E9    
 
       //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形 GPIOE.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //TIM1_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIO
 
       //初始化TIM1
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_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//初始化TIM1 Channel1 PWM模式  
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OCInitStructure.TIM_Pulse = arr/2;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 OC1

TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能TIM1在CCR1上的预装载寄存器
  TIM_ARRPreloadConfig(TIM1, ENABLE);                //使能TIMx在ARR上的预装载寄存器
TIM_Cmd(TIM1, ENABLE);  //使能TIM1
TIM_CtrlPWMOutputs(TIM1, ENABLE);//设置PMW主输出

}


(2)寄存器版:
//arr:自动重装值
//psc:时钟预分频数
void TIM1_CH1_PWM_RmapInit(u16 arr,u16 psc)
{  
RCC->APB2ENR|=1<<11;       //TIM1时钟使能  
RCC->APB2ENR|=1<<0;        //使能AFIO时钟
RCC->APB2ENR|=1<<6;        //使能PORTE口时钟
GPIOE->CRH&=0XFFFFFF0F;//PE9输出
GPIOE->CRH|=0X000000B0;//复用功能输出  
GPIOE->ODR|=1<<9;//PE9上拉
AFIO->MAPR|=3<<6;//Timer1完全重映射  TIM1_CH1->E9
TIM1->ARR=arr;//设定计数器自动重装值 
TIM1->SC=psc;//预分频器不分频
TIM1->CCR1=arr/2; //占空比为50%
TIM1->CCMR1|=7<<4;  //CH1 PWM2模式  
TIM1->CCMR1|=1<<3; //CH1预装载使能   
      
TIM1->BDTR=0X8000;  //设置PMW主输出

TIM1->CR1 |= 0x0080;    //ARPE使能 
TIM1->CR1 |= 0x0001;    //使能定时器1 
TIM1->CCER |= 1<<0;  //OC1 输出使能  
永远保持一颗学习的心态。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-1-3 15:06:29 | 显示全部楼层
回复 支持 反对

使用道具 举报

7

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2013-5-27
在线时间
5 小时
发表于 2013-5-31 21:31:07 | 显示全部楼层
回复【楼主位】科科1987:
---------------------------------
我用你的库函数实现了,但是为什么寄存器不行呢,我没用重映射部分
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
 楼主| 发表于 2013-5-31 22:33:02 | 显示全部楼层
回复【3楼】冯丑丑爱睡觉:

回复【楼主位】科科1987:
---------------------------------
我用你的库函数实现了,但是为什么寄存器不行呢,我没用重映射部分

---------------------------------
你是用仿真测试,还是用示波器?
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

7

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2013-5-27
在线时间
5 小时
发表于 2013-6-1 08:48:12 | 显示全部楼层
回复【4楼】科科1987:
---------------------------------
示波器,没用重映射,直接看的PA8
回复 支持 反对

使用道具 举报

7

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2013-5-27
在线时间
5 小时
发表于 2013-6-1 09:41:45 | 显示全部楼层
回复【4楼】科科1987:
---------------------------------
找到原因了,谢谢你
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
 楼主| 发表于 2013-6-10 19:51:49 | 显示全部楼层
回复【6楼】冯丑丑爱睡觉:

回复【4楼】科科1987:
---------------------------------
找到原因了,谢谢你

---------------------------------
什么原因,说一下呗,呵呵
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

10

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2012-12-27
在线时间
0 小时
发表于 2013-7-13 19:39:12 | 显示全部楼层
回复【6楼】冯丑丑爱睡觉:
回复【4楼】科科1987: --------------------------------- 找到原因了,谢谢你
---------------------------------
同问什么原因?
回复 支持 反对

使用道具 举报

12

主题

432

帖子

0

精华

高级会员

Rank: 4

积分
729
金钱
729
注册时间
2012-6-21
在线时间
59 小时
发表于 2013-7-17 13:50:02 | 显示全部楼层
同问啥原因?
呵呵。
回复 支持 反对

使用道具 举报

6

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-4
在线时间
13 小时
发表于 2014-1-22 22:22:30 | 显示全部楼层
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOE  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE); //Timer1完全重映射  使能所有管脚重映射与 tim1有关的引脚都被 连接到tim1  初始化gpio后设置为afpp模式 即正常使用 ,前提是 tim1配置正常


tim1重映射的关键语句
回复 支持 反对

使用道具 举报

5

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2011-7-17
在线时间
4 小时
发表于 2014-2-23 12:11:54 | 显示全部楼层
谢谢分享,继续完善。顶起!
回复 支持 反对

使用道具 举报

33

主题

150

帖子

0

精华

高级会员

Rank: 4

积分
506
金钱
506
注册时间
2014-1-24
在线时间
102 小时
发表于 2014-4-28 21:30:02 | 显示全部楼层
回复【楼主位】科科1987:
---------------------------------
多谢分享,另外说哈原因,TIM1是接在APB2上的,移植原子哥的TIM3的程序时别忘了将RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);改为RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
就一个数字浪费一天时间好痛苦。
回复 支持 反对

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
发表于 2014-6-13 16:00:52 | 显示全部楼层
又是这个大小萝卜,支持楼主,一上这网就看到萝卜的,厉害
回复 支持 反对

使用道具 举报

1

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2014-7-5
在线时间
43 小时
发表于 2014-7-23 19:04:20 | 显示全部楼层
谢谢LZ的分享!!!
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2014-7-20
在线时间
2 小时
发表于 2014-8-16 16:09:25 | 显示全部楼层
谢谢分享,看帖回复是种美德
IT菜鸟逆袭记~~~~
回复 支持 反对

使用道具 举报

5

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2014-9-1
在线时间
0 小时
发表于 2014-9-18 14:42:07 | 显示全部楼层
你用的什么片子,怎么GPIO_PinRemapConfig  函数我的库里面找不到呢,还有几个寄存器操作的RCC  我的也没有,我是操作STM8S207的,  现在在测试 IO口复选功能呢,还没有搞定,为什么我这里例题为蜂鸣器的时候是OK的,我映射成 A3  D2 的第二功能输出PWM时,不对呢,是否配置问题?麻烦有时间回复一下,谢谢
/********通用IO备用功能选用**************/
void Set_Secend_fun_OptionByte(void)
{
  uint16_t Secend_fun_Option_status;
  Secend_fun_Option_status=FLASH_ReadOptionByte(Secend_fun_OptionAdd);    //Secend_fun_OptionAdd=0x4803
  if(!(Secend_fun_Option_status&0x0200))      //OPT2:AFR7......AFR0  A3第二功能:TIM3_CH1   D2第二功能:TIM2_CH3
  {
     //写入数据时低位在前  在当前地址 写入0x80
    FLASH_ProgramOptionByte(Secend_fun_OptionAdd,(uint8_t)((Secend_fun_Option_status|0x0200)>>8));  
  }
}
谦虚使人退步,短暂的激情是不值钱的,持久的激情才是赚钱的!持续改善LED电子技术研发!
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
 楼主| 发表于 2014-9-18 16:08:00 | 显示全部楼层
回复【16楼】snailled:
---------------------------------
f103RB
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

9

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-10-28
在线时间
26 小时
发表于 2014-12-23 16:36:56 | 显示全部楼层


TIM_OC1FastConfig(TIM1, TIM_OCFast_Enable);
为什么X可以为1?
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
 楼主| 发表于 2014-12-23 18:53:55 | 显示全部楼层
回复【18楼】光域20141028:
---------------------------------
void TIM_OC1FastConfig  ( TIM_TypeDef *  TIMx,  
  uint16_t  TIM_OCFast  
 )   

Configures the TIMx Output Compare 1 Fast feature. 

参数:
TIMx,: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral.  
TIM_OCFast,: new state of the Output Compare Fast Enable Bit. This parameter can be one of the following values: 

TIM_OCFast_Enable: TIM output compare fast enable 
TIM_OCFast_Disable: TIM output compare fast disable 
 

返回值:
None  

在文件stm32f10x_tim.c第1606行定义。

参考 TIM_TypeDef::CCMR1、IS_TIM_LIST8_PERIPH、IS_TIM_OCFAST_STATE及TIM_CCMR1_OC1FE.

{
  uint16_t tmpccmr1 = 0;
  /* Check the parameters */
  assert_param(IS_TIM_LIST8_PERIPH(TIMx));
  assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast));
  /* Get the TIMx CCMR1 register value */
  tmpccmr1 = TIMx->CCMR1;
  /* Reset the OC1FE Bit */
  tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1FE);
  /* Enable or Disable the Output Compare Fast Bit */
  tmpccmr1 |= TIM_OCFast;
  /* Write to TIMx CCMR1 */
  TIMx->CCMR1 = tmpccmr1;
}
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-5-12
在线时间
0 小时
发表于 2015-5-14 20:55:19 | 显示全部楼层
TIM_CtrlPWMOutputs();请问这个函数在哪里?为什么库函数查不出来
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
 楼主| 发表于 2015-5-15 13:18:03 | 显示全部楼层
回复【20楼】xiaoyuge:
---------------------------------
在文件stm32f10x_tim.c里
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

17

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2014-4-12
在线时间
0 小时
发表于 2015-7-18 16:13:26 | 显示全部楼层
回复【4楼】科科1987:
---------------------------------
GPIOE->ODR|=1<<9;//PE9上拉
这句不加上也行吧。我看你的库函数里没有这个功能的语句。
规格严格,功夫到家
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
 楼主| 发表于 2015-7-19 09:32:32 | 显示全部楼层
回复【22楼】FMX_2011:
---------------------------------
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

17

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2014-4-12
在线时间
0 小时
发表于 2015-7-19 20:12:48 | 显示全部楼层
回复【23楼】科科1987:
---------------------------------
特别用板子试了下。我发现以前的例程里也是这么写。
规格严格,功夫到家
回复 支持 反对

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2015-7-22
在线时间
5 小时
发表于 2015-7-22 20:11:48 | 显示全部楼层
谢谢分享,继续完善。顶起!
学海无涯!沧海一粟!
回复 支持 反对

使用道具 举报

3

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2016-6-2
在线时间
34 小时
发表于 2016-10-12 11:30:09 | 显示全部楼层
寄存器版本没输出
回复 支持 反对

使用道具 举报

3

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2016-6-2
在线时间
34 小时
发表于 2016-10-12 11:30:33 | 显示全部楼层

寄存器版本没输出
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
 楼主| 发表于 2016-10-12 12:41:58 | 显示全部楼层
dsadsa 发表于 2016-10-12 11:30
寄存器版本没输出

仿真看一下
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

3

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2016-6-2
在线时间
34 小时
发表于 2016-10-12 19:33:01 | 显示全部楼层

仿真了,示波器也看了就是没有
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
 楼主| 发表于 2016-10-13 07:34:34 | 显示全部楼层
dsadsa 发表于 2016-10-12 19:33
仿真了,示波器也看了就是没有

硬件调试仿真看一下寄存器的配置
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

17

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2016-6-13
在线时间
65 小时
发表于 2016-10-13 10:03:49 | 显示全部楼层

谢谢LZ的分享!!!
回复 支持 反对

使用道具 举报

5

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1844
金钱
1844
注册时间
2019-7-23
在线时间
286 小时
发表于 2019-8-3 13:43:53 | 显示全部楼层
多谢分享
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 06:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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