日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

K60学习笔记一:PORT端口

發布時間:2023/12/9 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 K60学习笔记一:PORT端口 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

預備C語言知識:
一.
1.

#ifndef //#idndef用來判斷后面的標識符是否為未定義的。 #elseif #endif

在嵌入式的系統開發中,某個文件包含幾個頭文件,而且每個頭文件都有可能都定義了同樣的宏,使用#ifndef可以有效地防止對該宏的重復定義。此時第一個頭文件中定義的宏變為有效定義,其他的頭文件中的定義則被忽略。
2.#ifndef指令通常用于防止多次包含同意文件,也就是說,頭文件可以采用類似于以下幾行的設置:

#ifndef THINGS_H_ #define THINGS_H_#endif

假設多次定義了同一頭文件,當于處理器第一次遇到該包含文件時,THINGS_H_是未定義的,因此程序接著定義THINGS_H_,并處理文件的其余部分,預處理器下一次遇到該文件時,THINGS_H_早已經被定義了,因此預處理器會跳過該文件的其余部分。

3.
這里有一個問題:為什么會包含同一頭文件?為什么會用頭文件的名字作為#define的定義?
答:許多文件自身包含了其他文件。頭文件的有些語句在一個文件中只能出現一次,標準頭文件使用#ifndef來避免多次包含。
編譯器提供商采用下述方法來解決這個問題,用文件名標識符,并使用大寫字母,用下劃線來代替字符。
eg;

#ifndef _STDIO_H_ #define _STDIO_H_ #endif

