stm32 学习 (设置TIM4输出4路 pwm J-LINK仿真验证)

发布者:SparklingBeauty最新更新时间:2019-08-20 来源: eefocus关键字:stm32  TIM4  pwm  J-LINK  仿真验证 手机看文章 扫描二维码
随时随地手机看文章

使用单片机:stm32f103c8t6  资源


RAM: 20K; flash: 64K;CPU频率: 72M;通用I/O: 32个;UART: 3个;SPI:2个;USB:1个;CAN: 1个;IIC: 2个


12 位同步 ADC: 2 组 10 通道 ;                工作电压: 2.0 至 3.6V


原理图:

PWM输出过程:


1. 脉冲计数器  TIMx_CNT  为向上计数。

2. 重载计数器  TIMx_ARR  配置为N。(TIM_Period值)


3. TIMx_CNT的当前计数值 X 在TIMxCLK时钟源驱动下不断累加; 脉冲计数器 TIMx_CNT  数值 X 大于 重载计数器 TIMx_ARR 值 N 时,会重置  TIMx_CNT  值为0,重新计数。


4. TIMx_CNT计数同时,TIMx_CNT的计数值 X 会与比较寄存器(TIMx_CRR) 的值A 进行比较 ( TIM_Pulse ) ,脉冲计数器(TIMx_CNT)数值 X  小于 比较寄存器 (TIMx_CCR)的值 A 时输出高/低电平


5. X >= A 时输出低电平(高电平) ; PWM占空比:A/(N+1)


stm32的pwm输出只要设置好在主循环前调用一次即可, 对用的IO就可以持续的输出PWM


TIM4配置PWM过程程序:

J-LINK仿真配置


1. 选择“ Options for Target” 选项


2. 在“ Debug” 中选择“Use Simulator" 注意下面的配置


3. 配置好编译下

4.  选择Debug模式调试



5. 进入Debug模式后选择


6. 配置pwm输出引脚

7.

配置好输出引脚直接”close“掉


8. 开始仿真运行


贴一下程序记录下:


/*

//TIM4 CH1 PWM 输出设置

//PWM 输出初始化

//arr:自动重装值

//psc:时钟预分频数

STM32F103C8T6

PB6 - TIM4_CH1

PB7 - TIM4_CH2

PB8 - TIM4_CH3

PB9 - TIM4_CH4

*/

void Tim4_PWM_Init(u16 arr,u16 psc)

{

GPIO_InitTypeDef GPIO_InitStructure;

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

    TIM_OCInitTypeDef TIM_OCInitStructure;

 

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能 TIMx 外设

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能 PB 时钟

TIM_DeInit(TIM4);

 

  //设置该引脚为复用输出功能,输出 TIM4 CH1 的 PWM 脉冲波形

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //TIM4_CH1

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用功能输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化 GPIO

 

TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载周期值

TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值 不分频

TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

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

TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //初始化 TIMx

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //CH1 PWM2 模式

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;

TIM_OCInitStructure.TIM_Pulse = 200; //设置待装入捕获比较寄存器的脉冲值

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //OC1 高电平有效

TIM_OC1Init(TIM4, &TIM_OCInitStructure); //根据指定的参数初始化外设 TIMx

TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //CH1 预装载使能

TIM_OCInitStructure.TIM_Pulse = 400; //设置待装入捕获比较寄存器的脉冲值

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //OC2 高电平有效

TIM_OC2Init(TIM4, &TIM_OCInitStructure); //根据指定的参数初始化外设 TIMx

TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //CH2 预装载使能

TIM_OCInitStructure.TIM_Pulse = 600; //设置待装入捕获比较寄存器的脉冲值

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //OC1 高电平有效

TIM_OC3Init(TIM4, &TIM_OCInitStructure); //根据指定的参数初始化外设 TIMx

TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); //CH3 预装载使能

TIM_OCInitStructure.TIM_Pulse = 800; //设置待装入捕获比较寄存器的脉冲值

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //OC1 高电平有效

TIM_OC4Init(TIM4, &TIM_OCInitStructure); //根据指定的参数初始化外设 TIMx

TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); //CH4 预装载使能

TIM_ARRPreloadConfig(TIM4, ENABLE); //使能 TIMx 在 ARR 上的预装载寄存器

// TIM_CtrlPWMOutputs(TIM4,ENABLE);  //MOE 主输出使能,高级定时器必须开启

TIM_Cmd(TIM4, ENABLE); //使能 TIMx

}

关键字:stm32  TIM4  pwm  J-LINK  仿真验证 引用地址:stm32 学习 (设置TIM4输出4路 pwm J-LINK仿真验证)

上一篇:记STM32之PWM学习笔记 ---PWM原理
下一篇:STM32——PWM基本知识及配置过程

推荐阅读最新更新时间:2024-11-08 10:11

