打印
[STM32F7]

[STM32F767评测]PWM-OUT&IN

[复制链接]
2195|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 df_flying 于 2016-8-22 23:26 编辑

      作为ST的最新产品线,F7系列上市,不仅仅带来了性能的提升,也带来了价格的绝对优势,当然相比ATMEL的F7在主频上略有降低(前者能达到300M,后者目前只有216M),但相对F7的空间提升还是很大的。这次拿到的是ST针对144引脚封装推出的nucleo-144的STM32F767ZIT6U,大概也该比较熟悉了,这里就不给出图片了。nucleo-144的设计方便的给出了单片机的两个比较强大的接口USB和网口,其他的接口想要使用,也只能依靠杜邦线了。其实ST应该也可考虑下给出一个摄像头接口和TFT接口,最好也能给个SDRAM这样无论在可测试性和可玩性上,都会大大提高!
      好了在介绍PWM之前,首先给一个简单的GPIO翻转测试,因为看到F7的官方配置中引脚有个GPIO_SPEED_FREQ_VERY_HIGH定义,因为F4及之前的经常用到的多是GPIO_SPEED_HIGH。这里使用F7的216M和F4的180M运行一个简单的引脚翻转程序:GPIOX->ODR ^= GPIO_PIN_X,X前面为端口号,后者是引脚号,当然别忘了初始化程序配置。下载后,用示波器查看

测试看分别是13.2M和12.8M差别并不大,不知道这个是不是为后面扩展用的,期待...
      这次工程直接使用的是ST官方给的例程中的GPIO_IOToggle程序,这样也节省了开发时间,同时面对F7巨大的HAL库函数,每次打开手犯贱的点击下全编译,那卡的... 言归正传!首先调试一个PWM输出,这里设置10K50%占空比。1、在stm32f7xx_hal_conf.h中去掉#define HAL_TIM_MODULE_ENABLED 和#define HAL_DMA_MODULE_ENABLED的注释,同时在Drivers/STM32F7xx_HAL_Driver的GROUP中添加time和dma,这里没有用到dma但是time库中使用了dma,没办法... 2、配置程序如下,可以新建一个,也可以直接加在main.c中:
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
  GPIO_InitTypeDef   GPIO_InitStruct;
  /*##-1- Enable peripherals and GPIO Clocks #################################*/
  /* TIMx Peripheral clock enable */
  __TIM4_CLK_ENABLE();

  /* Enable all GPIO Channels Clock requested */
  __HAL_RCC_GPIOB_CLK_ENABLE();

  //TM4-CH1 PB6
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

  GPIO_InitStruct.Alternate = GPIO_AF2_TIM4;
  GPIO_InitStruct.Pin = GPIO_PIN_6;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

TIM_HandleTypeDef    Tim4Handle;
TIM_OC_InitTypeDef   Tim4Config;
void TIM_Config(void)
{

  Tim4Handle.Instance = TIM4;
  //TIME
  Tim4Handle.Init.Prescaler         = 5;//216/2/18000000-1  18M
  Tim4Handle.Init.Period            = (1800-1);//18000000/1800  = 10K
  Tim4Handle.Init.ClockDivision     = 0;
  Tim4Handle.Init.CounterMode       = TIM_COUNTERMODE_UP;
  Tim4Handle.Init.RepetitionCounter = 0;
  HAL_TIM_PWM_Init(&Tim4Handle) ;

  //PWM
  Tim4Config.OCMode       = TIM_OCMODE_PWM1;
  Tim4Config.OCPolarity   = TIM_OCPOLARITY_HIGH;
  Tim4Config.OCFastMode   = TIM_OCFAST_DISABLE;
  Tim4Config.OCNPolarity  = TIM_OCNPOLARITY_HIGH;
  Tim4Config.OCNIdleState = TIM_OCNIDLESTATE_RESET;

  Tim4Config.OCIdleState  = TIM_OCIDLESTATE_RESET;

  //
  Tim4Config.Pulse = 900;//50%
  HAL_TIM_PWM_ConfigChannel(&Tim4Handle, &Tim4Config, TIM_CHANNEL_1);
  //start
  HAL_TIM_PWM_Start(&Tim4Handle, TIM_CHANNEL_1);
}

3、在main函数系统初始化后添加TIM4_Config();  编译下载,可通过示波器查看PB6口,波形如下


