智能車學習(十五)——K60野火2013版例程


一、中斷函數注冊方法:

1、格式:

配置某個功能的中斷
注冊中斷函數
開啟中斷

2、一個例子

pit_init_ms(PIT0,5);//定時中斷初始化
set_vector_handler(PIT0_VECTORn ,PIT0_IRQHandler);      //設置PIT0的中斷服務函數為 PIT0_IRQHandler
enable_irq (PIT0_IRQn);

 

二、ADC模塊

1、ADC通道管腳對應表

typedef enum
{
    // ---------------------------------ADC0-------------------------
    ADC0_DP0,
    ADC0_DP1,
    PGA0_DP,        //不支持ADC,需要配置 ADC PGA register 設置放大增益
    ADC0_DP3,
    //軟件觸發不支持B通道
    ADC0_SE4b,      // PTC2     不支持軟件ADC
    ADC0_SE5b,      // PTD1     不支持軟件ADC
    ADC0_SE6b,      // PTD5     不支持軟件ADC
    ADC0_SE7b,      // PTD6     不支持軟件ADC

    ADC0_SE8,       // PTB0
    ADC0_SE9,       // PTB1
    ADC0_SE10,      // PTA7
    ADC0_SE11,      // PTA8
    ADC0_SE12,      // PTB2
    ADC0_SE13,      // PTB3
    ADC0_SE14,      // PTC0
    ADC0_SE15,      // PTC1
    ADC0_SE16,      // ADC0_SE16
    ADC0_SE17,      // PTE24
    ADC0_SE18,      // PTE25
    ADC0_DM0,       // ADC0_DM0
    ADC0_DM1,       // ADC0_DM1
    RES0,           // 保留
    RES1,           // 保留
    DAC0_OUT,       // DAC0輸出 不支持ADC
    RES2,           // 保留
    RES3,           // 保留
    Temp0_Sensor,   // Temperature Sensor,內部溫度測量,可用ADC函數
    Bandgap0,       // 溫度補償結構帶隙基准源   不支持ADC
    RES4,           // 保留
    VREFH0,         // 參考高電壓,可用ADC函數 ,結果恆為 2^n-1
    VREFL0,         // 參考低電壓,可用ADC函數 ,結果恆為 0
    Module0_Dis,    // 不支持 ADC

    // ---------------------------------ADC1-------------------------
    ADC1_DP0,
    ADC1_DP1,
    PGA1_DP,        // 不支持 ADC
    ADC1_DP3,
    ADC1_SE4a,      // PTE0
    ADC1_SE5a,      // PTE1
    ADC1_SE6a,      // PTE2
    ADC1_SE7a,      // PTE3

    ADC1_SE4b = ADC1_SE4a,  // PTC8     不支持軟件ADC ,傳遞 ADC1_SE4b 到軟件ADC函數里,會當作 ADC1_SE4a 處理。
    ADC1_SE5b = ADC1_SE5a,  // PTC9     不支持軟件ADC
    ADC1_SE6b = ADC1_SE6a,  // PTC10    不支持軟件ADC
    ADC1_SE7b = ADC1_SE7a,  // PTC11    不支持軟件ADC

    ADC1_SE8,       // PTB0
    ADC1_SE9,       // PTB1
    ADC1_SE10,      // PTB4
    ADC1_SE11,      // PTB5
    ADC1_SE12,      // PTB6
    ADC1_SE13,      // PTB7
    ADC1_SE14,      // PTB10
    ADC1_SE15,      // PTB11
    ADC1_SE16,      // ADC1_SE16
    ADC1_SE17,      // PTA17
    VREF_OUTPUT,    // VREF Output
    ADC1_DM0,       // ADC1_DM0
    ADC1_DM1,       // ADC1_DM1
    RES5,           //保留
    RES6,
    DAC1_OUT,
    RES7,           //保留
    RES8,
    Temp1_Sensor,
    Bandgap1,       // 溫度補償結構帶隙基准源   不支持ADC
    RES9,
    VREFH1,         // 參考高電壓,可用ADC函數 ,結果恆為 2^n-1
    VREFL1,         // 參考低電壓,可用ADC函數 ,結果恆為 0
    Module1_Dis,    // 不支持 ADC

} ADCn_Ch_e;

 

2、精度選擇

//精度位數
typedef enum ADC_nbit
{
    ADC_8bit   = 0x00,
    ADC_10bit  = 0x02,
    ADC_12bit  = 0x01,
    ADC_16bit  = 0x03
} ADC_nbit;

 

