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

stm32f7脈波控制

[复制链接]
nickyliu6 提问时间:2018-2-7 09:56 /
各位先進好,目前在學習stm32f7,自從stm出了HAL庫後,許多網上的範例已經無法使用,想將下面的程式改為stm32f7可以使用的版本,請問該如何修改??


int main()
{         
        TIM_OPMGATE_Init();
        while(1)
        {        
                Motor_Control(500,10); //500us,10个脉冲
        }
}

void TIM_OPMGATE_Init()
{        
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
        TIM_OCInitTypeDef TIM_OCInitStruct;
        GPIO_InitTypeDef  GPIO_InitStruct;
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);//使能PC,PA端口时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3,ENABLE);//使能定时器23的时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能复用IO时钟        
        GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);        
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;                        
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStruct);        
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
        GPIO_Init(GPIOC,&GPIO_InitStruct);
        
       //TIM2工作在单脉冲下
        TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
        TIM_TimeBaseInitStruct.TIM_Prescaler = 7199;//预分频值,每100us计数一次
        TIM_TimeBaseInitStruct.TIM_Period = 99; //重装值,决定单脉冲周期
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);        
        
        TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Single);//设置TIM2在单脉冲模式,且是单一的脉冲,在下一个更新事件停止         
        TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_OC1Ref); //OC1REF signal is used as the trigger output (TRGO).单一模式不需要设置
        
        TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);//使能定时器2的通道1预装载寄存器
        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;//在向上计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平
        TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//OC1输出使能
        TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//有效电平为高
        TIM_OCInitStruct.TIM_Pulse = 20;//比较捕获1的预装载值,决定单脉冲占空比,这个20就是低电平延续的来源
        TIM_OC1Init(TIM2,&TIM_OCInitStruct);               
        TIM_Cmd(TIM2,DISABLE); //Enable the TIM Counter
        
        //TIM3工作在从模式门控模式下
        TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
        TIM_TimeBaseInitStruct.TIM_Prescaler = 719;//预分频值,10us计数一次
        TIM_TimeBaseInitStruct.TIM_Period = 29;//重装值,决定PWM周期
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
        
        TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Gated);//TIM3为门控模式        
        TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable);//使能TIM3的主从模式        
        TIM_SelectInputTrigger(TIM3,TIM_TS_ITR1);//内部触发,TIM_TS_ITR1对应TIM2

        TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能定时器3的通道1预装载寄存器
        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;//在向上计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平
        TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//OC1输出使能
        TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//有效电平为高
        TIM_OCInitStruct.TIM_Pulse = 15;//比较捕获1的预装载值,占空比为50%
        TIM_OC1Init(TIM3,&TIM_OCInitStruct);
        TIM_Cmd(TIM3,ENABLE);//使能TIM3
}


收藏 评论14 发布时间:2018-2-7 09:56

举报

14个回答
努力的人 回答时间:2018-2-7 10:09:00
标准库与HAL库不一样,只有重写,或者使用CUBE来生成工程,不知道你用F7的哪一个型号,正点原子有HAL库的教程,你可以看一下

评分

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

查看全部评分

wenyangzeng 回答时间:2018-2-7 11:47:50
本帖最后由 wenyangzeng 于 2018-2-7 11:49 编辑

F7不支持标准库,只能有HAL库,除非楼主把所有操作直接用修改寄存器方式。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

nickyliu6 回答时间:2018-2-7 14:08:23
努力的人 发表于 2018-2-7 10:09
标准库与HAL库不一样,只有重写,或者使用CUBE来生成工程,不知道你用F7的哪一个型号,正点原子有HAL库的教 ...

我使用的是f767 ZI的開發板正點原子的範例我有看過,但像单脉冲模式的部份函式設定,由於沒有做太多介紹所以還不太知道怎麼用
废鱼 回答时间:2018-2-7 14:58:52
定时器配置好移植,两个参数定义名字差不多。主要是Motor_Control这里的操作。我没有用过motor的驱动,楼主可以试着改一下。有问题大家一起讨论。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

nickyliu6 回答时间:2018-2-7 15:14:30
安 发表于 2018-2-7 14:58
定时器配置好移植,两个参数定义名字差不多。主要是Motor_Control这里的操作。我没有用过motor的驱动,楼主 ...

目前我有大概改了一下,還有些找不到對應的函數,我有紅色標示,還請網上的高人指點

