新手入门
- 积分
- 4
- 金钱
- 4
- 注册时间
- 2018-6-8
- 在线时间
- 0 小时
|
12金钱
用PWM实现呼吸灯,希望按下按键可以关闭呼吸灯或者开启呼吸灯,现在开启呼吸灯后会从原来的亮度继续,希望实现的是开启的时候是重新开始的,也就是无论什么时候关闭呼吸灯,开启时都是从不亮慢慢变亮。相关代码如下main.c
[mw_shl_code=c,true]#include "stm32f10x.h"
#include "bsp_breathing.h"
extern uint8_t period_cnt;
extern uint8_t pwm_index;
/**
* @brief Ö÷oˉêy
* @param ÎT
* @retval ÎT
*/
int main(void)
{
int flag=1;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
/* 3õê¼»ˉoôÎüμÆ */
Key_GPIO_Config();
while(1){
if( Key_Scan(GPIOA,GPIO_Pin_0) == 1 )
{
if(flag==1){
TIM3_Breathing_Init();
}else{
TIM_ClearITPendingBit (TIM3, TIM_IT_Update);
period_cnt=0;
pwm_index=0;
TIM3->CCR3=0;
/* PWMÄ£ê½ÅäÖà */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //ÅäÖÃÎaPWMÄ£ê½1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; //ê1Äüêä3ö
TIM_OCInitStructure.TIM_Pulse = 0; //éèÖÃ3õê¼ WMÂö3å¿í¶èÎa0
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //μ±¶¨ê±Æ÷¼ÆêyÖμD¡óúCCR1_Valê±ÎaμíμçÆ½
TIM_OC3Init(TIM3, &TIM_OCInitStructure); //ê1Äüí¨μà3
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable); //ê1ÄüÔ¤×°ÔØ
TIM_ARRPreloadConfig(TIM3, DISABLE); //ê1ÄüTIM3ÖØÔØ¼Ä′æÆ÷ARR
/* TIM3 enable counter */
TIM_Cmd(TIM3, DISABLE); //ê1Äü¶¨ê±Æ÷3
TIM_ITConfig(TIM3,TIM_IT_Update, DISABLE); //ê1ÄüupdateÖD¶Ï
/* ÅäÖÃoôÎüμÆóÃμ½μÄ B0òy½Å */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // ¸′óÃíÆíìêä3ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_0);
}
flag=!flag;
}
}
}
/*********************************************END OF FILE**********************/
[/mw_shl_code]
[mw_shl_code=c,true]#include "bsp_breathing.h"
/* LEDáá¶èμè¼¶ PWM±í */
uint8_t indexWave[] = {1,1,2,2,3,4,6,8,10,14,19,25,33,44,59,80,
107,115,143,160,191,255,255,191,160,143,115,107,80,59,44,33,25,19,14,10,8,6,4,3,2,2,1,1};
/**
* @brief ÅäÖÃTIM3¸′óÃêä3ö WMê±óÃμ½μÄI/O
* @param ÎT
* @retval ÎT
*/
static void TIM3_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* GPIOB clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/* ÅäÖÃoôÎüμÆóÃμ½μÄ B0òy½Å */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // ¸′óÃíÆíìêä3ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/**
* @brief ÅäÖÃǶì×Ïòá¿ÖD¶Ï¿ØÖÆÆ÷NVIC
* @param ÎT
* @retval ÎT
*/
static void NVIC_Config_PWM(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* ÅäÖÃTIM3_IRQÖD¶ÏÎaÖD¶ÏÔ′ */
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/**
* @brief ÅäÖÃTIM3êä3öμÄ WMDÅoÅμÄģ꽣¬èçÖüÆú¡¢¼«DÔ
* @param ÎT
* @retval ÎT
*/
/*
* TIMxCLK/CK_PSC --> TIMxCNT --> TIMx_ARR --> ÖD¶Ï & TIMxCNT ÖØD¼Æêy
* TIMx_CCR(μçÆ½·¢éú±ä»ˉ)
*
* DÅoÅÖüÆú=(TIMx_ARR +1 ) * ê±ÖóÖüÆú
*
*/
/* _______ ______ _____ ____ ___ __ _
* |_| |__| |___| |____| |_____| |______| |_______| |________|
*/
static void TIM3_Mode_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
/* éèÖÃTIM3CLK ê±ÖóÎa72MHZ */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //ê1ÄüTIM3ê±Öó
/* »ù±¾¶¨ê±Æ÷ÅäÖà */
TIM_TimeBaseStructure.TIM_Period = 255; //μ±¶¨ê±Æ÷′ó0¼Æêyμ½255£¬¼′Îa266′Σ¬Îaò»¸ö¶¨ê±ÖüÆú
TIM_TimeBaseStructure.TIM_Prescaler = 1999; //éèÖÃÔ¤·ÖÆμ£o
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //éèÖÃê±Öó·ÖÆμÏμêy£o2»·ÖÆμ(ÕaàïóÃ2»μ½)
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //ÏòéϼÆêyÄ£ê½
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
/* PWMÄ£ê½ÅäÖà */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //ÅäÖÃÎaPWMÄ£ê½1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //ê1Äüêä3ö
TIM_OCInitStructure.TIM_Pulse = 0; //éèÖÃ3õê¼ WMÂö3å¿í¶èÎa0
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //μ±¶¨ê±Æ÷¼ÆêyÖμD¡óúCCR1_Valê±ÎaμíμçÆ½
TIM_OC3Init(TIM3, &TIM_OCInitStructure); //ê1Äüí¨μà3
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); //ê1ÄüÔ¤×°ÔØ
TIM_ARRPreloadConfig(TIM3, ENABLE); //ê1ÄüTIM3ÖØÔØ¼Ä′æÆ÷ARR
/* TIM3 enable counter */
TIM_Cmd(TIM3, ENABLE); //ê1Äü¶¨ê±Æ÷3
TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE); //ê1ÄüupdateÖD¶Ï
NVIC_Config_PWM(); //ÅäÖÃÖD¶ÏóÅÏè¼¶
}
/**
* @brief TIM3 oôÎüμÆ3õê¼»ˉ
* ÅäÖà WMÄ£ê½oíGPIO
* @param ÎT
* @retval ÎT
*/
void TIM3_Breathing_Init(void)
{
TIM3_GPIO_Config();
TIM3_Mode_Config();
}
void Key_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*¿aÆô°′¼ü¶Ë¿ú£¨PA£©μÄê±Öó*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
// IO ¿ú×öêäèë¿úê±£¬2»óÃéèÖÃêä3öÆμÂê
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
/*¼ì2aêÇ·ñóD°′¼ü°′Ï */
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == 1 )
{
/*μè′y°′¼üêí·Å */
while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == 1);
return 1;
}
else
return 0;
}
/*********************************************END OF FILE**********************/
[/mw_shl_code]
中断服务函数
[mw_shl_code=c,true]void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //TIM_IT_Update
{
period_cnt++;
if(period_cnt >= 10) //èôêä3öμÄÖüÆúêy′óóú10£¬êä3öÏÂò»ÖÖÂö3å¿íμÄ WM2¨
{
TIM3->CCR3 = indexWave[pwm_index]; //¸ù¾YPWM±íDT¸Ä¶¨ê±Æ÷μıè½Ï¼Ä′æÆ÷Öμ
pwm_index++; //±êÖ¾ WM±íμÄÏÂò»¸öÔaËØ
if( pwm_index >= 44) //èô WMÂö3å±íòѾ-êä3öíê3éò»±é£¬ÖØÖÃPWM2é±í±êÖ¾
{
pwm_index=0;
}
period_cnt=0; //ÖØÖÃÖüÆú¼Æêy±êÖ¾
}
TIM_ClearITPendingBit (TIM3, TIM_IT_Update); //±ØDëòaÇå3yÖD¶Ï±ê־λ
}
}[/mw_shl_code]
|
最佳答案
查看完整内容[请看2#楼]
关闭的时候将占空比设置为0就可以了,也就是你的TIM3->CCR3,并且将对应的数组下标pwm_index 设置为0
|