4.
枚舉:枚舉用來聲明代表整數常量的符號名稱。
可以通過enum來創建一個新的類型,并指定值。
枚舉類型的目的是為了提高程序的可讀性(其實也可以用#define來進行聲明,但是可讀性不高)
枚舉型類型可以默認值也可以指定值。
5.
typeof簡介:它是一種高級數據格式

typeof unsigned char BYTE //和 #define BYTE unsigned char //具有一樣的功能 //但是typeof的功能比#define更加的強大: //eg typeof char * STRING STRING NAME,NUM; //char * NAME,char * NUM; //和 #define STRING char * STRING NAME,NUM; //char * NAME,NUM;//對結構體也可使用typeof

6.#include “” and #include <>

#include ""//引用的頭文件為程序目錄的相對路徑的頭文件,表示在包含文件目錄中去查找(包含目錄是由用戶在設置環境時設置的),而不在源文件目錄去查找 #include <>//引用的是編譯器中類庫里面的頭文件,使用雙引號則表示首先在當前的源文件目錄中查找,若未找到才到包含目錄中去查找

7.


2.對于基于IAR IDE的K60芯片的野火的函數庫的PORT端口來說:
有兩個文件為:PORT.h和PROT.c
二:下面詳細的分析這兩個文件:
1.
在PORT端口的定義中,對端口的定義用的枚舉類型:

//枚舉端口管教 typeof enum { /* PTA端口 */ //0~31PTA0, PTA1, PTA2, PTA3, PTA4, PTA5, PTA6, PTA7, PTA8, PTA9, PTA10, PTA11, PTA12, PTA13, PTA14, PTA15,PTA16, PTA17, PTA18, PTA19, PTA20, PTA21, PTA22, PTA23, PTA24, PTA25, PTA26, PTA27, PTA28, PTA29, PTA30, PTA31,/* PTB端口 */ //32~63PTB0, PTB1, PTB2, PTB3, PTB4, PTB5, PTB6, PTB7, PTB8, PTB9, PTB10, PTB11, PTB12, PTB13, PTB14, PTB15,PTB16, PTB17, PTB18, PTB19, PTB20, PTB21, PTB22, PTB23, PTB24, PTB25, PTB26, PTB27, PTB28, PTB29, PTB30, PTB31,/* PTC端口 */PTC0, PTC1, PTC2, PTC3, PTC4, PTC5, PTC6, PTC7, PTC8, PTC9, PTC10, PTC11, PTC12, PTC13, PTC14, PTC15,PTC16, PTC17, PTC18, PTC19, PTC20, PTC21, PTC22, PTC23, PTC24, PTC25, PTC26, PTC27, PTC28, PTC29, PTC30, PTC31,/* PTD端口 */PTD0, PTD1, PTD2, PTD3, PTD4, PTD5, PTD6, PTD7, PTD8, PTD9, PTD10, PTD11, PTD12, PTD13, PTD14, PTD15,PTD16, PTD17, PTD18, PTD19, PTD20, PTD21, PTD22, PTD23, PTD24, PTD25, PTD26, PTD27, PTD28, PTD29, PTD30, PTD31,/* PTE端口 */PTE0, PTE1, PTE2, PTE3, PTE4, PTE5, PTE6, PTE7, PTE8, PTE9, PTE10, PTE11, PTE12, PTE13, PTE14, PTE15,PTE16, PTE17, PTE18, PTE19, PTE20, PTE21, PTE22, PTE23, PTE24, PTE25, PTE26, PTE27, PTE28, PTE29, PTE30, PTE31,}PTXn_e;//類似于查表來確定端口數值//枚舉端口 typedef enum {PTA, PTB, PTC, PTD, PTE,PTX_MAX, } PTX_e; //是為了很好的表示各個端口的基地址 /*! 枚舉編號 */ typedef enum {PT0 , PT1 , PT2 , PT3 , PT4 , PT5 , PT6 , PT7 ,PT8 , PT9 , PT10, PT11, PT12, PT13, PT14, PT15,PT16, PT17, PT18, PT19, PT20, PT21, PT22, PT23,PT24, PT25, PT26, PT27, PT28, PT29, PT30, PT31, } PTn_e;/*! 枚舉PORT 配置 */ typedef enum {//中斷方式和DMA請求方式,兩者只能選其中一種(可以不選)//中斷方式選擇IRQ_ZERO = 0x08 << PORT_PCR_IRQC_SHIFT, //低電平觸發IRQ_RISING = 0x09 << PORT_PCR_IRQC_SHIFT, //上升沿觸發IRQ_FALLING = 0x0A << PORT_PCR_IRQC_SHIFT, //下降沿觸發IRQ_EITHER = 0x0B << PORT_PCR_IRQC_SHIFT, //跳變沿觸發IRQ_ONE = 0x0C << PORT_PCR_IRQC_SHIFT, //高電平觸發//DMA請求選擇DMA_RISING = 0x01 << PORT_PCR_IRQC_SHIFT, //上升沿觸發DMA_FALLING = 0x02 << PORT_PCR_IRQC_SHIFT, //下降沿觸發DMA_EITHER = 0x03 << PORT_PCR_IRQC_SHIFT, //跳變沿觸發HDS = 0x01 << PORT_PCR_DSE_SHIFT, //輸出高驅動能力PF = 0x01 << PORT_PCR_PFE_SHIFT, //帶無源濾波器SSR = 0x01 << PORT_PCR_SRE_SHIFT, //輸出慢變化率 Slow slew rate//下拉上拉選擇PULLDOWN = 0x02 << PORT_PCR_PS_SHIFT, //下拉PULLUP = 0x03 << PORT_PCR_PS_SHIFT, //上拉//功能復用選擇(如果不需要改變功能復用選擇,保留原先的功能復用,直接選擇ALT0 )//需要查 K60 Signal Multiplexing and Pin AssignmentsALT0 = 0x00 << PORT_PCR_MUX_SHIFT,ALT1 = 0x01 << PORT_PCR_MUX_SHIFT, //GPIO 8ALT2 = 0x02 << PORT_PCR_MUX_SHIFT,ALT3 = 0x03 << PORT_PCR_MUX_SHIFT,ALT4 = 0x04 << PORT_PCR_MUX_SHIFT,ALT5 = 0x05 << PORT_PCR_MUX_SHIFT,ALT6 = 0x06 << PORT_PCR_MUX_SHIFT,ALT7 = 0x07 << PORT_PCR_MUX_SHIFT, } port_cfg; //枚舉PORT復用配置,采用枚舉賦值,增加易讀性 //其實也可以直接賦值

//一開始并不明白為什么要枚舉端口號和枚舉編號,枚舉了管腳就可以了,頭文件看到這,在看一下.C文件
PORT.C

#include "common.h" //山外K60 平臺常用類型聲明和宏定義

PORT端口中一共有三個函數分別為:

端口初始化和復用函數(配置MUX復用功能):
extern void port_init(PTXn_e(端口號),uint32 cfg);
端口初始化和復用函數(不改變MUX復用功能):
extern void port_init_NoALT(PTXn_e(端口號),uint32 cfg);
外部中斷的服務函數:
extern void port_handler(void);

在看PORT.C

#include "commom.h" //類型聲明和宏定義 #include "port.h" //自己寫的函數PORT_MemMapPtr PORTX[PTX_MAX] = {PORTA_BASE_PTR, PORTB_BASE_PTR, PORTC_BASE_PTR, PORTD_BASE_PTR, PORTE_BASE_PTR}; //PORT_MemMapPtr為一個結構體指針 ,PORTX[PTX_MAX]這個數組里面存的是各個端口的基地址 //現在懂得在PORT.H中關于枚舉端口的意思。 void port_init(PTXn_e ,uint32 cfg) {SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK << PTX(ptxn)); //開啟PORTx端口 1.使能PORT時鐘 //段地址屬于基地址的一種 //4004_8038 //0100 0000 0000 0100 1000 0000 0011 1000 //#define PTX(PTxn(枚舉管腳)) ((PTxn)>>5) //右移5位,/2^5(32) // SIM_SCGC5_PORTA_MASK = 0x200 0010 0000 0000 默認的開啟了PORTA的時鐘因為是/32?為什么是32,因為是2的次方數 //因此PTX(ptxn)的為0 1 2 3 4 //因此輸入管腳口,就可以進行相應口的使能時鐘PORT_ISFR_REG(PORTX_BASE(ptxn)) = (1<<PTn(ptxn)); // 清空標志位 //每個管腳都有相應的中斷標志位 //現在理解枚舉端口的含義 //#define PTn(ptxn) ((PTxn)&0x1f) 為的是中斷端口的相應管腳,每個端口一共31個口,相應的管腳為1 //PORT_ISFR_REG(PORTX_BASE(ptxn))為指向端口的地址 //這一步操作的是中斷狀態寄存器PORT_PCR_REG(PORTX_BASE(PTxn), PTn(PTxn)) = cfg; //復用引腳功能 //這句話可以復用的功能有:中斷觸發方式,無源濾波器,復用功能口,上下拉電阻 //操作的寄存器:引腳控制寄存器 n (PORTx_PCRn),每個管腳都有引腳控制寄存器 //PORT_PCR_REG(PORTX_BASE(PTxn), PTn(PTxn))把管腳定義到具體的一個管腳 //cfg根據數據手冊進行搭配//由此K60芯片的管腳以初始化完畢void port_init_NoALT(PTXn_e ptxn, uint32 cfg) { SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK << PTX(ptxn)); //開啟PORTx端口PORT_ISFR_REG(PORTX_BASE(ptxn)) = (1<<PTn(ptxn)); // 清空標志位 //清空cfg里的MUX,加載寄存器里的MUXcfg &= ~PORT_PCR_MUX_MASK; //清了MUX 字段(即不需要配置ALT,保持原來的ALT)cfg |= (PORT_PCR_REG(PORTX_BASE(ptxn), PTn(ptxn)) & PORT_PCR_MUX_MASK); //讀取寄存器里配置的 MUXPORT_PCR_REG(PORTX_BASE(ptxn), PTn(ptxn)) = cfg; // 復用功能 , 確定觸發模式 ,開啟上拉或下拉電阻 }} //端口的外部中斷功能: 首先要進行把 porta_handler 函數添加到中斷向量表,不需要我們手動調用 操作: set_vector_handler(PORTA_VECTORn , 中斷函數名); 在進行這個函數解析的時候有一個很大的問題。 關于斷言的使用:(一定要學好宏定義) 再開一篇····

總結

以上是生活随笔為你收集整理的K60学习笔记一:PORT端口的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。