stm32常用驅動源碼

源碼的目錄結構如下:


    STM32LIB

     USER



    USER目錄如下

            hardware_dri

            main

            software_module


hardware_dri目錄

wKiom1Xr_x6hUsMGAAH2GdQ1OgU926.jpg





Adc_hard_dri.c



//uiAdData:存放AD採樣的數據
//ucSampleNum:存放AD採樣的次數
//ucRemoveNum:存放最低值與最高值的個數
//去掉的數值放在數組0-(cRemoveNum-1)及(cSampleNum-ucRemoveNum)-(ucSampleNum-1),即最大值與最小值均放在兩端
void choise(u16 *uiAdData,u8 ucSampleNum,u8 ucRemoveNum)
{
 u32  i,j,k,temp;

 for(i=0;i<ucRemoveNum;i++)//將最小的ucRemoveNum值排在數組的前ucRemoveNum位
 {
  k=i; /*給記號賦值*/

  for(j=i+1;j<ucSampleNum;j++)

   if(uiAdData[k]>uiAdData[j]) k=j; /*是k總是指向最小元素*/

  if(i!=k)
  {   /*當k!=i是才交換,否則a[i]即爲最小*/
   temp=uiAdData[i];

   uiAdData[i]=uiAdData[k];

   uiAdData[k]=temp;
  }
 }
 
 for(i=ucSampleNum-1;i>ucSampleNum-ucRemoveNum-1;i--)//將最大的ucRemoveNum排在數組的後ucRemoveNum位
 {
  k=i; /*給記號賦值*/

  for(j=i-1;j>1;j--)

   if(uiAdData[k]<uiAdData[j]) k=j; /*是k總是指向最大元素*/

  if(i!=k)
  {  
   temp=uiAdData[i];

   uiAdData[i]=uiAdData[k];

   uiAdData[k]=temp;
  }
 }
}






//初始化 ADC
//這裏我們僅以規則通道爲例
//我們默認將開啓通道 0~3              
void   Adc_Init(void)
{

 ADC_InitTypeDef   ADC_InitStructure;
 GPIO_InitTypeDef  GPIO_InitStructure;


 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1  , ENABLE );    //使能 ADC1 通道時鐘
 RCC_ADCCLKConfig(RCC_PCLK2_Div6);    //設置 ADC 分頻因子 6
 //72M/6=12,ADC 最大時間不能超過 14M
 //PA1  作爲模擬通道輸入引腳


 
 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模擬輸入
 GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化 GPIOA
 ADC_DeInit(ADC1);   //復位 ADC1,將外設  ADC1  的全部寄存器重設爲缺省值
 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  //ADC 獨立模式
 ADC_InitStructure.ADC_ScanConvMode = DISABLE;  //單通道模式
 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;  //單次轉換模式
 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//轉換由

 
 //軟件而不是外部觸發啓動
 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  //ADC 數據右對齊
 ADC_InitStructure.ADC_NbrOfChannel = 1;  //順序進行規則轉換的 ADC 通道的數目
 ADC_Init(ADC1, &ADC_InitStructure);  //根據指定的參數初始化外設 ADCx 器
 ADC_Cmd(ADC1, ENABLE);  //使能指定的 ADC1
 ADC_ResetCalibration(ADC1);  //開啓復位校準
 while(ADC_GetResetCalibrationStatus(ADC1));  //等待復位校準結束
 ADC_StartCalibration(ADC1);    //開啓 AD 校準
 while(ADC_GetCalibrationStatus(ADC1));    //等待校準結束
}


//獲得 ADC 值
//ch:通道值  0~3
u16 Get_Adc(u8 ch)  
{

  //設置指定 ADC 的規則組通道,設置它們的轉化順序和採樣時間
  ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );  //通道 1
  //規則採樣順序值爲 1,採樣時間爲 239.5 週期    
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);  //使能指定的 ADC1 的
  //軟件轉換啓動功能
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待轉換結束
  return ADC_GetConversionValue(ADC1);  //返回最近一次 ADC1 規則組的轉換結果
  
  
}


