自学内容网 自学内容网

stm32————重映射基础知识点(PWM呼吸灯实验)

STM32F103C8T6的引脚重映射表提供了不同外设功能到引脚的映射关系。以下是一些常见的外设引脚重映射选项 :

  1. USART1:

    • 默认引脚: PA9 (TX), PA10 (RX)
    • 重映射引脚: PB6 (TX), PB7 (RX)
  2. USART2:

    • 默认引脚: PA2 (TX), PA3 (RX)
    • 重映射引脚: PD5 (TX), PD6 (RX)
  3. USART3:

    • 默认引脚: PB10 (TX), PB11 (RX)
    • 重映射引脚: PC10 (TX), PC11 (RX)
  4. UART4:

    • 默认引脚: PA0 (TX), PA1 (RX)
    • 重映射引脚: PC10 (TX), PC11 (RX)
  5. I2C1:

    • 默认引脚: PB6 (SCL), PB7 (SDA)
    • 重映射引脚: PB8 (SCL), PB9 (SDA)
  6. I2C2:

    • 默认引脚: PB10 (SCL), PB11 (SDA)
    • 重映射引脚: PF1 (SCL), PF0 (SDA)
  7. SPI1:

    • 默认引脚: PA5 (SCK), PA6 (MISO), PA7 (MOSI)
    • 重映射引脚: PB3 (SCK), PB4 (MISO), PB5 (MOSI)
  8. SPI2:

    • 默认引脚: PB13 (SCK), PB14 (MISO), PB15 (MOSI)
    • 重映射引脚: PC2 (MISO), PC3 (MOSI)
  9. 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比较值 

  1. 设置TIMx的CCR3寄存器TIM_SetCompare3函数允许用户为定时器TIMx的第三个捕获/比较寄存器(CCR3)设置一个新的值。CCR3是定时器的一个通道寄存器,用于捕获模式下捕获输入信号的值,或在输出比较模式下设置输出比较事件。

  2. 参数检查:函数首先调用assert_param宏来检查传入的参数是否有效。这里的IS_TIM_LIST3_PERIPH(TIMx)宏用于确保传入的TIMx是有效的定时器地址,即TIMx是TIM1, TIM2, TIM3, TIM4, TIM5或TIM8中的一个。

  3. 更新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);
    }
}

 


原文地址:https://blog.csdn.net/2401_82978699/article/details/143836429

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!