IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32F407学习笔记3(采用正点原子探索者) -> 正文阅读

[嵌入式]STM32F407学习笔记3(采用正点原子探索者)

继承led,key代码

pwm:(res:自动重装载值,psc:分频值)

步骤:(1)初始化

1.使能PF时钟 RCC_AHB1PeriphClockCmd

2.使能定时器时钟 RCC_APB1PeriphClockCmd

3.设置PF9复用为定时器14 GPIO_PinAFConfig

4.初始化GPIO GPIO_Init

5.初始化定时器14 TIM_TimeBaseInit

6.设置pwm调制 TIM_OC1Init

7.使能预装载寄存器 TIM_OC1PreloadConfig

8.自动装载预装载使能位使能 TIM_ARRPreloadConfig

9.使能定时器 TIM_Cmd

10.编写pwm控制模块,控制led PWM_CtrlLED

pwm.h

#ifndef __PWM_H
#define __PWM_H
#include "stm32f4xx_rcc.h"

void PWM_Init(u32 res,u32 psc );
void PWM_CtrlLED(    u16 ledpwm ,u8 chang_flag);

#endif
pwm.c

#include "pwm.h"
#include "delay.h"
#include "key.h "
void PWM_Init(u32 res,u32 psc )
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//初始化PF时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);//初始化定时器14时钟

    GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);    //PF9复用为TIM14
    
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;            //复用io            
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;                //GPIOF9
    GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;            //上拉
    GPIO_InitStructure.GPIO_Speed=GPIO_High_Speed;        //速度100mhz
    GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;        //推挽
    GPIO_Init(GPIOF,&GPIO_InitStructure);
    
    TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;    //向上计数
    TIM_TimeBaseInitStructure.TIM_Period=res;                        //自动重装载
    TIM_TimeBaseInitStructure.TIM_Prescaler=psc;                    //定时器分频
    
    TIM_TimeBaseInit(TIM14,&TIM_TimeBaseInitStructure);
    
    TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;                    //pwm调制模式
    TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;            //输出极性低
    TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;        //输出比较
    TIM_OC1Init(TIM14,&TIM_OCInitStructure);
    
    TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable);                //使能预装载寄存器
    TIM_ARRPreloadConfig(TIM14,ENABLE);                                //自动装载预装载使能位 使能
    TIM_Cmd(TIM14, ENABLE);                                         //使能 TIM14
}

void PWM_CtrlLED(    u16 ledpwm ,u8 chang_flag)
{
    PWM_Init(500-1,84-1); //定时器时钟为 84M,分频系数为 84,所以计数频率//为 84M/84=1Mhz,重装载值 500,所以 PWM 频率为 1M/500=2Khz.
    while(1)
    {
        if(KEY_Scan(1)==KEY2_PRES)
        {
                delay_ms(10);
            if(chang_flag)
            {
                ledpwm++;//dir==1 led0pwmval 递增
            }
            else ledpwm--; //dir==0 led0pwmval 递减
            if(ledpwm>300)
            {
                chang_flag=0;//led0pwmval 到达 300 后,方向为递减
            }
            if(ledpwm==0)
            {
                chang_flag=1;//led0pwmval 递减到 0 后,方向改为递增
            }
            TIM_SetCompare1(TIM14,ledpwm);//修改比较值,修改占空比
        }
        else break;
    
    }
}
main.c

#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "pwm.h"


int main(void)
{
    delay_init(168);
    LED_Init();
    KEY_Init();

    
    u8 key;
    u16 ledpwm=0;
    u8 chang_flag=1;
    LED0(OFF);
    LED1(OFF);
    
  while(1)
    {
        key=KEY_Scan(1);
        if(key)
        {
            switch(key)
            {
                case KEY0_PRES:
                    LED0(ON);
                    LED1(OFF);
                    break;
                case KEY1_PRES:
                    LED0(OFF);
                    LED1(ON);
                    break;
                case KEY2_PRES:                                            //led亮灭变化,松开熄灭
                    PWM_Init(500,84);                                        //设PF9改为复用模式
                    PWM_CtrlLED(ledpwm ,chang_flag)break;
                case WKUP_PRES:
                    LED0(OFF);
                    LED1(OFF);
                    break;
            }
            key=0;
            LED_Init();                                                                //重设PF9
        }
        else delay_ms(10);
    }
}
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章           查看所有文章
加:2021-09-03 12:04:50  更:2021-09-03 12:07:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:37:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码