STM32学习--PWM测试

发布者:美好梦想最新更新时间:2022-10-24 来源: csdn关键字:STM32 手机看文章 扫描二维码
随时随地手机看文章

  今天针对通用定时器的输入捕获和PWM输出进行了学习测试,使用库函数进行。


1. PWM输出测试

1.1 测试方法

  输出测试使用软件调试方法,直接在MDK调试界面的逻辑分析仪进行。软件调试设置网上一堆一堆的,我只描述一下遇到问题点。

这里写图片描述

  图中,软件仿真只用设1、2项,加入硬件调需设第3项。

打开逻辑分析仪,在setup中输入想看的端口,如下图设置。

这里写图片描述

  在端口号上右击,选择bit,然后运行即可看PWM输出的效果。

这里写图片描述

1.2测试的程序

① GPIO设置,主要是时钟、复用时钟、推挽输出、由于用默认的映射所以不用GPIO_PinRemapConfig。


void PWMOut_GPIO_Init()

{

    GPIO_InitTypeDef GPIO_InitStructure; 

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);    //使能PA端口时钟//GPIO 时钟使能

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);        //复用时钟

     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;  //复用推挽输出

     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

//  GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE );      //00,不映射

}


void TIM3_Init()

{

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    TIM_OCInitTypeDef  TIM_OCInitStructure;


//②TIM3 时钟,设置分频器


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);


