本帖最后由 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
|