stm32 f103 pwm呼吸灯

硬件:小灯是高电平亮

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

为了明白,完全重映射 , 以 TIM4_CH1为例

 int main(void)
 {        
     u16 led0pwmval=0;
    u8 dir=1;    
    delay_init();             //延时函数初始化      
//    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);      //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
//    uart_init(115200);     //串口初始化为115200
//     LED_Init();                 //LED端口初始化
     TIM4_PWM_Init(899,0);     //不分频。PWM频率=72000000/900=80Khz
       while(1)
    {
         delay_ms(1);     
        if(dir)led0pwmval++;
        else led0pwmval--;

         if(led0pwmval>300)dir=0;
        if(led0pwmval==0)dir=1;                                         
        TIM_SetCompare1(TIM4,led0pwmval);        // 这边是实现呼吸灯的效果

    }     
 }

//TIM3 PWM部分初始化 
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
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);    //使能定时器3时钟
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  , ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

   //设置该引脚为复用输出功能,输出TIM4 CH1的PWM脉冲波形    GPIOB.6
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH2
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
 
   //初始化TIM3
    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
    TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    
    //初始化TIM3 Channel2 PWM模式     
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
    TIM_OC1Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

    TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM3在CCR1上的预装载寄存器
 
    TIM_Cmd(TIM4, ENABLE);  //使能TIM3
    

}

下面配置的是完全重映射

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO , ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
    
    GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE); //Timer4重映射   

 

 

 

### 回答1: 好的,以下是用STM32F103编写PWM控制LED灯的代码示例: ```c #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_tim.h" int main(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 使能GPIO和TIM时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 初始化GPIO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化TIM TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // PWM周期为1ms TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 分频系数为72,时钟频率为72MHz/72=1MHz TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 配置TIM2为PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 500; // 初始占空比为50% TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM2, &TIM_OCInitStructure); TIM_Cmd(TIM2, ENABLE); // 使能TIM2 while(1) { // 占空比从0%到100%逐渐增加 for(int i = 0; i <= 1000; i += 10) { TIM_SetCompare2(TIM2, i); // 设置占空比 Delay(10); // 延时10ms } // 占空比从100%到0%逐渐减小 for(int i = 1000; i >= 0; i -= 10) { TIM_SetCompare2(TIM2, i); // 设置占空比 Delay(10); // 延时10ms } } } void Delay(__IO uint32_t nCount) { for(; nCount != 0; nCount--); } ``` 该代码使用了STM32F10x标准库,并使用了定时器TIM2的通道2输出PWM信号控制GPIOA的引脚1,从而控制LED灯的亮度。在循环中逐渐增加和减小PWM的占空比,从而实现LED灯的渐变效果。注意,在代码中使用了一个简单的延时函数Delay来控制PWM信号的占空比变化时间,该函数实现简单,但会占用CPU资源。在实际应用中,应该使用硬件定时器或者操作系统提供的延时 ### 回答2: 下面是编写STM32F103PWM呼吸灯代码的例子: #include "stm32f10x.h" // 延时函数 void delay(uint32_t count) { for (uint32_t i = 0; i < count; i++); } int main(void) { // 使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 配置GPIO引脚 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置定时器 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // PWM信号的周期为1000个计数器时钟周期 TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 计数器的预分频值为72 TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_Cmd(TIM3, ENABLE); while (1) { for (uint16_t i = 0; i <= 1000; i++) { TIM_SetCompare1(TIM3, i); delay(10000); // 延时10毫秒,控制呼吸灯的亮度变化速度 } for (uint16_t i = 1000; i > 0; i--) { TIM_SetCompare1(TIM3, i); delay(10000); } } } ### 回答3: 编写stm32f103pwm呼吸灯的代码可以使用stm32cubemx进行配置,接下来在keil或者其他开发环境中进行编写。 首先,在stm32cubemx中进行如下配置: 1. 将TIM2设置为PWM模式,选择一个合适的预分频和计数器值,以确定PWM频率。 2. 配置一个通道为PWM输出模式,设置占空比为0。 3. 使能TIM2定时器和输出通道。 接下来是代码编写部分: 1. 引入头文件和宏定义 ```c #include "stm32f1xx_hal.h" #define PERIOD_VALUE (1000) // PWM周期设置为1000 ``` 2. 初始化函数 ```c void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM2_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM2_Init(); HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); // 启动PWM输出通道2 while (1) { // 呼吸灯效果 for (int i = 0; i <= 1000; i++) { // 设置PWM占空比 __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, i); HAL_Delay(3); // 延时3ms } for (int i = 1000; i >= 0; i--) { // 设置PWM占空比 __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, i); HAL_Delay(3); // 延时3ms } } } ``` 3. 配置系统时钟 在main函数前添加如下代码: ```c void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } } ``` 4. 配置GPIO 在main函数前添加如下代码: ```c void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOC_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_7; // 配置为输出模式 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); } ``` 5. 配置TIM2 在main函数前添加如下代码: ```c void MX_TIM2_Init(void) { TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; htim2.Instance = TIM2; htim2.Init.Prescaler = 72 - 1; // 设置预分频 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = PERIOD_VALUE - 1; // 设置计数器周期 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) { Error_Handler(); } // 配置定时器输出通道2 sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; // 初始占空比设置为0 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { Error_Handler(); } } ``` 编写完代码后进行编译、烧写到STM32F103开发板中,便可实现呼吸灯效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值