你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32MED1开发板例程解析(二):定时器的PWM输出

[复制链接]
Cody-2045860 发布时间:2013-10-15 15:40
 
本例程出自STM32MED1开发板附带光盘,其工程目录路径为:\Code Package\Peripheral Devices\06 TIM\0603_PWM_Output
 
高级定时器TIM1的通道1位于GPIOA.8引脚,此管脚正好与开发板上LED1相连,这样就可以通过观察LED1亮度变化来判断TIM1PWM输出波形变化情况。
通过调用函数TIM1_PWMOutputConfig()可对TIM1PWM输出进行配置。其代码定义如下:
 
void TIM1_PWMOutputConfig(u16 Period)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE);     // 1)
 
  // (2
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  // 2)
 
  // (3
  TIM_TimeBaseStructure.TIM_Period = Period;
  TIM_TimeBaseStructure.TIM_Prescaler = (u16)(SystemCoreClock / 100000) - 1;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  // 3)
 
  // (4
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_Pulse = 0;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  // 4)
 
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);       // 5)
 
  TIM_ClearFlag(TIM1, TIM_FLAG_Update);                       // 6)
  TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);                 // 7)
  TIM_UpdateRequestConfig(TIM1, TIM_UpdateSource_Global); // 8)
 
  // (9
  NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  // 9)
 
  TIM_CtrlPWMOutputs(TIM1, ENABLE);  // 10)
 
  TIM_Cmd(TIM1, ENABLE);  // 11)
}
 
代码行1)开启GPIOATIM1外设的时钟。代码段2)将PA.8管脚配置为复用推挽输出,因此TIM1产生的PWM信号能输出到PA.8管脚。代码段3)是对TIM1的时间基配置。代码段4)配置TIM1的输出比较通道1,将其配置为PWM模式2;起始寄存器TIM1_CCR1的值设为0;开启OC1的输出状态,关闭OC1的互补输出状态。代码行5)关闭OC1通道的预装载功能,使得每次向捕获/比较寄存器中写入的数据立即生效。代码行6)是清除TIM1的更新标志位。代码行7)是开启TIM1的更新中断,代码行8)将更新事件源限制为计时器的上溢或下溢。代码行9)是对TIM1的中断通道进行初始化。代码行10)是开启TIM1PWM输出。代码行11)是使能TIM1外设。
TIM1计数器的值达到最大时就会产生更新中断,其中断处理函数定义如下:
 
void TIM1_UP_IRQHandler(void)
{
  if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
  {

<span style="color: rgb(0, 0, 255);">    if ((CompareValue > PRELOAD_VALUE - INCREMENTS) || (CompareValue
收藏 评论1 发布时间:2013-10-15 15:40

举报

1个回答
沐紫 回答时间:2013-10-15 15:42:57

RE:STM32MED1开发板例程解析(二):定时器的PWM输出

多谢分享,看样子楼主有一个系列。建议把(一)的帖子地址也放在帖子中

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版