//求平均函數
u16 Get_Adc_Average(u8 ch)
{

 
 u16  uiAdd=0;
 
 u8  ucSampleNum=16;
 
 u8  ucRemoveNum=2;
 
 u16 uiAdData[16]={0};
 
 u8  i;
 
 //連續多次次採樣  
 for(i=0;i<ucSampleNum;i++)
  
  uiAdData[i]=Get_Adc(ch); //讀取AD轉換結果,賦予數組
  
 choise(uiAdData,ucSampleNum,ucRemoveNum) ;//去掉倆個最大值、去掉兩個最小值

 for(i=ucRemoveNum;i<ucSampleNum-ucRemoveNum;i++)
 {
  uiAdd+=uiAdData[i];
 }

 return (uiAdd/((u16)(ucSampleNum-2*ucRemoveNum)));   //返回平均值

}









#include "stm32f10x.h"/*
1,初始化GPIO位輸入和時鐘
2,初始化複用時鐘
3,將gpio和外部中斷掛鉤起來
4,設置外部中斷參數、
5,設置中斷向量參數


stm32外部中斷線16個      可以匹配到任意的io口,
但外部中斷函數只有6個

EXPORT   EXTI0_IRQHandler         
EXPORT   EXTI1_IRQHandler      
EXPORT   EXTI2_IRQHandler        
EXPORT   EXTI3_IRQHandler       
EXPORT   EXTI4_IRQHandler         
EXPORT   EXTI9_5_IRQHandler       
EXPORT   EXTI15_10_IRQHandler


中斷線 0-4 每個中斷線對應一箇中斷函數,
中斷線 5-9 共用中斷函數 EXTI9_5_IRQHandler,
中斷線 10-15 共用中斷函數 EXTI15_10_IRQHandler

*/


void  Exit_0_Init(u8 IRQChannelPreemptionPriority_exit0, u8  IRQChannelSubPriority_exit0)
{

  GPIO_InitTypeDef    GPIO_InitStructure;
  EXTI_InitTypeDef     EXTI_InitStructure;
  NVIC_InitTypeDef     NVIC_InitStructure;

 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;           //要設置的PIN
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;  //下拉輸入
        GPIO_Init(GPIOA,&GPIO_InitStructure);        //配置 IO



    
  //將gpioA 和外步中斷0連接起來  就是gpioA.0和外部中斷0
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);


 

 //外部中斷參數 
 EXTI_InitStructure.EXTI_Line= EXTI_Line0;    //選中斷0
 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;   //模式是中斷觸發
 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising ;  //上升沿電平觸發
 EXTI_InitStructure.EXTI_LineCmd = ENABLE;        //中斷使能
 

 EXTI_Init(&EXTI_InitStructure);          //初始化



 //中斷向量參數
 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;  //使能按鍵所在的外部中斷通道
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = IRQChannelPreemptionPriority_exit0;  //搶佔優先級 2,
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = IRQChannelSubPriority_exit0;    //子優先級 2
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //使能外部中斷通道

 NVIC_Init(&NVIC_InitStructure); //初始化


}








#include "stm32f10x.h"


//定時器 5 通道 1 輸入捕獲配置
TIM_ICInitTypeDef   TIM4_ICInitStructure;


void TIM4_Cap_Init(u16 arr,u16 psc)
{  

  GPIO_InitTypeDef GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

   
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);  //①使能 TIM4 時鐘


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   //①使能 GPIOB 時鐘

  
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6;   //PB6 清除之前設置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PB6  輸入
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化 GPIOB.6  ①
  GPIO_ResetBits(GPIOB,GPIO_Pin_6);  //PB6  下拉


 
  TIM_TimeBaseStructure.TIM_Period = arr; //設定計數器自動重裝值
  TIM_TimeBaseStructure.TIM_Prescaler =psc;    //預分頻器
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_tim
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //TIM 向上計數模式
  TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //②根據指定的參數初始化 TIMx

    
  TIM4_ICInitStructure.TIM_Channel = TIM_Channel_1; //  選擇輸入端  IC1 映射到 TI1 上
  TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;  //上升沿捕獲
  TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到 TI1 上
  TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;    //配置輸入分頻,不分頻
  TIM4_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000  配置輸入濾波器  不濾波
  TIM_ICInit(TIM4, &TIM4_ICInitStructure);//③初始化 TIM4 輸入捕獲通道 1


    
  NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;   //TIM3 中斷
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;   //先佔優先級 2 級
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   //從優先級 0 級
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
  NVIC_Init(&NVIC_InitStructure);   //⑤根據指定的參數初始化 NVIC

  
  TIM_ITConfig(  TIM4,TIM_IT_Update|TIM_IT_CC1,ENABLE);//④允許更新中斷捕獲中斷
  TIM_Cmd(TIM4,ENABLE );    //⑥使能定時器 4
}