3、接口使用

//外部函數接口聲明

 //初始化 ADC0_SE10 ,使用 PTA7 管腳
extern void     adc_init    (ADCn_Ch_e);                //ADC初始化

// ADCn_Ch_e    ADC通道
//ADC_nbit          ADC精度
extern uint16   adc_once    (ADCn_Ch_e, ADC_nbit);      //采集一次一路模擬量的AD值


extern uint16   ad_flt(ADCn_Ch_e adcn_ch, ADC_nbit bit);//與前幾次采樣平均
extern uint16   ad_ave(ADCn_Ch_e adcn_ch, ADC_nbit bit, uint8 N); //均值濾波
extern void     adc_stop    (ADCn_e);                   //停止ADC轉換

 

 

三、DAC模塊(智能車不使用)

typedef enum DACn       //DAC模塊
{
    DAC0,
    DAC1
} DACn_e;

extern void dac_init(DACn_e);               //DAC一次轉換初始化
extern void dac_out(DACn_e, uint16 val);    //DAC一次轉換操作

 

四、DMA模塊使用(智能車不使用)

1、使用目的

      傳輸數據使用,這樣子的話可以和主程序同時進行。這樣子的話,可以在數據量大的時候不占用程序執行的時間。

2、使用方法API

/*!
 *  @brief      DMA初始化,讀取端口數據到內存
 *  @param      DMA_CHn         通道號(DMA_CH0 ~ DMA_CH15)
 *  @param      SADDR           源地址( (void * )&PTx_Bn_IN 或 (void * )&PTx_Wn_IN   )
 *  @param      DADDR           目的地址
 *  @param      PTxn            觸發端口
 *  @param      DMA_BYTEn       每次DMA傳輸字節數
 *  @param      count           一個主循環傳輸字節數
 *  @param      cfg             DMA傳輸配置,從DMA_cfg里選擇
 *  @since      v5.0
 *  @note       DMA PTXn觸發源默認上升沿觸發傳輸,若需修改,則初始化后調用 port_init 配置DMA 觸發方式
                初始化后,需要調用 DMA_EN 來實現
 *  Sample usage:   uint8 buff[10];
                    dma_portx2buff_init(DMA_CH0, PTB_B0_IN, buff, PTA7, DMA_BYTE1, 10, DADDR_RECOVER);
                    //DMA初始化,源地址:PTB_B0_IN,目的地址:buff,PTA7觸發(默認上升沿),每次傳輸1字節,共傳輸 10次 ,傳輸結束后恢復地址

                    port_init(PTA7,ALT1 | DMA_FALLING);             //默認觸發源是上升沿,此處改為 下降沿觸發

                    DMA_EN(DMA_CH0);                //需要使能 DMA 后才能傳輸數據
 */
void dma_portx2buff_init(DMA_CHn CHn, void *SADDR, void *DADDR, PTXn_e ptxn, DMA_BYTEn byten, uint32 count, uint32 cfg);

 

五、延時模塊使用(精准)

extern void dwt_delay_us(uint32 us);
extern void dwt_delay_ms(uint32 ms);

 

六、Flash使用

1、API使用

/*----------   *DFLASH  寫浮點數*   ----------*/
void DFlash_Write_Float(uint16_t Block_Now,unsigned int Order,float Write_Float); 


/*----------   *DFLASH  讀浮點數*   ----------*/
float DFlash_Read_Float(uint16_t Block_Now,unsigned int Order);


/*----------   *DFLASH  寫整數*   ----------*/
void DFlash_Write_Int(uint16_t Block_Now,unsigned int Order,signed int Write_Int);   


/*----------   *DFLASH  讀整數*   ----------*/
signed int DFlash_Read_Int(uint16_t Block_Now,unsigned int Order);

 

2、使用注意點:一定要關閉中斷再打開中斷

3、一個DEMO:

/*----------   *用戶寫參數 傳遞函數*   ----------*/
void write_transfer_function(void)
{
  //整形參數傳遞
  //user_int_data[0] = data_int_test;                                 //第一個變量為整形測試變量,往后自己添加需要存貯的變量

  
  
  //浮點型參數傳遞
  //user_float_data[0] = data_float_test;                           //第一個變量為浮點型測試變量,往后自己添加需要存貯的變量
  

  
}


