void RCC1_HSE_Configuration(void) //HSE作為PLL時鐘,PLL作為SYSCLK
{
RCC_DeInit(); /*將外設RCC寄存器重設為缺省值 */
RCC_HSEConfig(RCC_HSE_ON); /*設置外部高速晶振(HSE) HSE晶振打開(ON)*/
if(RCC_WaitForHSEStartUp() == SUCCESS) { /*等待HSE起振, SUCCESS:HSE晶振穩(wěn)定且就緒*/
RCC_HCLKConfig(RCC_SYSCLK_Div1);/*設置AHB時鐘(HCLK)RCC_SYSCLK_Div1——AHB時鐘 = 系統(tǒng)時*/
RCC_PCLK2Config(RCC_HCLK_Div1); /*設置高速AHB時鐘(PCLK2)RCC_HCLK_Div1——APB2時鐘 = HCLK*/
RCC_PCLK1Config(RCC_HCLK_Div2); /*設置低速AHB時鐘(PCLK1)RCC_HCLK_Div2——APB1時鐘 = HCLK / 2*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/*設置PLL時鐘源及倍頻系數(shù)*/
RCC_PLLCmd(ENABLE); /*使能PLL */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ; /*檢查指定的RCC標志位(PLL準備好標志)設置與否*/
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /*設置系統(tǒng)時鐘(SYSCLK) */
while(RCC_GetSYSCLKSource() != 0x08); /*0x08:PLL作為系統(tǒng)時鐘 */
}
}
void TurnLeft1()
{
IN1_H IN2_L
IN3_H IN4_L
XX=500;
YY=800;
TimCounterInit1(XX,YY);
}
void TurnRight1(void)
{
IN1_H IN2_L
IN3_H IN4_L
XX=800;
YY=500;
TimCounterInit1(XX,YY);
}
void straight1(void)
{
IN1_H IN2_L
IN3_H IN4_L
XX=600;
YY=600;
TimCounterInit1(XX,YY);
}
void sternway1(void)
{
IN1_L IN2_H
IN3_L IN4_H
XX=700;
YY=700;
TimCounterInit1(XX,YY);
}
void Gpio_PWM_Init1(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//以下設定是將TIM1的通道1(PA0)的復用功能打開,這很重要很容易被忘掉
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_PWM_8; //選擇PA0 PA8|GPIO_PWM_B
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管腳頻率為50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //模式為復用推挽輸出
GPIO_Init(GPIO_A, &GPIO_InitStructure); //初始化寄存器
}
void Gpio_M_Init1(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_IN1|GPIO_Pin_IN2|GPIO_Pin_IN3|GPIO_Pin_IN4; //選擇1256
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管腳頻率為50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIO_IN, &GPIO_InitStructure); //初始化寄存器GPIOB 1 2 5 6
}
/********************************************************************************************
*函數(shù)名稱:void TimCounterInit(void)
*功能說明:TIM計數(shù)初始化配置
* TIMCLK = 72 MHz, Prescaler = TIM_PSC, TIM counter clock = TIMCLK/TIM_COUNTER MHz
*******************************************************************************************/
void TimCounterInit1(int rate_1,int rate_2) //rate可以改變占空比
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
/* TIM時鐘使能 */
RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
/* 基定時器初始化 */
TIM_TimeBaseStructure.TIM_Period = 1000000*0.001; //計數(shù)值 1000;須介于0~65535
TIM_TimeBaseStructure.TIM_Prescaler = 72; //分頻系數(shù),為了設定值數(shù)值較大,這里選得較小
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //時鐘分割:計數(shù)模式中無作用
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //計數(shù)模式,向上計數(shù)
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //重復計數(shù)值
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //初始化TIM
/* PWM1 Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//輸出模式設定
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//輸出模式使能
TIM_OCInitStructure.TIM_Pulse = rate_1; //設置占空比,0時全低電平,1001時全高電平.須介于0~65535
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//輸出比較極性;最終輸出值是高/低電平
TIM_OC1Init(TIM1, &TIM_OCInitStructure);//輸出通道x,參數(shù)寫入
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);//使能通道x預裝載寄存器
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//輸出模式設定
TIM_OCInitStructure.TIM_Pulse = rate_2; //設置占空比,0時全低電平,1001時全高電平.須介于0~65535
TIM_OC2Init(TIM1, &TIM_OCInitStructure);//輸出通道x,參數(shù)寫入
TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);//使能通道x預裝載寄存器
TIM_Cmd(TIM1, ENABLE); //使能TIM
}
|