https://yunpan.cn/cBYTWTgSmhbfe 访问密码
STM32F4资料:
https://yunpan.cn/cR2pxqF5x2d9c 访问密码 53e7
Ⅲ、原理描述
上一篇文章讲述的就是上图中“计数”红色部分,也就是开始到结束的时间,该文章是讲述在这个计数的中间加一个值(比较值),当计数到这个比较值的时候就对输出的引脚进行反向,直到计满(一个周期)。循环下去。
通用TIM框图:
上面两图截取“STM32F4x5、x7参考手册”建议下载手册参看。
我上面说的“比较值”就是TIM框图中比较部分的“Capture/Comparex register”比较寄存器,这个值就会决定输出引脚的电平。
Ⅳ、源代码分析
笔者以F4标准外设库(同时也建议初学者使用官方的标准外设库)为建立的工程,主要以库的方式来讲述。
1.RCC时钟
该函数位于bsp.c文件下面;
重点注意:
A.外设RCC时钟的配置要在其外设初始化的前面;
B.匹配对应时钟。
比如:RCC_APB2外设不要配置在RCC_APB1时钟里面
【如:RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);这样能编译通过,但这是错误的代码】
2.TIM比较输出配置
该函数位于timer.c文件下面;
TIM2时基单元配置是上一篇文章相关的内容,是及时的配置,在该文中也就是对一个周期的配置。
TIM2通道2:PWM1模式配置是对占空比的配置。
tim2_period =TIM2_COUNTER_CLOCK/Freq - 1;
tim2_pulse = (tim2_period + 1)*Dutycycle / 100;
函数开始是对周期和占空比的一个换算公式,也比较简单。
决定输出频率和占空比主要由这三个参数(TIM2_PRESCALER_VALUE、tim2_period、tim2_pulse)决定的。
以今天工程输出1KHz,20%来举例说明:
TIM2_PRESCALER_VALUE = 168M/2 / 42M - 1 = 1 (也就是2分频)
tim2_period = 42000 - 1
tim2_pulse = 8400
频率1KHz = 42M/ 4200
占空比20% = 8400/42000
Ⅴ、说明
关于笔者提供的软件工程实例,可关注微信,在会话框回复“关于工程”,有关于工程结构描述、型号修改等讲述。
以上总结仅供参考,若有不对之处,敬请谅解。
关键字:STM32F4 TIM 可调频率 占空比
引用地址:
STM32F4_TIM输出PWM波形(可调频率、占空比)
推荐阅读最新更新时间:2024-10-29 14:42
STM32F429 >> 19. RTC_实时时钟(Code)
配置及读取日期和时间 此工程没有读取亚秒值。 若想让时钟断电后持续计时,则不要使能RTC_Config() 函数中的后备域访问。 bsp_rtc.h /** ****************************************************************************** * @file bsp_rtc.h * @author Waao * @version V1.0.0 * @date 17-Feb-2019 * @brief This file contains some board support package's definition for t
[单片机]
stm32f0 TIM1实现输出PWM波形
//该程序例程是使用的GDstm32f130的芯片,使用TIM1的通道2和通道3输出波形 int main(void) { u16 led0pwmval=0; u8 dir=1; SystemOn_Init(); InitRFChip(); PWM_TIM1(899,0); //?μ?ê?a48MHZ/(999+1)/(1+99)=24KHZ while (1) { Delay_MS(1); if(dir)led0pwmval+=1; else led0pwmval-=1; if(led0pwmval 800)dir=0; if(led0p
[单片机]
stm32f407的串口使用集合(USART1,USART2,USART3,USART6)
由于项目需要使用多串口,因此基于正点原子探索者开发板的串口例程里的串口不够用,在此基础之上,自己对需要用的几个串口操作做了简要的封装,其中已经实现的串口有串口1,串口2,串口3以及串口六,如果有大神能够帮忙完善,本菜鸟在此先谢过,请多多指教 其中的头文件内容如下: /* * file: usart.h * author: Jeans Oyoung * create on June 23, 2016 */ #include string.h #define USE_USART1 #define USE_USART2 #define USE_USART3 #define USE_USART4 #define USE_U
[单片机]
STM32f4按键输入实验代码(02)
接下来我们看看头文件 key.h 里面的代码: #ifndef __KEY_H #define __KEY_H #include sys.h #define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) //PE4 #define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) //PE3 #define KEY2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) //PE2 #define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
[单片机]
正点原子STM32F4笔记 串口使用
1、初始化 时钟 串口时钟,引脚时钟 RCC- AHB1ENR|=1 0; //使能PORTA口时钟 RCC- APB2ENR|=1 4; //使能串口1时钟 引脚复用初始化 GPIO_Set(GPIOA,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PA9,PA10,复用功能,上拉输出 GPIO_AF_Set(GPIOA,9,7); //PA9,AF7 GPIO_AF_Set(GPIOA,10,7);//PA10,AF7 波特率设置 //波特率设置 USART1- BRR=mantissa;
[单片机]
STM32F429 LTDC驱动RGB屏幕
429有很多特点,支持SDRAM, LTDC, TouchGFX等,手上正好有几块RGB屏幕,加之TouchGFX至少需要LTDC或是DSI的方式驱动(并口和FSMC方式还不可行),所以一定要试试LTDC。 CubeMX配置,按照屏幕的类型选择是18位还是24位的接口类型,值得注意的是如果你选的是18位的接口,颜色是通过R ,G ,B 这几个引脚连接的而不是 , 因此还费了一块转接板。。。 水平和垂直同步的相关数值可以查屏幕的手册,或者驱动IC的手册得到。极性需要注意,前两个一般都是ActiveLow后面的两个自己如果发现现实不正确可以试试改变极性,也发生过几次因为这个极性的问题没有显示的问题。 首层的透明度记得选25
[单片机]
stm32f407之基本定时器TIM6&TIM7(操作寄存器)
基本定时器TIM6和TIM7包括一个由可编程分频器驱动的16位自动重载计数器。它可以用作普通的定时器,也可以用来驱动DAC。这两个定时器是完全独立的,不共享任何资源。更多时候是与DAC平配合使用。 作为定时器的配置步骤: 1. 设置中断优先级分组(如果之前没有设置),这个最好一个程序里只在开头设置一次。 2. 使能相关时钟。 3. 设置分频。 4. 清空计数器的值。 5. 设置自动重装寄存器的值。 6. 是否允许中断。 7. 如果允许中断,设置中断优先级,使能中断。 8. 使能计数器。 程序: /**************************
[单片机]
STM32F429之UART使用
#if 1 /// 重定向c库函数printf到USART1 int fputc(int ch, FILE *f) { /* 发送一个字节数据到USART1 */ USART_SendData(USART1, (uint8_t) ch); /* 等待发送完毿*/ while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); return (ch); } /// 重定向c库函数scanf到USART1 int fgetc(FILE *f) { /* 等待串口1输入数据 */ while (
[单片机]