#include "stm32f10x.h"
#include "Iwdg_hard_dri.h"


//初始化獨立看門狗
//prer:分頻數:0~7(只有低 3 位有效!)
//分頻因子=4*2^prer.但最大值只能是 256!
//rlr:重裝載寄存器值:低 11 位有效.
//時間計算(大概):Tout=((4*2^prer)*rlr)/40 (ms).
//prer 4   rlr 625   時間是1s
void IWDG_Init(u8 prer,u16 rlr)
{
 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);   //①使能對寄存器 I 寫操作
 IWDG_SetPrescaler(prer);   //②設置 IWDG 預分頻值:設置 IWDG 預分頻值
 IWDG_SetReload(rlr);   //②設置 IWDG 重裝載值
 IWDG_ReloadCounter();   //③按照 IWDG 重裝載寄存器的值重裝載 IWDG 計數器
 IWDG_Enable();   //④使能 IWDG
}
//喂獨立看門狗
void IWDG_Feed(void)
{  
 IWDG_ReloadCounter();//reload                    
}









#include "stm32f10x.h"
#include "Pwm_hard_dri.h"


//TIM2 -----TIM5都一樣
//TIM3 PWM 部分初始化
//PWM 輸出初始化
//arr:自動重裝值
//psc:時鐘預分頻數 
//pwm頻率= 72000000/((arr+1)*(psc+1))       hz
//週期 = ((arr+1)*(psc+1))/72000000          s
//  arr 爲計數值

//通用定時器每個都可以產生TIMX_CH1---4   路pwm

void TIM3_PWM_Init(u16 arr,u16 psc)

  GPIO_InitTypeDef GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
  TIM_OCInitTypeDef   TIM_OCInitStructure;

  
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  //①使能定時器 3 時鐘
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);   //①使能 GPIO 和 AFIO 複用功能時鐘
  
  GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //②重映射  TIM3_CH2->PB5   

  
  //設置該引腳爲複用輸出功能,輸出 TIM3 CH2 的 PWM 脈衝波形  GPIOB.5
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //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; //設置預分頻值
  TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_tim
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上計數模式
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //③初始化 TIMx


  
  //初始化 TIM3 Channel2 PWM 模式     一般有4個通道
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇 PWM 模式 2
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性高
  TIM_OC2Init(TIM3, &TIM_OCInitStructure);   //④初始化外設 TIM3 OC2
  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);   //使能預裝載寄存器
  TIM_Cmd(TIM3, ENABLE);   //⑤使能 TIM3
  
}


//  pwmval越大,正脈寬越小
void TIM3_pwm_out(u16 pwmval)
{


 TIM_SetCompare2(TIM3, pwmval);


}








#include "stm32f10x.h"
#include "Time_hard_dri.h"


//@
//通用定時器 3 中斷初始化
//這裏時鐘選擇爲 APB1 的 2 倍,而 APB1 爲 36M
//arr:自動重裝值。
//psc:時鐘預分頻數
//這裏使用的是定時器 3!        Tout= ((arr+1)*(psc+1))/Tclk?
//  Tout= ((4999+1)*( 7199+1))/72=500000us=500ms。
/*
 Tclk:TIM3 的輸入時鐘頻率(單位爲 Mhz)。
 Tout:TIM3 溢出時間(單位爲 us)。

 TIM2---TIM5  都一樣
*/