其次写一个PWM-IN的程序,正好可以将上面的PWM作为输入。1、按照下图添加相应的函数库,因为这里需要最后打印,所以也将uart给加了进来,uart的例程在工程例程里就有,直接COPY过来就好了,这里就不详述了。
2、在stm32f7xx_it.c中添加下列代码,这里使用的是TIME3通道2作为输入,
extern TIM_HandleTypeDef    Tim3Handle;
void TIM3_IRQHandler(void)
{
  HAL_TIM_IRQHandler(&Tim3Handle);
}
3、在主函数中或者新建一个函数,添加如下代码,这里的串口函数已经加了进来。
TIM_HandleTypeDef        Tim3Handle;
TIM_IC_InitTypeDef       Tim3Config;
TIM_SlaveConfigTypeDef   Tim3SlaveConfig;
__IO uint32_t            IC2Value = 0;
__IO uint32_t            DutyCycle = 0;
__IO uint32_t            Frequency = 0;

void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{
  GPIO_InitTypeDef   GPIO_InitStruct;

  /*##-1- Enable peripherals and GPIO Clocks #################################*/
  /* TIMx Peripheral clock enable */
  __TIM3_CLK_ENABLE();

  /* Enable GPIO channels Clock */
  __GPIOB_CLK_ENABLE();

  /* Configure  (TIMx_Channel) in Alternate function, push-pull and High speed */
  GPIO_InitStruct.Pin = GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /*##-2- Configure the NVIC for TIMx #########################################*/
  HAL_NVIC_SetPriority(TIM3_IRQn, 0, 1);

  /* Enable the TIMx global Interrupt */
  HAL_NVIC_EnableIRQ(TIM3_IRQn);
}


void TIM3_Config(void)
{
Tim3Handle.Instance = TIM3;
  /* Initialize TIMx peripheral as follows:
       + Period = 0xFFFF
       + Prescaler = 0
       + ClockDivision = 0
       + Counter direction = Up
  */
  Tim3Handle.Init.Period            = 0xFFFF;//ÉèΪ×î´óÖµ
  Tim3Handle.Init.Prescaler         = 0;
  Tim3Handle.Init.ClockDivision     = 0;
  Tim3Handle.Init.CounterMode       = TIM_COUNTERMODE_UP;
  Tim3Handle.Init.RepetitionCounter = 0;
  HAL_TIM_IC_Init(&Tim3Handle);

  Tim3Config.ICPrescaler = TIM_ICPSC_DIV1;
  Tim3Config.ICFilter = 0;       
  Tim3Config.ICPolarity = TIM_ICPOLARITY_FALLING;
  Tim3Config.ICSelection = TIM_ICSELECTION_INDIRECTTI;       
        HAL_TIM_IC_ConfigChannel(&Tim3Handle, &Tim3Config, TIM_CHANNEL_1);
       
        Tim3Config.ICPolarity = TIM_ICPOLARITY_RISING;
  Tim3Config.ICSelection = TIM_ICSELECTION_DIRECTTI;
        HAL_TIM_IC_ConfigChannel(&Tim3Handle, &Tim3Config, TIM_CHANNEL_2);
       
  Tim3SlaveConfig.SlaveMode        = TIM_SLAVEMODE_RESET;
  Tim3SlaveConfig.InputTrigger     = TIM_TS_TI2FP2;
  Tim3SlaveConfig.TriggerPolarity  = TIM_TRIGGERPOLARITY_NONINVERTED;
  Tim3SlaveConfig.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1;
  Tim3SlaveConfig.TriggerFilter    = 0;       
        HAL_TIM_SlaveConfigSynchronization(&Tim3Handle, &Tim3SlaveConfig);
       
        HAL_TIM_IC_Start_IT(&Tim3Handle, TIM_CHANNEL_2);
       
        HAL_TIM_IC_Start_IT(&Tim3Handle, TIM_CHANNEL_1);
       
}


void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
  {
    //µÃµ½ÊäÈëÖµ
    IC2Value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);

    if (IC2Value != 0)
    {
      //¼ÆËãÕ¼¿Õ±È
      DutyCycle = ((HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1)) * 100) / IC2Value;


      //ÖÜÆÚ
      Frequency = (HAL_RCC_GetHCLKFreq()/ 2)  / IC2Value;
                        printf("DutyCycle=%d,Frequency=%d\t\r",DutyCycle,Frequency);
    }
    else
    {
      DutyCycle = 0;
      Frequency = 0;
    }
  }
}
好了,在main函数系统初始化后添加TIM3_Config();编译下载到开发板,将开发板的PB6和PB5用杜邦线相连,通过串口可以看到如下图所示:这里因为使用的事uint型,所以显示的占空比只有49%,而频率为10001,实为10K。


到此为止,本次测试完成了。最后给一个整体工程!那是不可能的... 不过给压缩文件,放到如下位置解压,即可编译通过!
E:\****\STM32Cube_FW_F7_V1.4.0\Projects\STM32F767ZI-Nucleo\Examples\GPIO

PWM-IN-OUT.zip

64.92 KB

沙发
szs2016| | 2016-8-23 12:44 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:宠辱不惊,闲看庭前花开花落;来去无意,漫随天际云卷云舒。

9

主题

1109

帖子

1

粉丝