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

定时器能否用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. }
复制代码




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

所属标签

相似问题

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