void TIM2_User_Init(u16 arr,u16 psc,u8   IRQChannelPreemptionPriority_TIM2, u8   IRQChannelSubPriority_TIM2)
{

 TIM_TimeBaseInitTypeDef     TIM_TimeBaseStructure;
 NVIC_InitTypeDef       NVIC_InitStructure;


  
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //①時鐘 TIM3 使能
 
 //定時器 TIM3 初始化
 TIM_TimeBaseStructure.TIM_Period = arr; //設置自動重裝載寄存器週期的值
 TIM_TimeBaseStructure.TIM_Prescaler = psc;//設置時鐘頻率除數的預分頻值
 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //設置時鐘分割
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //TIM 向上計數

 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //②初始化 TIM3

 
 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //③允許更新中斷

 
 //中斷優先級 NVIC 設置
 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;   //TIM3 中斷
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = IRQChannelPreemptionPriority_TIM2;   //先佔優先級 0 級
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = IRQChannelSubPriority_TIM2;   //從優先級 3 級
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
 
 NVIC_Init(&NVIC_InitStructure); //④初始化 NVIC 寄存器
 
 TIM_Cmd(TIM2, ENABLE);   //⑤使能 TIM3

 
}


void TIM2_Stop(void)
{

 TIM_Cmd(TIM2, DISABLE);

}



//@
//通用定時器 3 中斷初始化
//這裏時鐘選擇爲 APB1 的 2 倍,而 APB1 爲 36M
//arr:自動重裝值。
//psc:時鐘預分頻數
//這裏使用的是定時器 3!        Tout= ((arr+1)*(psc+1))/Tclk?
//  Tout= ((4999+1)*( 7199+1))/72=500000us=500ms。
/*
 Tclk:TIM3 的輸入時鐘頻率(單位爲 Mhz)。
 Tout:TIM3 溢出時間(單位爲 us)。

 TIM2---TIM5  都一樣
*/

void TIM3_User_Init(u16 arr,u16 psc,u8   IRQChannelPreemptionPriority_TIM3, u8   IRQChannelSubPriority_TIM3)
{

 TIM_TimeBaseInitTypeDef     TIM_TimeBaseStructure;
 NVIC_InitTypeDef       NVIC_InitStructure;


  
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //①時鐘 TIM3 使能
 
 //定時器 TIM3 初始化
 TIM_TimeBaseStructure.TIM_Period = arr; //設置自動重裝載寄存器週期的值
 TIM_TimeBaseStructure.TIM_Prescaler = psc;//設置時鐘頻率除數的預分頻值
 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //設置時鐘分割
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //TIM 向上計數

 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //②初始化 TIM3

 
 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //③允許更新中斷

 
 //中斷優先級 NVIC 設置
 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;   //TIM3 中斷
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = IRQChannelPreemptionPriority_TIM3;   //先佔優先級 0 級
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = IRQChannelSubPriority_TIM3;   //從優先級 3 級
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
 
 NVIC_Init(&NVIC_InitStructure); //④初始化 NVIC 寄存器
 
 TIM_Cmd(TIM3, ENABLE);   //⑤使能 TIM3

 
}


void TIM3_Stop(void)
{

 TIM_Cmd(TIM3, DISABLE);

}


void TIM4_User_Init(u16 arr,u16 psc,u8   IRQChannelPreemptionPriority_TIM4, u8   IRQChannelSubPriority_TIM4)
{

 TIM_TimeBaseInitTypeDef     TIM_TimeBaseStructure;
 NVIC_InitTypeDef       NVIC_InitStructure;


  
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //①時鐘 TIM3 使能
 
 //定時器 TIM3 初始化
 TIM_TimeBaseStructure.TIM_Period = arr; //設置自動重裝載寄存器週期的值
 TIM_TimeBaseStructure.TIM_Prescaler = psc;//設置時鐘頻率除數的預分頻值
 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //設置時鐘分割
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //TIM 向上計數

 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //②初始化 TIM3

 
 TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //③允許更新中斷

 
 //中斷優先級 NVIC 設置
 NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;   //TIM3 中斷
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = IRQChannelPreemptionPriority_TIM4;   //先佔優先級 0 級
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = IRQChannelSubPriority_TIM4;   //從優先級 3 級
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
 
 NVIC_Init(&NVIC_InitStructure); //④初始化 NVIC 寄存器
 
 TIM_Cmd(TIM4, ENABLE);   //⑤使能 TIM3

 
}


void TIM4_Stop(void)
{

 TIM_Cmd(TIM4, DISABLE);

}



void TIM5_User_Init(u16 arr,u16 psc,u8   IRQChannelPreemptionPriority_TIM5, u8   IRQChannelSubPriority_TIM5)
{

 TIM_TimeBaseInitTypeDef     TIM_TimeBaseStructure;
 NVIC_InitTypeDef       NVIC_InitStructure;


  
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //①時鐘 TIM3 使能
 
 //定時器 TIM3 初始化
 TIM_TimeBaseStructure.TIM_Period = arr; //設置自動重裝載寄存器週期的值
 TIM_TimeBaseStructure.TIM_Prescaler = psc;//設置時鐘頻率除數的預分頻值
 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //設置時鐘分割
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //TIM 向上計數

 TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //②初始化 TIM3

 
 TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE ); //③允許更新中斷

 
 //中斷優先級 NVIC 設置
 NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;   //TIM3 中斷
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = IRQChannelPreemptionPriority_TIM5;   //先佔優先級 0 級
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = IRQChannelSubPriority_TIM5;   //從優先級 3 級
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
 
 NVIC_Init(&NVIC_InitStructure); //④初始化 NVIC 寄存器
 
 TIM_Cmd(TIM5, ENABLE);   //⑤使能 TIM3

 
}


void TIM5_Stop(void)
{

 TIM_Cmd(TIM5, DISABLE);

}







#include "stm32f10x.h"
#include "Uart_hard_dri.h"



/*

1:使能串口和gpio時鐘
2:串口復位
3:初始化gpio和串口參數
4:串口中斷使能
5:向量中斷設置

*/


void  User_Uart1_init(u32  BAUD1  ,u8   IRQChannelPreemptionPriority_uart1, u8   IRQChannelSubPriority_uart1 )
{


   NVIC_InitTypeDef    NVIC_InitStructure;
 
    GPIO_InitTypeDef    GPIO_InitStructure;
        
        USART_InitTypeDef   USART_InitStructure;  
      

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
 
        //打開時鐘

   USART_DeInit(USART1);
  //串口復位 

  
        
        /* USART1 GPIO config */
  
        /* Configure USART1 Tx (PA.09) as alternate function push-pull */
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;           //要設置的PIN
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //複用推輓輸出
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;        //輸出速度
        GPIO_Init(GPIOA,&GPIO_InitStructure);        //配置 IO
  
        /* Configure USART1 Rx (PA.10) as input floating */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  //RX 接收引腳
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;        //浮空輸入模式
        GPIO_Init(GPIOA, &GPIO_InitStructure);          //配置IO口

        /* USART1 mode config */
        USART_InitStructure.USART_BaudRate= BAUD1;   //設定波特率
        USART_InitStructure.USART_WordLength=USART_WordLength_8b;  //8位數據
        USART_InitStructure.USART_StopBits=USART_StopBits_1;   //停止位1位
        USART_InitStructure.USART_Parity=USART_Parity_No;  //無校驗位
        USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//無硬件控制 CTS RTS
        USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;  //發送接收 使能
        USART_Init(USART1,&USART_InitStructure); //配置USART1


       USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//串口接收中斷使能


 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn ;//通道設置爲串口1中斷

 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = IRQChannelPreemptionPriority_uart1; //中斷佔先等級0

 NVIC_InitStructure.NVIC_IRQChannelSubPriority = IRQChannelSubPriority_uart1;               //中斷響應優先級0

 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           //打開中斷

 NVIC_Init(&NVIC_InitStructure);                                        //初始化

  
       
       USART_Cmd(USART1,ENABLE); //使能 串口1      

}


void  User_Uart1_Send_Byte(u8 byte)   //串口發送一個字節
{
               USART_SendData(USART1, byte);      
        while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET); 
        //等待發送完成。   檢測 USART_FLAG_TC 是否置1;  
       
}



void  User_Uart2_init(u32  BAUD2, u8   IRQChannelPreemptionPriority_uart2, u8   IRQChannelSubPriority_uart2)
{


   NVIC_InitTypeDef    NVIC_InitStructure;
 
    GPIO_InitTypeDef    GPIO_InitStructure;
        
        USART_InitTypeDef   USART_InitStructure;  
      

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE); //485收發控制端口
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);


 
 
 
        //打開時鐘

   USART_DeInit(USART2);
  //串口復位 


   //485使能端
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;     //PG9端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //推輓輸出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);


 
 
        
        /* USART1 GPIO config */
  
        /* Configure USART2 Tx (PA.02) as alternate function push-pull */
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;           //要設置的PIN
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //複用推輓輸出
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;        //輸出速度
        GPIO_Init(GPIOA,&GPIO_InitStructure);        //配置 IO
  
        /* Configure USART2 Rx (PA.03) as input floating */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;  //RX 接收引腳
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;        //浮空輸入模式
        GPIO_Init(GPIOA, &GPIO_InitStructure);          //配置IO口

        /* USART2 mode config */
        USART_InitStructure.USART_BaudRate=9600;   //設定波特率
        USART_InitStructure.USART_WordLength=USART_WordLength_8b;  //8位數據
        USART_InitStructure.USART_StopBits=USART_StopBits_1;   //停止位1位
        USART_InitStructure.USART_Parity=USART_Parity_No;  //無校驗位
        USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//無硬件控制 CTS RTS
        USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;  //發送接收 使能
        USART_Init(USART2,&USART_InitStructure); //配置USART1


       USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//串口接收中斷使能


 NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn ;//通道設置爲串口2中斷

 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = IRQChannelPreemptionPriority_uart2; //中斷佔先等級0

 NVIC_InitStructure.NVIC_IRQChannelSubPriority = IRQChannelSubPriority_uart2;               //中斷響應優先級0

 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           //打開中斷

 NVIC_Init(&NVIC_InitStructure);                                        //初始化

  
       
       USART_Cmd(USART2,ENABLE); //使能 串口1      

}



void  User_Uart2_Send_Byte(u8 byte)   //串口發送一個字節
{

  
               USART_SendData(USART2, byte);      
        while( USART_GetFlagStatus(USART2,USART_FLAG_TC)!= SET); 
        //等待發送完成。   檢測 USART_FLAG_TC 是否置1;  
       
}


 
 // USART_SendData(USART2,buf[t]);



void  User_Uart4_init(u32  BAUD4, u8   IRQChannelPreemptionPriority_uart4, u8   IRQChannelSubPriority_uart4)
{


   NVIC_InitTypeDef    NVIC_InitStructure;
 
    GPIO_InitTypeDef    GPIO_InitStructure;
        
        USART_InitTypeDef   USART_InitStructure;  
      
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);
 
        //打開時鐘

   USART_DeInit(UART4);
  //串口復位 

  
        
        /* USART1 GPIO config */
  
        /* Configure USART4 Tx (Pc.10) as alternate function push-pull */
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;           //要設置的PIN
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //複用推輓輸出
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;        //輸出速度
        GPIO_Init(GPIOC,&GPIO_InitStructure);        //配置 IO
  
        /* Configure USART4 Rx (Pc.11) as input floating */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;  //RX 接收引腳
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;        //浮空輸入模式
        GPIO_Init(GPIOC, &GPIO_InitStructure);          //配置IO口

        /* USART2 mode config */
        USART_InitStructure.USART_BaudRate=9600;   //設定波特率
        USART_InitStructure.USART_WordLength=USART_WordLength_8b;  //8位數據
        USART_InitStructure.USART_StopBits=USART_StopBits_1;   //停止位1位
        USART_InitStructure.USART_Parity=USART_Parity_No;  //無校驗位
        USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//無硬件控制 CTS RTS
        USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;  //發送接收 使能
        USART_Init(UART4,&USART_InitStructure); //配置USART1


       USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//串口接收中斷使能


 NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn ;//通道設置爲串口2中斷

 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = IRQChannelPreemptionPriority_uart4; //中斷佔先等級0

 NVIC_InitStructure.NVIC_IRQChannelSubPriority = IRQChannelSubPriority_uart4;               //中斷響應優先級0

 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           //打開中斷

 NVIC_Init(&NVIC_InitStructure);                                        //初始化

  
       
       USART_Cmd(UART4,ENABLE); //使能 串口1      

}



void  User_Uart4_Send_Byte(u8 byte)   //串口發送一個字節
{
               USART_SendData(UART4, byte);      
        while( USART_GetFlagStatus(UART4,USART_FLAG_TC)!= SET); 
        //等待發送完成。   檢測 USART_FLAG_TC 是否置1;  
       
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章