本文实践用到的芯片为:STM32F103VET6。文中所述内容符合同系列芯片的应用。本文适合初学者阅读。
上面是在STM32引脚PA0上测得的频率为1KHz占空比为25%的PWM信号。下面讲如何实现。
如上图所示,我们使用定时器2通道1产生PWM。
执行思想:1.需要把引脚配置为复用推挽输出;2.需要配置定时器2。
1.配置引脚
我们用库函数实现的话,肯定要涉及到GPIO初始化配置结构体,所以需要定义一个GPIO_InitTypeDef类型的结构体变量,然后把变量成员配置好。
2.配置定时器2
我们用库函数的话,一是要涉及到定时器的基本配置结构体,所以需要定义一个TIM_TimeBaseInitTypeDef类型的结构体变量,然后把变量成员配置好。二是需要使用TIM_OC1Init()函数输出PWM信号,所以还需要定义一个TIM_OCInitTypeDef类型的结构体变量,然后把变量成员配置好。
程序如下:
void PA0_PWM(void)
{
GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化结构体变量
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;// 定时器基本初始化结构体变量
TIM_OCInitTypeDef TIM_OCInitStruct; // 定时器OC输出结构体初始化变量
/* 允许TIM2 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* 允许GPIOA */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* 选择PA0 */
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
/* 复用推挽输出 */
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
/* 引脚最大输出频率 */
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
/* 配置 */
GPIO_Init(GPIOA, &GPIO_InitStruct);
/* 周期1000 */
TIM_TimeBaseInitStruct.TIM_Period = 999;
/* 定时器时间间隔1微秒 */
TIM_TimeBaseInitStruct.TIM_Prescaler = 71;
/* 向上计数 */
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
/* 配置 */
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
/* 选择PWM1模式 */
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
/* 允许输出模式 */
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
/* 匹配值 */
TIM_OCInitStruct.TIM_Pulse = 249;
/* 设置小于匹配值时为高电平 */
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
/* 使能定时器2的通道1 */
TIM_OC1Init(TIM2, &TIM_OCInitStruct);
/* 打开定时器2 */
TIM_Cmd(TIM2, ENABLE);
}
执行上面的函数,即可在PA0引脚上输出占空比为25%频率为1KHz的PWM信号了。结构上面的描述和程序里面的描述,上面的程序就很好理解了。
关键字:STM32 PWM信号
引用地址:
STM32如何产生PWM信号
推荐阅读最新更新时间:2024-03-16 15:24
STM32和ROS的串口通信
1 前言 之前有不少小伙伴,因为不知道如何使用这里分享的代码、或者是对系统结构不太清楚等等,导致调用不成功的,这里我深表歉意。下面我会对整个通信方案的部署进行详细的说明,确保每一个看到这篇文章的小伙伴,都能解决自己的问题。 2 本方案解决的问题 解决以STM32做ROS机器人底层驱动的串口通信问题、其他需要stm32和ros通信的小伙伴也可以使用。 -1- 介绍 1 最终协议的样子 我这里实现的STM32和ROS的串口通信协议如下图: STM32端和ROS端都有一个数据发送函数和一个数据接收函数,发送和接收的内容就是如上图所示的数据包,该数据包含有数据头(55aa)、数据尾(0d0a)、校验(crc8),
[单片机]
STM32串口接收粉尘传感器数据
本文章主要记录STM32实现对粉尘传感器的数据采集及简单处理。 材料: 1、正点原子Mini开发板STM32f103RC 2、ZH03A激光粉尘传感器 3、USB TO TTL线(就是烧写51单片机的下载线)连接电脑和开发板上的串口2 4、电脑串口调试助手,用来查看数据 主要设计思路: 1、串口初始化,包括GPIO,外设时钟,NVIC等配置; 2、串口中断处理函数编写,即通过接收中断获取数据并且保存到数组,同时注意判断相关数据位; 3、发送数据,使用到了printf函数,需要重定向; 4、主程序初始化。 主要函数编写: 1、串口初始化,PA.2- USART2_TX,PA.3- USART2_RX,PA.9- USART1
[单片机]
STM32 TIM定时器 库函数学习笔记
一些库函数的用法手册上讲得不甚详细,网上也几乎没有资料,把我个人理解的一些东西和大家分享一下,如有错漏请批评指正。 TIM_DeInit(TIM2); //注意:按缺省值复位后,时钟源为内部时钟,不必再调用函数设置。如需要更改定时器计时的时钟源, //调用后面的那几个相关函数就行。定时器的时钟不是直接来自APB1/2,而是来自于输入为APB1/2的一个倍频器。 //当APB1/2的预分频系数为1时,定时器的时钟频率等于APB1/2的频率; //当APB1/2的预分频系数为其它数值时,定时器的时钟频率等于APB1/2的频率两倍。 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructur
[单片机]
STM32 RS485 modbus通讯源程序,亲测有效
Modbus 一个工业上常用的通讯协议、一种通讯约定。Modbus协议包括RTU、ASCII、TCP。其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现。modbus协议简单解析如下: 1、主机对从机写数据操作 如果单片机接收到一个报文那么就对报文进行解析执行相应的处理,如上面报文: 01 06 00 01 00 17 98 04 从机地址 功能号 数据地址 数据 CRC校验 假如本机地址是 1 ,那么单片机接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断数据无误,则结果是: HoldDataReg = 0x0017
[单片机]
基于STM32设计的酒精检测仪
一、需求分析 随着社会的发展和生活水平的提高,人们对于行车安全、家庭安全的要求越来越高,而酒驾等问题也日渐突出,为此,开发一款基于STM32的酒精检测仪,通过检测酒精浓度,实时显示结果并进行报警,可以有效避免因酒后驾车带来的安全隐患。 二、设计思路 2.1 硬件设计 1、主控芯片采用STM32F103RCT6,该芯片具有较高的性能和稳定性,能够满足本设计的各项需求。 2、酒精传感器采用MQ-3模块,该模块具有高精度、响应速度快等特点,能够准确检测酒精浓度。 3、OLED显示屏,用于实时显示酒精浓度等信息。 4、蜂鸣器,用于进行声音报警。 5、按键,用于设定报警阈值。 2.2 软件设计 1、IO口配置:将相应
[单片机]
STM32系统时钟 CAN UART
在调试USB-CAN的适配器的过程中,采用库函数开发,在调试串口的过程中串口数据始终乱码。 思考一番,发现由于外部晶振的原因,在 Keil 中Ctrl + Shift + F 查找 HSE_VALUE: #if !defined HSE_VALUE #ifdef STM32F10X_CL #define HSE_VALUE ((uint32_t)25000000) /*! Value of the External oscillator in Hz */ #else #define HSE_VALUE ((uint32_t)8000000) /*! Value of the External oscil
[单片机]
关于stm32芯片解锁方法
在调试stm32芯片的时候经常会出现下载不进去,出现类似下面的错误,这个时候就要怀疑是不是芯片被异常锁死了; 我亲测有效的解决方法主要有以下两种: 1.JLINK烧录器解锁:这是最简单的方法 SEGGER 的JLink ARM V4.08l包中的,Processor Specific Utilities- J-Link STM32 Unlock 工具就可以解锁; 2.ISP升级解锁: 通过串口,设置BOOT0为1,BOOT1为0,进入ISP升级模式,发送解除读写保护即可解锁。 --------------------- 作者:xld_1992 来源:CSDN 原文:https://blog.csdn
[单片机]
STM32 DHT11串口打印源程序
1.硬件准备: USB转TTL工具一个 核心板STM32F103C8T6 DHT11传感器 2.软件准备: 串口调试助手 2.硬件连线 USB转TTL的RX----32板子上的PA9 USB转TTL的TX----32板子上的PA10 DHT11的DAT连接PB14 3.程序源码 #include dht11.h ////////////////////////////////////////////////////////////////////////////////// #include delay.h //////////////////////////////////////////////////////
[单片机]