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

定时器能否用DMA方式控制任意GPIO输出PWM?

[复制链接]
any012 提问时间:2019-5-15 15:34 /
6ST金币
用定时器2的通道1的PWM功能,但不产生CH1的实际输出。而是在定时器2的更新回调函数和比较回调函数里分别置高/置低指定的GPIO引脚。
后来发现,有can接收中断时,输出的pwm波形有断续,造成外接的无源蜂鸣器响声断续。
想把定时器2的抢占中断优先级调到最高,但又担心影响can数据接收。

有没有办法通过DMA方式在任意GPIO引脚产生PWM波?

收藏 评论6 发布时间:2019-5-15 15:34

举报

6个回答
子曰好人 回答时间:2019-5-15 16:38:03
定时器输出PWM不会被中断打断才对,看你的描述你这个算是模拟的PWM,不是硬件PWM,再检查一下配置

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

any012 回答时间:2019-5-15 17:44:59
子曰好人 发表于 2019-5-15 16:38
定时器输出PWM不会被中断打断才对,看你的描述你这个算是模拟的PWM,不是硬件PWM,再检查一下配置 ...

如果把定时器的抢占优先级设成最高,那么can接收不会影响pwm输出。
但是,我想把can接收中断的优先级设成最高。
子曰好人 回答时间:2019-5-15 18:36:28
不是优先级的问题,通常PWM设置之后不会通过中断的方式来拉高拉低引脚电平,这些动作都是硬件自动完成的,方便的话把代码贴出来看看
edmundlee 回答时间:2019-5-15 18:54:22
可以的
any012 回答时间:2019-5-16 08:33:32
定时器初始化部分:

  1. void MX_TIM2_Init(void)
  2. {
  3.   TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  4.   TIM_MasterConfigTypeDef sMasterConfig = {0};
  5.   TIM_OC_InitTypeDef sConfigOC = {0};

  6.   htim2.Instance = TIM2;
  7.   htim2.Init.Prescaler = 79;
  8.   htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  9.   htim2.Init.Period = 500;
  10.   htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  11.   htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  12.   if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  13.   {
  14.     Error_Handler();
  15.   }
  16.   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  17.   if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  18.   {
  19.     Error_Handler();
  20.   }
  21.   if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
  22.   {
  23.     Error_Handler();
  24.   }
  25.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  26.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  27.   if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  28.   {
  29.     Error_Handler();
  30.   }
  31.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
  32.   sConfigOC.Pulse = 0;
  33.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  34.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  35.   if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  36.   {
  37.     Error_Handler();
  38.   }

  39. }
复制代码

回调函数部分:
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  2. {
  3.     static uint32_t tim2_count;
  4.     if (htim == &htim2)
  5.     {
  6.         tim2_count++;
  7.         HAL_GPIO_WritePin(BEEP_PORT, BEEP, GPIO_PIN_RESET);
  8.         htim2.Instance->CCR1 = plusValue;
  9.         if (plusValue < (PWM_TIME_PERIOD*7/10))
  10.                   plusValue++
  11. ...
  12. }

  13. void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
  14. {
  15.     if (htim == &htim2)
  16.         HAL_GPIO_WritePin(BEEP_PORT, BEEP, GPIO_PIN_SET);
  17. }
复制代码




byronsong 回答时间:2019-6-4 09:48:42

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版