|
求助!編寫的程序不知道哪里出了錯(cuò)!調(diào)節(jié)不了亮度#include "stm32f10x.h" //包含stm32f10x.h的頭文件
void delay_nms(uint16_t ms) //定義毫秒延時(shí)子函數(shù)
{
uint16_t i;//定義無符號(hào)字符型
for(;ms>0;ms--) //毫秒級(jí)
for(i=10000;i>0;i--);
}
//LED的初始化配置函數(shù)
void LED_config(void)
{
GPIO_InitTypeDef gpio; //定義InitTypeDef類型的結(jié)構(gòu)體指針 gpio
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA的外設(shè)時(shí)鐘
gpio.GPIO_Mode=GPIO_Mode_AF_PP;//復(fù)用推挽輸出
gpio.GPIO_Pin=GPIO_Pin_7;
gpio.GPIO_Speed=GPIO_Speed_2MHz; //速度50MHZ
GPIO_Init(GPIOA,&gpio); //調(diào)用GPIO_Init函數(shù) 對(duì)GPIOA口初始化
}
void KEY_config(void) //KEY_按鍵的初始化配置函數(shù)
{
GPIO_InitTypeDef gpio; //定義結(jié)構(gòu)體
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA的時(shí)鐘
gpio.GPIO_Mode=GPIO_Mode_IPU; //輸入上拉模式
gpio.GPIO_Pin=GPIO_Pin_15;
GPIO_Init(GPIOA,&gpio); //GPIOA口初始化
}
uint8_t KEY_scan(void) //判別哪個(gè)按鍵按下程序 按鍵掃描
{
uint8_t rtl; //定義一個(gè)rtl,用來接收按鍵返回的值
if((GPIO_ReadInputData(GPIOA)&0xF)==0XF)// 判別是否有 鍵按下
return 0xff; //如果沒有按鍵按下,返回FF
delay_nms(10); //延時(shí)消抖
if((GPIO_ReadInputData(GPIOA)&0XF)==0XF) //再次判別是否有鍵按下_
return 0xff; //如果沒有按鍵按下,返回FF
rtl=GPIO_ReadInputData(GPIOA)&0xF; //返回鍵值
while((GPIO_ReadInputData(GPIOA)&0XF)!=0XF); //等待按鍵釋放
return rtl; //返回鍵值
}
void TIM3_CH2_PWM_Init(u16 per,u16 psc)//TIM2定時(shí)器中斷PWM波的初始化配置
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* 開啟時(shí)鐘 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
/* 配置GPIO的模式和IO口 */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復(fù)用推挽輸出
GPIO_Init(GPIOA,&GPIO_InitStructure);
TIM_TimeBaseInitStructure.TIM_Period=per; //自動(dòng)裝載值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分頻系數(shù)
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //設(shè)置向上計(jì)數(shù)模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OC2Init(TIM3,&TIM_OCInitStructure); //輸出比較通道2初始化
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); //使能TIMx在 CCR2 上的預(yù)裝載寄存器
TIM_ARRPreloadConfig(TIM3,ENABLE);//使能預(yù)裝載寄存器
TIM_Cmd(TIM3,ENABLE); //使能定時(shí)器
}
int main(void)
{
uint16_t PWM=1000; //定義PWM波初始值為1000 即CRR的值
LED_config();//初始化燈
KEY_config();//初始化按鍵
TIM3_CH2_PWM_Init(500,72-1); //初始化PWM函數(shù)
while(1)
{
if(KEY_scan()==0xe)//按鍵按下
{
PWM-=200; //CCR的值右移一位,即除以2 原始PWM值:100% 按鍵按一次除一次為: 50%,25%,12.5%
if(PWM==0)//若CCR和seg的值小于125,則再賦值=為1000。
{
PWM=1000;
}
}
TIM_SetCompare2(TIM3,PWM);//函數(shù),把PWM變量的值寫入TIM2的輸出通道3的CCR寄存器中,修改PWM占空比。
}
}
|
|