void TIM_OPMGATE_Init(void)
{       
        TIM_HandleTypeDef TIM2_Handler;         //
  TIM_OC_InitTypeDef TIM2_CH1Handler;
        GPIO_InitTypeDef  GPIO_InitStruct;

        __HAL_RCC_GPIOA_CLK_ENABLE();
        __HAL_RCC_GPIOC_CLK_ENABLE();
        __HAL_RCC_TIM2_CLK_ENABLE();
        __HAL_RCC_TIM3_CLK_ENABLE();
        __HAL_RCC_AFIO_CLK_ENABLE();
       

        GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE;       

        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //¼Ò¦¡³]¸m
        GPIO_InitStruct.Pin = GPIO_PIN_0;                        //«ü©wIO¤f
        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;  //³t«×³]¸mhigh¥i½Õ¾ã
        GPIO_Init(GPIOA,&GPIO_InitStruct);       
        GPIO_InitStruct.Pin = GPIO_PIN_6;
        GPIO_Init(GPIOC,&GPIO_InitStruct);  


        //TIM2
       
        TIM2_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;
        TIM2_Handler.Init.Prescaler = 7199;                               
        TIM2_Handler.Init.Period= 99;                                        
        HAL_TIM_PWM_Init(&TIM2_Handler);



        TIM_SelectOnePulseMode(TIM2,TIM_OPMODE_SINGLE);                 
        TIM_SelectOutputTrigger(TIM2,TIM_TRGO_OC1REF);

        //TIM2
        TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);       
        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;               
        TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;       
        TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;       
        TIM_OCInitStruct.TIM_Pulse = 20;       
        TIM_OC1Init(TIM2,&TIM_OCInitStruct);               
        TIM_Cmd(TIM2,DISABLE); //Disable the TIM Counter

  
        //TIM3
        TIM3_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;
        TIM3_Handler.Init.Prescaler = 719;
        TIM3_Handler.Init.Period = 29;       
        HAL_TIM_PWM_Init(&TIM3_Handler);
       

        TIM_SelectSlaveMode(TIM3, TIM_SLAVEMODE_GATED);
        TIM_SelectMasterSlaveMode(TIM3,TIM_MASTERSLAVEMODE_ENABLE);
        TIM_SelectInputTrigger(TIM3,TIM_TS_ITR1);
        TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;
        TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OCInitStruct.TIM_Pulse = 15;
        TIM_OC1Init(TIM3,&TIM_OCInitStruct);
        TIM_Cmd(TIM3,ENABLE);

}
废鱼 回答时间:2018-2-7 15:23:46
楼主看一下HAL_TIM_OC_ConfigChannel这个函数,如果不会用了,在下面类似的路径下有对应oc的例程,我对motor这些不是很熟悉,不确定要用哪个oc功能。
C:\Users\user\STM32Cube\Repository\STM32Cube_FW_F4_V1.16.0\Projects\STM324xG_EVAL\Examples\TIM
Tcreat 回答时间:2018-2-7 17:58:59
对于红色部分 楼主可以根据标准库对这些函数的注解先弄明白标准库下程序要做什么  然后再通过HAL库的相关函数的注解 来选择相关的配置函数  

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

努力的人 回答时间:2018-2-7 20:26:33
nickyliu6 发表于 2018-2-7 14:08
我使用的是f767 ZI的開發板正點原子的範例我有看過,但像单脉冲模式的部份函式設定,由於沒有做太多介紹 ...

输出PWM,原子哥有例程的,互补PWM的火哥有
xuanyuan1993 回答时间:2018-2-7 22:09:22
厉害死厉害,学习了

评分

参与人数 1ST金币 -1 收起 理由
zero99 -1 问题帖严禁灌水

查看全部评分

nickyliu6 回答时间:2018-2-8 14:24:57
努力的人 发表于 2018-2-7 20:26
输出PWM,原子哥有例程的,互补PWM的火哥有

能否提供例程的連結或檔案??
因為,我去找火哥的例程時網頁都出現檔案不存在,無法搜尋,麻煩了謝謝。
废鱼 回答时间:2018-2-8 14:42:34
楼主先看一下下面地址(类似的地址,我这没有F7)的连接,自己电脑上面有:
C:\Users\user\STM32Cube\Repository\STM32Cube_FW_F4_V1.16.0\Projects\STM324xG_EVAL\Examples\TIM

评分

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

查看全部评分

努力的人 回答时间:2018-2-8 20:33:29
nickyliu6 发表于 2018-2-8 14:24
能否提供例程的連結或檔案??
因為,我去找火哥的例程時網頁都出現檔案不存在,無法搜尋,麻煩了謝謝。 ...

你加入火哥的QQ群,或者论坛内私信野火
nickyliu6 回答时间:2018-2-9 08:32:32
努力的人 发表于 2018-2-8 20:33
你加入火哥的QQ群,或者论坛内私信野火

可以提供論壇的入口地址嗎??
我找了好久,不是沒辦法打開網頁就是跟stm32無關的網站
努力的人 回答时间:2018-2-19 18:44:30
nickyliu6 发表于 2018-2-9 08:32
可以提供論壇的入口地址嗎??
我找了好久,不是沒辦法打開網頁就是跟stm32無關的網站 ...

火哥的论坛维护,初七后就可以了

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版