/*----------   *用戶讀參數 傳遞函數*   ----------*/
void read_transfer_function(void)
{
    DisableInterrupts;
  //整形參數傳遞
  //data_int_test = user_int_data[0];                                 //第一個變量為整形測試變量,往后自己添加需要存貯的變量
    
  //浮點型參數傳遞
  //data_float_test = user__float_data[0];                           //第一個變量為浮點型測試變量,往后自己添
  
  
  EnableInterrupts; 
  
}


/*----------   *flash 寫入用戶自定義參數函數*   ----------*/
void Write_data(uint8_t SECTOR_NUM)
{
  int int_start = 1,float_start = 101;
  DisableInterrupts;
  flash_erase_sector(SECTOR_NUM);
  write_transfer_function();
  
  
  for(int_start = 1;int_start < 100;int_start++)
    DFlash_Write_Int(SECTOR_NUM,int_start,user_int_data[int_start - 1]);              //從偏移地址1開始,寫入整形數據
  
  
  for(float_start = 101;float_start < 200;float_start++)
    DFlash_Write_Float(SECTOR_NUM,float_start,user_float_data[float_start - 101]);   //從偏移地址101開始,寫入浮點型數據
  
  
  EnableInterrupts;  
}


/*----------   *flash 讀取用戶自定義參數函數*   ----------*/
void Read_data(uint8_t SECTOR_NUM)
{
  int int_start = 1,float_start = 101;
  
  
  for(int_start = 1;int_start < 100;int_start++)
    user_int_data[int_start - 1] = DFlash_Read_Int(SECTOR_NUM,int_start);              //從偏移地址1開始,讀出整形數據
  
  
  for(float_start = 101;float_start < 200;float_start++)
    user_float_data[float_start - 101] = DFlash_Read_Float(SECTOR_NUM,float_start); //從偏移地址101開始,讀出浮點型數據
  
  
  read_transfer_function();
}

 

七、PWM模塊使用

1、PWM端口對應:

image

2、API使用:

#define FTM0_PRECISON 3000u     //定義占空比精度,100即精度為1%,1000u則精度為0.1%,用於占空比 duty 形參傳入,即占空比為 duty/FTM_PRECISON
#define FTM1_PRECISON 3000u     //定義占空比精度,100即精度為1%,1000u則精度為0.1%,用於占空比 duty 形參傳入,即占空比為 duty/FTM_PRECISON
#define FTM2_PRECISON 6000u     //定義占空比精度,100即精度為1%,1000u則精度為0.1%,用於占空比 duty 形參傳入,即占空比為 duty/FTM_PRECISON

extern void  FTM_PWM_init(FTMn_e, FTM_CHn_e, uint32 freq, uint32 duty);  //初始化FTM的PWM功能並設置頻率、占空比。設置通道輸出占空比。同一個FTM,各通道的PWM頻率是一樣的,共3個FTM

extern void  FTM_PWM_Duty(FTMn_e, FTM_CHn_e,              uint32 duty);  //設置通道占空比,占空比為 (duty * 精度) % ,如果 FTM_PRECISON 定義為 1000 ,duty = 100 ,則占空比 100*0.1%=10%
extern void  FTM_PWM_freq(FTMn_e,            uint32 freq);               //設置FTM的頻率(改頻率后,需要重新配置占空比)

 

八、脈沖計數

1、方法一:FTM中的正交解碼:

/*********************** 正交解碼功能 **************************/
//本功能 尚未測試
extern void     FTM_QUAD_Init(FTMn_e ftmn);         //初始化FTM 的正交解碼 功能
extern int16    FTM_QUAD_get(FTMn_e ftmn);          //獲取FTM 正交解碼 的脈沖數(負數表示反方向)
extern void     FTM_QUAD_clean(FTMn_e ftmn);        //清 FTM 正交解碼 的脈沖數
void FTM2_QUAD_Int(void) ;
#endif  //_MK60_FTM_H_

 

2、方法二:LPTMR中的低功耗計數

/*       用於脈沖計數        */
extern void     lptmr_pulse_init  (LPT0_ALTn, uint16 count, LPT_CFG);   //計數器初始化設置
extern uint16   lptmr_pulse_get   (void);                               //獲取計數值
extern void     lptmr_pulse_clean (void);                               //清空計數值

 

 

九、GPIO使用

/****************************外部使用****************************/