STM32时钟RCC详解(一)
1、时钟源 在STM32中,一共有5个时钟源,分别是HSI、HSE、LSI、LSE、PLL 。 ①HSI 是高速内部时钟, RC 振荡器,频率为8MHz ; ②HSE 是高速外部时钟,可接石英 / 陶瓷谐振器,或者接外部时钟源,频率范围是4MHz – 16MHz ; ③LSI 是低速内部时钟,RC振荡器,频率为40KHz; ④LSE 是低速外部时钟,接频率为32.768KHz的石英晶体; ⑤PLL 为锁相环倍频输出,严格的来说并不算一个独立的时钟源,PLL的输入可以接HSI/2、HSE或者HSE/2 。PLL倍频可选择为2 – 16倍,但是其输出频率最大不得超过72MHz。 其中,40kHz的LSI供独立看门狗IWDG使用
[单片机]
<font color='red'>STM32</font>时钟RCC详解(一)
贸泽率先独家备货STMicroelectronics的STM32 LoRaWAN 探索板
2017年2月24日 – 最新半导体和电子元件的全球授权分销商贸泽电子(Mouser Electronics) 即日起率先备货STMicroelectronics (ST)的STM32 LoRaWAN™ 探索板。这款新型探索套件与可从贸泽电子订购的Arduino兼容I-NUCLEO-LRWAN1 STM32 LoRa™扩展板一起作为一个平台,用于了解和评估基于LoRa和FSK/OOK 射频 (RF) 通信的解决方案。         贸泽电子独家备货的 ST STM32 LoRaWAN探索套件基于一体化开放式 Murata Type ABZ模块,支持低功率广域网(LPWAN) 和LoRaWAN 远程无线协议。Type ABZ模块包
[单片机]
stm32 uart清除中断时机
今天遇到了在调试之前开发人员写的stm32程序时,发现uart1(即console)不能连续接收字符,一旦连续接收字符就会重启? 定位问题: 根据现状可以知道肯定是中断引起的问题,即第一个中断还没有处理完(中断标志位没有清除),第二个中断又来了,进而导致 重启现象。 修改前: void USART1_IRQHandler(void) { unsigned short temp; while(USART_GetITStatus(USART1, USART_IT_RXNE) == RESET); temp = USART_ReceiveData(USART1); if(temp == '\r') printf( \
[单片机]
STM32芯片引脚为什么有那么多组VDD?
做过单片机产品的朋友都知道,STM32芯片有多组VDD和VSS,如下图: 那么为什么有这么多引脚呢?少一点不好吗?引脚越少,PCB走线越容易。 其实芯片这样设计是有原因的。 1、增加电流供应能力 单片机IO口输出电流的能力是有限的,传统单片机的IO口一般为10mA左右,现在单片机的IO口一般为20-25mA。 多个IO口加起来,相当于增加了很多供电通道,扩大了电流供应能力。相比单个引脚的VDD,增强了可靠性。 如图,假如一个IO口流过的电流是20mA,三个IO口就是60mA。 2、方便就近取电 为了方便描述,我画了一个如下示意图。 假如只有一组VDD,从①处供电,当②处需要用电时,只能沿着箭头所示路径流动,可以看出距离较远
[单片机]
<font color='red'>STM32</font>芯片引脚为什么有那么多组VDD?
基于STM32单片机开发光学指纹识别模块(FPM10A)全教程
1.平台 首先我使用的是 奋斗 STM32 开发板 MINI板 光学指纹识别模块(FPM10A)淘宝网址是:http://item.taobao.com/item.htm?id=5380075198 2.购买指纹模块,可以获得三份资料 1.简要使用说明 2.使用指纹模块的功能函数 3.FPM10A用户手册. 3.硬件搭建 根据使用说明:FPM 10A使用标准的串口与外界通信,默认的波特率为57600,可以与任何单片机,ARM,DSP等带串口的设备进行连接,请注意电平转换,连接电脑需要进行电平转换,比如MAX232电路。 FPM10A光学指纹模块共有5个管脚 1 为 VCC 电源的正极接 3.6V 5.
[单片机]
基于<font color='red'>STM32</font>单片机开发光学指纹识别模块(FPM10A)全教程
STM32的USB通信资料
以下资料由网上收集 usb的传输字节问题(来自computer00) STM32的USB端点缓冲不是固定的,由寄存器设置。 而我的程序中,是如下定义的,端点大小为0x40,端点2做为输出端点, 0xD8+0x40=0x118,也就是说,端点1缓冲前24个字节重叠,被输出数据覆盖了。 /* EP1 */ /* tx buffer base address */ #define ENDP1_TXADDR (0x100) /* EP2 */ /* Rx buffer base address */ #define ENDP2_RXADDR (0xD8) 将端点1的发送地址设置为0x98即可解决此问题。 /* EP1 */ /
[单片机]
NVIC中断优先级管理示例解析
NVIC中断优先级管理 STM32中断优先级简介 NVIC的缩写是“嵌套向量中断控制器(Nested Vectored Interrupt Controller)”。 如何管理中断? STM32中断优先级管理采用“响应优先级和抢占优先级”结合的方法,并且进行了中断分组。 以第1组为例:1bit抢占优先级说明抢占优先级共有两级,3bits响应优先级说明响应优先级共有8级。我们可以看到无论如何分组,中断优先级总有16种。 什么是“抢占优先级”和“响应优先级”呢? 抢占优先级和响应优先级都是区分那个中断优先进行的标志,但是两者的含义去不尽相同。 抢占优先级从名字上就比响应优先级霸气一些,因此抢占优先级起决定作用,当
[单片机]
NVIC中断优先级管理示例解析
手把手之STM32中断
●中断 中断,在单片机中占有非常重要的地位。代码默认地从上向下执行,遇到条件或者其他语句,会按照指定的地方跳转。而在单片机执行代码的过程中,难免会有一些突发的情况需要处理,这样就会打断当前的代码,待处理完突发情况之后,程序会回到被打断的地方继续执行。 ●关于STM32的中断 几乎任何一款单片机都会有中断。以STM32F407VE来说,这是一款基于Cortex-M4内核的芯片,在CM4内核中有关于中断的一些管理,在STM32芯片中也有关于中断的一些管理。因此可以总结出一条规律,STM32的中断是有两层控制器分别控制的,如果你想使用中断,那么必须同时配置内核和芯片。 ●CM4内核中断 从内核架构图可以看到,NVIC控制器来管
[单片机]
手把手之<font color='red'>STM32</font>中断
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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