stm32————重映射基础知识点(PWM呼吸灯实验)
STM32F103C8T6的引脚重映射表提供了不同外设功能到引脚的映射关系。以下是一些常见的外设引脚重映射选项 :
-
USART1:
- 默认引脚: PA9 (TX), PA10 (RX)
- 重映射引脚: PB6 (TX), PB7 (RX)
-
USART2:
- 默认引脚: PA2 (TX), PA3 (RX)
- 重映射引脚: PD5 (TX), PD6 (RX)
-
USART3:
- 默认引脚: PB10 (TX), PB11 (RX)
- 重映射引脚: PC10 (TX), PC11 (RX)
-
UART4:
- 默认引脚: PA0 (TX), PA1 (RX)
- 重映射引脚: PC10 (TX), PC11 (RX)
-
I2C1:
- 默认引脚: PB6 (SCL), PB7 (SDA)
- 重映射引脚: PB8 (SCL), PB9 (SDA)
-
I2C2:
- 默认引脚: PB10 (SCL), PB11 (SDA)
- 重映射引脚: PF1 (SCL), PF0 (SDA)
-
SPI1:
- 默认引脚: PA5 (SCK), PA6 (MISO), PA7 (MOSI)
- 重映射引脚: PB3 (SCK), PB4 (MISO), PB5 (MOSI)
-
SPI2:
- 默认引脚: PB13 (SCK), PB14 (MISO), PB15 (MOSI)
- 重映射引脚: PC2 (MISO), PC3 (MOSI)
-
TIMx (定时器):
- 定时器的通道可以映射到不同的引脚,具体映射关系需要查看STM32F103C8T6的参考手册或数据手册中的引脚复用表 。
例如,要将USART1的TX和RX重映射到PB6和PB7,你需要使能GPIOB和AFIO的时钟,然后配置PB6和PB7为复用推挽输出模式,并在AFIO的MAPR寄存器中设置相应的位来启用重映射
pwm实现呼吸灯实验:
代码示例:
// 定义LED连接的GPIO引脚
#define LED_PIN GPIO_Pin_0
#define LED_GPIO GPIOB
#define LED_RCC RCC_APB2Periph_GPIOB
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(LED_RCC, ENABLE);
GPIO_InitStructure.GPIO_Pin = LED_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_GPIO, &GPIO_InitStructure);
}
void TIM3_PWM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 使能TIM3时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// TIM3基础配置
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // PWM频率
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 预分频器,使得计数器频率为1kHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// PWM模式1配置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
// 使能TIM3的CH3输出
TIM_CtrlPWMOutputs(TIM3, ENABLE);
// 使能TIM3
TIM_Cmd(TIM3, ENABLE);
}
上述配置,首先我们使用tim3通道3 PB0 不需要重映射 通过配置定时器 实现 pwm频率为1khz 同时pb0引脚要配置为复用推挽输出 因为他要作为定时器3的通道3输出信号口
int main(void)
{
uint16_t pwm_value = 0;
uint8_t increasing = 1;
// 初始化GPIO和TIM3 PWM
LED_GPIO_Config();
TIM3_PWM_Config();
while (1)
{
// 实现呼吸灯效果
if (increasing)
{
pwm_value++;
if (pwm_value >= 1000)
{
increasing = 0;
}
}
else
{
pwm_value--;
if (pwm_value == 0)
{
increasing = 1;
}
}
// 更新PWM占空比
TIM_SetCompare3(TIM3, pwm_value);
// 延时,控制呼吸速度
Delay(1);
}
}
TIM_SetCompare3(TIM3, pwm_value); 配置 TIM_OCInitStructure.TIM_Pulse 的值,也就是pwm比较值
-
设置TIMx的CCR3寄存器:
TIM_SetCompare3
函数允许用户为定时器TIMx的第三个捕获/比较寄存器(CCR3)设置一个新的值。CCR3是定时器的一个通道寄存器,用于捕获模式下捕获输入信号的值,或在输出比较模式下设置输出比较事件。 -
参数检查:函数首先调用
assert_param
宏来检查传入的参数是否有效。这里的IS_TIM_LIST3_PERIPH(TIMx)
宏用于确保传入的TIMx是有效的定时器地址,即TIMx是TIM1, TIM2, TIM3, TIM4, TIM5或TIM8中的一个。 -
更新CCR3寄存器值:如果参数检查通过,函数将直接将
Compare3
的值写入到TIMx->CCR3
寄存器中。
完整代码:
#include "stm32f10x.h"
#include "delay.h"
// 定义LED连接的GPIO引脚
#define LED_PIN GPIO_Pin_0
#define LED_GPIO GPIOB
#define LED_RCC RCC_APB2Periph_GPIOB
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(LED_RCC, ENABLE);
GPIO_InitStructure.GPIO_Pin = LED_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_GPIO, &GPIO_InitStructure);
}
void TIM3_PWM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 使能TIM3时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// TIM3基础配置
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // PWM频率
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 预分频器,使得计数器频率为1kHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// PWM模式1配置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
// 使能TIM3的CH3输出
TIM_CtrlPWMOutputs(TIM3, ENABLE);
// 使能TIM3
TIM_Cmd(TIM3, ENABLE);
}
int main(void)
{
uint16_t pwm_value = 0;
uint8_t increasing = 1;
// 初始化GPIO和TIM3 PWM
LED_GPIO_Config();
TIM3_PWM_Config();
while (1)
{
// 实现呼吸灯效果
if (increasing)
{
pwm_value++;
if (pwm_value >= 1000)
{
increasing = 0;
}
}
else
{
pwm_value--;
if (pwm_value == 0)
{
increasing = 1;
}
}
// 更新PWM占空比
TIM_SetCompare3(TIM3, pwm_value);
// 延时,控制呼吸速度
Delay(5);
}
}