extern void    gpio_init  (PTXn_e, GPIO_CFG, uint8 data);    //初始化gpio
extern void    gpio_ddr   (PTXn_e, GPIO_CFG);                //設置引腳數據方向
extern void    gpio_set   (PTXn_e,           uint8 data);    //設置引腳狀態
extern void    gpio_turn  (PTXn_e);                          //反轉引腳狀態
extern uint8   gpio_get   (PTXn_e);                          //讀取引腳狀態



//如下 4個 函數 的 PTxn 只能是 宏定義,不能是 變量
#define GPIO_SET(PTxn,data)       (PTXn_T(PTxn,OUT)= (data))    //設置輸出電平
#define GPIO_TURN(PTxn)           (PTXn_T(PTxn,T)= 1)           //翻轉輸出電平
#define GPIO_GET(PTxn)            (PTXn_T(PTxn,IN))             //讀取引腳輸入狀態
#define GPIO_DDR(PTxn,ddr)        (PTXn_T(PTxn,DDR) = ddr)      //輸入輸出狀態

 

 

十、LPTMR模塊API

/**
 *  @brief LPTMR脈沖計數輸入管腳選項
 */
typedef enum
{
    //只有1、2管腳,並沒有0、3管腳
    LPT0_ALT1 = 1,      // PTA19
    LPT0_ALT2 = 2       // PTC5
} LPT0_ALTn;

/**
 *  @brief LPTMR脈沖計數觸發方式
 */
typedef enum LPT_CFG
{
    LPT_Rising  = 0,    //上升沿觸發
    LPT_Falling = 1     //下降沿觸發
} LPT_CFG;

#define LPTMR_Flag_Clear()  (LPTMR0_CSR |= LPTMR_CSR_TCF_MASK)         //清除LPT比較標志位

/*          用於延時         */
extern void     lptmr_delay_ms(uint16 ms);      //延時(ms)
extern void     lptmr_delay_us(uint16 us);      //延時(us)

/*       用於定時           */
extern void     lptmr_timing_ms(uint16 ms);     //定時(ms)
extern void     lptmr_timing_us(uint16 ms);     //定時(us)

/*        用於計時           */
extern void     lptmr_time_start_ms(void);      //開始計時(ms)
extern uint32   lptmr_time_get_ms(void);        //獲取計時時間 

extern void     lptmr_time_start_us(void);      //開始計時(ns)
extern uint32   lptmr_time_get_us(void);        //獲取計時時間 

extern void     lptmr_time_close();             //關閉計時器


/*       用於脈沖計數        */
extern void     lptmr_pulse_init  (LPT0_ALTn, uint16 count, LPT_CFG);   //計數器初始化設置
extern uint16   lptmr_pulse_get   (void);                               //獲取計數值
extern void     lptmr_pulse_clean (void);                               //清空計數值


/*      中斷復位函數模版    */
extern void lptmr_test_handler(void);                                       //中斷復位函數,僅供參考(需用戶自行實現)

 

 

十一、串口對應模塊

image

 

API使用:

/初始化
extern void uart_init      (UARTn_e, uint32 baud);             //初始化uartx模塊
void uart_init_old (UARTn_e uratn, uint32 baud);
//接收相關代碼
extern void uart_getchar   (UARTn_e, unsigned char *ch);                //等待接受1個字節
char uart_getchar_old (UARTn_e uratn);
extern char uart_querychar (UARTn_e, char *ch);                //查詢接收1個字符
extern char uart_querystr  (UARTn_e, char *str, uint32 max_len); //查詢接收字符串
extern char uart_querybuff (UARTn_e, char *str, uint32 max_len); //查詢接收buff

extern char uart_query    (UARTn_e);                          //查詢是否接收到一個字節


//發送相關代碼
extern void uart_putchar   (UARTn_e, char ch);                 //發送1個字節
extern void uart_putbuff   (UARTn_e , uint8 *buff, uint32 len);//發送len個字節buff
extern void uart_putstr    (UARTn_e , const uint8 *str);       //發送字符串



//中斷相關代碼
extern void uart_rx_irq_en (UARTn_e);                          //開串口接收中斷
extern void uart_tx_irq_en (UARTn_e);                          //開串口發送中斷
extern void uart_txc_irq_en (UARTn_e);                         //開串口發送完成中斷

extern void uart_rx_irq_dis(UARTn_e);                          //關串口接收中斷
extern void uart_tx_irq_dis(UARTn_e);                          //關串口發送中斷
extern void uart_txc_irq_dis(UARTn_e);                         //關串口發送完成中斷

extern void uart3_test_handler(void);                        //中斷復位函數,僅供參考(需用戶自行實現)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM