一、中斷函數注冊方法:
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端口對應:
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); //中斷復位函數,僅供參考(需用戶自行實現)
十一、串口對應模塊
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); //中斷復位函數,僅供參考(需用戶自行實現)


