如何使用STM32单片机设置PWM输出

发布者:JoyfulSerenade最新更新时间:2020-02-03 来源: elecfans关键字:STM32  单片机设置  PWM输出 手机看文章 扫描二维码
随时随地手机看文章

环境:

主机:XP

开发环境:MDK4.23

MCU:STM32F103CBT6


说明:

使用内部8M晶振,倍频到64M供给TIM3定时器,PA6(通道1)上产生640K,50%方波


源代码:

初始化时钟:

//初始化RCC时钟

voidinit_rcc(void)

{

//将外设RCC寄存器重设为缺省值

RCC_DeInit();

//内部晶振使能

RCC_HSICmd(ENABLE);

//等待工作稳定

while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)==RESET);

//LSI的启动,提供给看门狗时钟

RCC_LSICmd(ENABLE);//打开LSI

while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)==RESET);//等待直到LSI稳定

if(1)

{

//使能预取指缓存

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

//设置FLASH存储器延时时钟周期数。(设置为延时2个时钟周期)

FLASH_SetLatency(FLASH_Latency_2);

//设置AHB时钟(HCLK)(这时设置为=系统时钟)

RCC_HCLKConfig(RCC_SYSCLK_Div1);

//设置SDIO的AHB时钟(HCLK2)(这时设置为=HCLK),64M

RCC_PCLK2Config(RCC_HCLK_Div1);

//设置APB1外设时钟(HCLK1)(这时设置为=HCLK/2),32M

RCC_PCLK1Config(RCC_HCLK_Div2);

//ADCCLK=PCLK2/8,1M

RCC_ADCCLKConfig(RCC_PCLK2_Div8);

//PLL的时钟来源及倍频的倍数,此处设置为64MHz

RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_16);

//使能PLL

RCC_PLLCmd(ENABLE);

//检测PLL是否就绪

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);

//设置PLL为系统时钟

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

//检测系统的时钟源是否是PLL

while(RCC_GetSYSCLKSource()!=0x08);

}

}

初始化IO口和定时器:

//设置IO口

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOA,&GPIO_InitStructure);

//设置定时器3

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

//重新将TImer设置为缺省值

TIM_DeInit(TIM3);

//采用内部时钟给TIM3提供时钟源

TIM_InternalClockConfig(TIM3);

timInitStruct.TIM_ClockDivision=TIM_CKD_DIV2;

timInitStruct.TIM_Prescaler=0;//计数频率为64M

timInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上计数

timInitStruct.TIM_RepetitionCounter=0;

timInitStruct.TIM_Period=100;//这个值实际上就是TIMX-》ARR,延时开始时重新设定即可

TIM_TimeBaseInit(TIM3,&timInitStruct);

//设置PWM输出

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_Pulse=50;

TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;

TIM_OC1Init(TIM3,&TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);

//ARR预装载缓冲器使能

TIM_ARRPreloadConfig(TIM3,ENABLE);

//开启定时器

TIM_Cmd(TIM3,ENABLE);

输出波形:

如何使用STM32单片机设置PWM输出

关键字:STM32  单片机设置  PWM输出 引用地址:如何使用STM32单片机设置PWM输出

上一篇:STM32单片机的Usart2串口的调试方法
下一篇:STM32单片机实现外部中断的步骤及方法

推荐阅读最新更新时间:2024-11-09 11:57

基于STM32的SPI通信
引言 SPI是串行外设接口的缩写,是一种高速的,全双工,同步的通信总线。由于SPI高速和同步的特性,使其成为嵌入式系统和小型设备中使用最广泛的几种通信接口之一。本文将详细讲解一下SPI,并且最后基于STM32编写一个例程。 介绍 SPI简介 SPI(Serial Peripheral Interface)是一种串行外设接口,用于在微控制器(MCU)或数字信号处理器(DSP)等主设备与外部设备之间进行通信。SPI的设计旨在实现高速数据传输和简单的硬件实现。 SPI接口通常由一个主设备(Master)和一个或多个从设备(Slave)组成。主设备控制通信的时序和数据传输,而从设备根据主设备的指令进行响应。SPI通信基于全双工传输
[单片机]
基于<font color='red'>STM32</font>的SPI通信
STM32从入门到精通—GPIO简介
今天通过这篇文章带大家简单地了解一下GPIO,让大家有一个简单的认识,能够尽快应用。 GPIO简介 每个通用I/O端口包括4个32位配置寄存器、2个32位数据寄存器、1个32位置位/复位寄存器、1个32位锁定寄存器和2个32位复用功能选择寄存器。 GPIO主要特性 受控I/O多达16个 输出状态:推免或开漏+上拉/下拉 从输出数据寄存器或外设输出数据 可为每个I/O选择不同的速度 输入状态:浮空、上拉/下拉、模拟 将数据输入到输入寄存器或外设 置位和复位寄存器,对GPIO_ODR具有按位写权限 锁定机制,可冻结I/O配置 模拟功能 复用功能输入/输出选择寄存器 快速翻转,每次翻转最快最需要两个时钟周期
[单片机]
<font color='red'>STM32</font>从入门到精通—GPIO简介
STM32单片机I/O的工作模式
最近有个朋友在设计低功耗设备,用的是STM32的主控,他知道我做过很多类似的超低功耗项目,于是向我咨询了一些问题,其中就包括I/O口的几种工作模式。今天我就详细的来总结一下这几种工作模式,让大家在以后的设计中知其然也知其所以然。 先说说GPIO 在聊这8种工作模式之前,我想先说一下GPIO的概念—通用输入输出GeneralPurposeInputOutput简称GPIO,就是芯片引脚可以通过它们输出高、低电平,也可以通过他们输入、读取引脚的电压、电平状态。 下面的8种工作模式我将围绕下图进行分析介绍,读懂这一张图大家基本就可以完全理解STM32的GPIO了。希望大家仔细的看一看。 四种不同的输出模式 推挽输出:该模式下引脚
[单片机]
<font color='red'>STM32</font><font color='red'>单片机</font>I/O的工作模式
stm32串口占用时间、消耗CPU及最大中断时间的深度分析,探寻一种更有效的串口发送方式
1、stm32串口发送占用的时间 答:做嵌入式以来,一直自认为在两个MCU之间的串口通信很占用时间,让我感觉很是不爽。经过一番查找资料后发现并没有我想象的那么糟糕。 串口发送数据: 发送数据在软件层面来看是按照字节来发送的。USARTx- DR = (Data & (uint16_t)0x01FF);CPU只需要把一个字节的数据填充到DR寄存器中就可以了,然后具体的发送过程是由硬件来完成,单字节的发送过程中不消耗CPU。但是为什么我们使用串口来发送连续的数据时为什么还是感觉到这么慢,而且连续发送的过程中CPU不能去做其他任务呢?究其原因是因为我们为保证数据发送的完整性在发送过程中加入了while(USART_GetFlagSt
[单片机]
<font color='red'>stm32</font>串口占用时间、消耗CPU及最大中断时间的深度分析,探寻一种更有效的串口发送方式
两个IGBT为什么会出现同时导通的情况呢?
什么是死区时间? 数据手册的参数 如何计算合理的死区时间? STM32中配置死区时间 什么是死区时间? PWM是脉冲宽度调制,在电力电子中,最常用的就是整流和逆变。这就需要用到整流桥和逆变桥。 对三相电来说,就需要三个桥臂。以两电平为例,每个桥臂上有两个电力电子器件,比如IGBT。大致如下图所示; 这两个IGBT不能同时导通,否则就会出现短路的情况,从而对系统造成损害。 那为什么会出现同时导通的情况呢? 因为开关元器件的和严格意义并不是相同的。 所以在驱动开关元器件门极的时候需要增加一段延时,确保另一个开关管完全关断之后再去打开这个开关元器件,通常存在两种情况; 上半桥关断后,延迟一段时间再打开下半桥; 下半桥关断后,延迟一段
[单片机]
两个IGBT为什么会出现同时导通的情况呢?
STM32标准库编程之工程模板介绍
【1】工程模板如下 本来不打算写这一篇的,为了系列的完整性吧,也为了有一个好的过度,但我只能说个大概,具体还要看我给的资料哦! 【2】什么是标准固件库? 其实标准固件库没有什么神秘的,里面无非是包含了一些源文件和头文件,由于文件作用不同分了好几个文件夹而已,命名这一点值得学习,一定要做到见名知意,那么你就是成功的。 【3】标准库的关键文件 那些我们只使用不用修改的文件我们就不用在意了,我这里说的是与内部外设相关的部分。也就是下面这些: 因为我们以后每次编程都要和它们打交道,所以这些便是我们研究的关键!这里不得不提一个文档,里面包含库里的所有函数,关键是说明了每个函数的作用,可传的值用枚举的方式列举了出来,并且每个
[单片机]
如何利用stm32单片机进行超声波测距
首先来看模块图 在某宝上一搜就能找到,关于它的使用也是非常简单,先看数据手册里面需要注意的几点 1 基本的参数 在实际测试当中,最大测量三米多的距离还是可以,最小距离我没有做测试,我测的最小距离是50厘米,再往下没有继续测。 2测距的基本原理 这里的基本原理其实应该是它的使用方法,如果你仔细看它的数据手册会发现这种测距模块还有另外一种使用方法:USART通信。 看文字不是很直观,简单粗暴来看图 在写程序的时候没有使用USART的方法,因为上图的这种驱动方式我认为比较简单,后面的程序也是按照这个时序图来编写的。 注意:上图中关于测距的公式,在程序中我没有使用他给的公式,这一点在后面会提到。 3 实物图的连接 实物图
[单片机]
如何利用<font color='red'>stm32</font><font color='red'>单片机</font>进行超声波测距
大神教你如何快速使用DMA处理ADC
ADC: 1.STM32内部的ADC模块有三个ADC1,ADC2,ADC3,他们彼此独立,所以可以进行同步采样。 2ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生,要在RCC_CFGR配置,再ADC自己的寄存器中在没有时钟分频的配置位。 3.ADC转换时间: STM32F103xx增强型产,时钟为56MHz时为1μ s( 时钟为72MHz为1.17 μ s) 4.ADC的转换精度默认设置为12位,输入范围:ADC输入范围:V REF-≤ VIN≤ VREF+ 5.共有18个通道,其中外部16个通道,内部两个通道,内部温度传感器连接在ADC1_IN16,内部参考电压V REFINT连接在ADC1_IN17 6
[单片机]
大神教你如何快速使用DMA处理ADC
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved