該筆記主要記錄HPS端的GPIO如何控制,包括控制LED和Key
1.GPIO地址映射
Peripheral Base Address 0xf000_0000 64M
2.HPS外設
(1)GPIO Controller
支持數字消抖
可配置中斷模式
支持上限71個IO 引腳,14個輸入引腳
由三個控制器控制,GPIO1 GPIO2 GPIO3
GPIO0 control GPIO[28:0]
GPIO1 control GPIO[57:29]
GPIO2 control GPIO[70:58]& GPI[13:0]
3.GPIO 寄存器組
gpio_swporta_ddr:配置IO引腳方向
gpio_swporta_dr:寫數據到輸出引腳上
gpio_ext_porta:從輸入端口讀取數據
4.HPS_Led && Key
LED和key鏈接到GPIO控制器上,咱們能夠經過控制GPIOcontroller實現操做HPS_Led & HPS_Key
實現方式是經過軟件API
1)open:用來打開內存映射設備驅動
2)mmap:映射物理地址到物理用戶空間
3)alt_read_word:從指定寄存器讀取一個值
4)alt_write_word:寫入一個值到指定寄存器
5)munmap:清除內存映射
6)close:關閉設備驅動
7)alt_setbits_word:設定指定寄存器的指定位爲1
8)alt_clrbits_word: 設定指定寄存器的指定位爲0
5.對應到GPIO1寄存器:
1)用open函數打開內存映射設備驅動
2)mmap函數獲得對應的虛擬基地址
3)虛擬基地址+GPIO1控制器各寄存器的偏移地址,即獲得GPIO1控制器各寄存器的地址入口
4)使用open mmap得出虛擬基地址
if ((fd = open("d/dev/mem",(O_RDWR | O_SYNC))) == -1)
{
printf("ERROR:could not open \"dev/mem\"...\n");
retrun(1);
}
virtual_base = mmap (NULL,HW_REGS_SPAN,(PROT_READ | PROT_WRITE),MAP_SHARD,fd,HW_REGS_BASE);
5)虛擬地址+GPIO寄存器偏移地址獲得地址入口
例:GPIO1方向寄存器gpio_swporta_ddr
(virtual_base + ((uint32_t) ALT_GPIO1_SWPROTA_DDR_ADDR & (uint32_t) (HW_REGS_MASK)));
6)經過software API結合bit_mask 操做HPS_LED HPS_Key