K60学习笔记一:PORT端口
預備C語言知識:
一.
1.
在嵌入式的系統開發中,某個文件包含幾個頭文件,而且每個頭文件都有可能都定義了同樣的宏,使用#ifndef可以有效地防止對該宏的重復定義。此時第一個頭文件中定義的宏變為有效定義,其他的頭文件中的定義則被忽略。
2.#ifndef指令通常用于防止多次包含同意文件,也就是說,頭文件可以采用類似于以下幾行的設置:
假設多次定義了同一頭文件,當于處理器第一次遇到該包含文件時,THINGS_H_是未定義的,因此程序接著定義THINGS_H_,并處理文件的其余部分,預處理器下一次遇到該文件時,THINGS_H_早已經被定義了,因此預處理器會跳過該文件的其余部分。
3.
這里有一個問題:為什么會包含同一頭文件?為什么會用頭文件的名字作為#define的定義?
答:許多文件自身包含了其他文件。頭文件的有些語句在一個文件中只能出現一次,標準頭文件使用#ifndef來避免多次包含。
編譯器提供商采用下述方法來解決這個問題,用文件名標識符,并使用大寫字母,用下劃線來代替字符。
eg;
4.
枚舉:枚舉用來聲明代表整數常量的符號名稱。
可以通過enum來創建一個新的類型,并指定值。
枚舉類型的目的是為了提高程序的可讀性(其實也可以用#define來進行聲明,但是可讀性不高)
枚舉型類型可以默認值也可以指定值。
5.
typeof簡介:它是一種高級數據格式
6.#include “” and #include <>
#include ""//引用的頭文件為程序目錄的相對路徑的頭文件,表示在包含文件目錄中去查找(包含目錄是由用戶在設置環境時設置的),而不在源文件目錄去查找 #include <>//引用的是編譯器中類庫里面的頭文件,使用雙引號則表示首先在當前的源文件目錄中查找,若未找到才到包含目錄中去查找7.
2.對于基于IAR IDE的K60芯片的野火的函數庫的PORT端口來說:
有兩個文件為:PORT.h和PROT.c
二:下面詳細的分析這兩個文件:
1.
在PORT端口的定義中,對端口的定義用的枚舉類型:
//一開始并不明白為什么要枚舉端口號和枚舉編號,枚舉了管腳就可以了,頭文件看到這,在看一下.C文件
PORT.C
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端口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(3227):回调形式的ref的
- 下一篇: 图解 React-router 源码