/*③设置计数方式、分频器值


  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;

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

    TIM_TimeBaseStructure.TIM_Prescaler =0 ; 

//此处为ARR的值。

TIM_TimeBaseStructure.TIM_Period = 900;

    TIM_TimeBaseInit(TIM3,& TIM_TimeBaseStructure);


//④设置输出模式、通道


  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

//此处为CCR的值,也可以先设0,在主函数中重设,但不能比ARR大。

 TIM_OCInitStructure.TIM_Pulse = 200;//CCR

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

    TIM_OC1Init(TIM3, & TIM_OCInitStructure);


    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

  TIM_OCInitStructure.TIM_Pulse =100;//CCR

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

    TIM_OC2Init(TIM3, & TIM_OCInitStructure);


//⑤使能TIMx在CCR2上的预装载寄存器和ARR预装载寄存器


    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //   TIM_ARRPreloadConfig(TIM3,ENABLE );


//⑥使能TIMx外设


    TIM_Cmd(TIM3, ENABLE);  


}


2. PWM输入测试

2.1 测试方法

  将输出的PWM口输入到PWM输入口中,然后将测试值从串口输出。

这里写图片描述

  测试结果与输出结果略有出入。PWM输出周期400,高电平200,输入测试为周期398,高电平197,这与事件更新时序有关,但出入不大。设计时需考虑到。


2.2测试的程序

u16 PWM_Circle;

u16 PWM_Rise;


① GPIO设置,主要是时钟、复用时钟、浮空输入、由于用默认的映射所以不用GPIO_PinRemapConfig。


//端口PA1

//TIM2_CH2,端口不重映射

void    PWMIN_GPIO_Init()

{

    GPIO_InitTypeDef GPIO_InitStructure; 

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);    //使能PA端口时钟//GPIO 时钟使能

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);        //复用时钟

     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;  //复用推挽输出

     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//GPIO_Mode_IPD;//输入下拉

     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

}


void    TIM2_Init()

{

 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

//  TIM_OCInitTypeDef  TIM_OCInitStructure;

    TIM_ICInitTypeDef TIM_ICInitStruct;

    NVIC_InitTypeDef NVIC_InitStructure;


//②TIM2 时钟,设置分频器、设置计数方式、分频器值


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;

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

    TIM_TimeBaseStructure.TIM_Prescaler =0 ;

    TIM_TimeBaseInit(TIM2,& TIM_TimeBaseStructure);


//③有两种方法进行通道设置,经测两种均可用。深入库函数分析,实现方式一致。

//方法一:


//TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;

//TIM_ICInitStruct.TIM_ICFilter = 0;

//TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;

//TIM_ICInitStruct.TIM_ICPrescaler =TIM_ICPSC_DIV1;

//TIM_ICInitStruct.TIM_ICSelection =TIM_ICSelection_DirectTI ;


//TIM_PWMIConfig(TIM2, &TIM_ICInitStruct);  

//  //设置输入模式、通道


//方法二:


TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;

//TIM_ICInitStruct.TIM_ICFilter = 

TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;

TIM_ICInitStruct.TIM_ICPrescaler =TIM_ICPSC_DIV1;

TIM_ICInitStruct.TIM_ICSelection =TIM_ICSelection_DirectTI ;

TIM_ICInit( TIM2, &TIM_ICInitStruct);   


TIM_ICInitStruct.TIM_Channel = TIM_Channel_1; // 从通道,

//TIM_ICInitStruct.TIM_ICFilter = 

TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Falling;

TIM_ICInitStruct.TIM_ICPrescaler =TIM_ICPSC_DIV1;

TIM_ICInitStruct.TIM_ICSelection =TIM_ICSelection_IndirectTI ;//ch2上

TIM_ICInit( TIM2, &TIM_ICInitStruct);   


//④选择触发源、设置从模式、使能主模式


TIM_SelectInputTrigger(TIM2,TIM_TS_TI2FP2);// 选择触发源


TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset); //配置从模式为复位

TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);//开启主/从模式


//⑤中断设置


    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;      //


    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能

    NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1


//⑥ 开定时器、开中断。


    TIM_Cmd(TIM2, ENABLE);  //使能TIMx外设

TIM_ITConfig(TIM2,TIM_IT_CC2, ENABLE);//开中断

}


//⑦中断函数


void TIM2_IRQHandler (void)

{


 PWM_Rise = TIM_GetCapture1(TIM2);

    PWM_Circle =TIM_GetCapture2(TIM2);

    printf("周期为%d,高电平为%dtn",PWM_Circle,PWM_Rise);

    TIM_ClearITPendingBit(TIM2,TIM_IT_CC2);

}


期间还测过呼吸灯,方法也比较简单就不描述了。


关键字:STM32 引用地址:STM32学习--PWM测试

上一篇:STM32开发环境(3)----下载调试
下一篇:STM32中EXTI,EXTI和NVIC的关系

推荐阅读最新更新时间:2024-11-07 06:53

ST发布STSAFE-A100评估套件,扩大STM32 Nucleo生态系统
意法半导体发布了STSAFE-A100评估套件,将进一步扩大STM32 Nucleo生态系统的丰富资源,加快安全单元的集成设计,利用可复用源代码以简化安全物联网设备、医疗探针等高价耗材、IT配件和消费产品的开发设计流程。 该评估套件包括集成STSAFE-A100安全单元的X-NUCLEO-STSA100扩展板和STSW-STSA100软件包。软件包括设备驱动程序、STM32微控制器源代码和STSAFE-A100的用例源代码,包括品牌和生态系统保护、设备注册和安全云连接等用例。 STSAFE-A100是一款便于使用的8引脚安全单元,可为主机系统提供稳健的不可变的硬件身份验证和安全数据管理服务,具有极强的网络攻击防御能力
[单片机]
ST发布STSAFE-A100评估套件,扩大<font color='red'>STM32</font> Nucleo生态系统
STM32第九章-IIC通讯应用
  说到IIC(通常也叫I2C,其实都是一样的)通讯,是一种最简单的通讯协议。在学习STM32时第一个接触的就是串口USART通讯协议,接下来就是IIC通讯协议了还有的就是SPI协议,SPI我们下一章再说,这一章就说说IIC吧。很多模块都用到过IIC通讯,最常见的就是4针的0.96寸OLED显示屏,当然啦在学习STM32是我们一般最先接触到就是通过IIC来与EEPROM进行通讯,但是本章我们只讲协议本身。 一、 IIC 简介   IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线,可
[单片机]
<font color='red'>STM32</font>第九章-IIC通讯应用
STM32采集多路ADC到DMA的方法
最近在做一个手柄,用到了一个游戏摇杆,游戏摇杆的原理就是两个电位器,通过读取ADC的值计算位置,原理和触摸屏类似,那么就需要用到两路ADC了,但是我用的开发板是野火的,火哥给的例程只有单路ADC采集,查阅了相关资料解决了多路的问题,现在我把主要的代码贴在下面,以及一些注意的地方。 #define ADC1_DR_Address ((u32)0x40012400+0x4c) __IO uint16_t ADC_ConvertedValue ; /** * @brief 使能ADC1和DMA1的时钟,初始化PA.0&PA.1 * @param 无 * @retval 无 */ static void ADC1_G
[单片机]
STM32—ADC多通道采集电压
ADC详解 前面的博客中详细介绍了STM32中ADC的相关信息,这篇博客是对ADC内容的一个总结提升,ADC的详细介绍:ADC详解 程序说明 为了使这次代码阅读方便,博主没有在头文件中宏定义变量,都是直接采样库函数中的规定形参。此次采用多通道采集电压,使用ADC1的通道10、11、12、13、14、15一共六个通道,采用DMA将转换结果传输至内存。 函数主体 引脚配置 引脚配置的时候,将所有引脚一次性配置好,过于简单,不作详细说明。 void ADC_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_A
[单片机]
STM32安全固件更新的安全挑战
固件更新是我们软件生命周期中必须面临的问题。软件生命周期中有多种原因让我们需要固件更新,而固件更新也会带来安全问题,如使用固件更新来攻击电子钱包。 STM32 已经提供了很多的安全技术来应对固件更新的安全挑战。在这里和大家一起探讨,如何利用 STM32 安全技术,软件以及硬件安全技术,进行安全的升级固件。 讲座内容既包括了固件更新的一般原理,以及安全固件更新的额外设计。 安全固件更新离不开安全启动。STM32 安全启动为 STM32 安全固件更新提供了安全的运行环境。 什么是安全固件更新? 固件更新是指部分或者完全替换设备上的软件的操作,包括添加新应用,修改已有功能,或者去修复软件里的问题。安全固件更新,则是以安全的方
[单片机]
STM32跑马灯遇到的问题及解决方法及体会
一、跑马灯程序运行所遇问题 1,按照正点原子stm32视频学习时,在编写跑马灯程序中,出现:“Error:L6218E:Undefined symbol main(reffered from __rtentry2.o)” 百度结果是可能 1)main拼写错误(我没有拼写错误); 2)主函数文件中没有调用主函数;(此时我还没有写主函数文件) 但是,我点击最左边的编译符号后,错误消失了。写完主函数后,此错误消失; 2,写完主函数后,出现:“Error:L6200E:Symbol delay_init multiply defined(by delay.o and main.o)
[单片机]
STM32JTAG调试接口PB3、PB4复用问题
JTAG 接口:主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议,标准接线是4根线 TMS:JTAG接口模式选择 TCK:JTAG接口时钟 TDI:JTAG接口数据输入 TDO:JTAG接口数据输出 TRST:JTAG可选引脚,功能为 测试复位、输入引脚、低电平有效 SWD接口:串行调试(Serial Wire Debug),应该可以算是一种和JTAG不同的调试模式,使用的调试协议也应该不一样,所以最直接的体现在调试接口上。标准接线为2线 SWDIO:SWD数据线 SWDCLK:SWD时钟线 SWD与JTAG相比有许多优点: 1. SWD接口相比于JTAG更加可靠 2. 使用更少的GPIO,直
[单片机]
STM32 SPI
SPI 是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口。是 Motorola首先在其 MC68HCXX 系列处理器上定义的。 SPI 接口主要应用在 EEPROM, FLASH,实时时钟,AD 转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为 PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,STM32 也有 SPI 接口。 SPI 接口一般使用 4 条线通信: MISO 主设备数据输入,从设备数据输出。 MOSI 主设备数据
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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