濮陽網(wǎng)站建設(shè)哪家好推廣軟件排行榜前十名
文章目錄
- @[toc]
- GPIO中斷簡介
- FPGA配置
- 常用函數(shù)
- MCU程序設(shè)計(jì)
- 工程下載
文章目錄
- @[toc]
- GPIO中斷簡介
- FPGA配置
- 常用函數(shù)
- MCU程序設(shè)計(jì)
- 工程下載
本文是高云FPGA系列教程的第7篇文章。
本篇文章介紹片上ARM Cortex-M3硬核處理器GPIO外部的使用,演示按鍵中斷方式來控制LED亮滅,基于TangNano 4K開發(fā)板。
參考文檔:Gowin_EMPU(GW1NS-4C)軟件編程 參考手冊(cè)
GPIO中斷簡介
高云GN1NSR-4C共有16個(gè)GPIO,每個(gè)GPIO可配置成輸入或輸出模式,支持中斷輸入,觸發(fā)方式可選擇:上升沿、下降沿、高電平、低電平觸發(fā)。
typedef enum
{GPIO_Int_Disable = 0, /* Disable : Interrupt enable=0 */GPIO_Int_Low_Level, /* Low-level : Interrupt enable=1 */GPIO_Int_High_Level, /* High-level : Interrupt enable=1 & polarity=1 */GPIO_Int_Falling_Edge, /* Falling edge : Interrupt enable=1 & type=1 */GPIO_Int_Rising_Edge /* Rising edge : Interrupt enable=1 & polarity=1 & type=1 */
}GPIOInt_TypeDef;
中斷優(yōu)先級(jí)可通過NVIC進(jìn)行設(shè)置,支持 0-7 級(jí)可編程中斷優(yōu)先級(jí)。
FPGA配置
FPGA工程中,EMPU需要使能GPIO外設(shè)。
頂層設(shè)計(jì)如下:
/**************************************************************** Copyright(C), 2010-2022, WeChat:MCU149.* ModuleName : top_hdl.v * Date : 2023年9月19日* Time : 20:19:39* Author : WeChat:MCU149* Function : gw1nsr-4c gpio interrupt demo* Version : v1.0* Version | Modify* ----------------------------------* v1.0 .....***************************************************************/module top_hdl(//Inputsinput gclk, // 27MHzinput gresetn, input key,input uart_rxd,//Outputsoutput uart_txd,output led
);wire clk_60m;wire arm_clk = clk_60m;
wire arm_resetn = gresetn;wire arm_uart0_rxd = uart_rxd;
wire arm_uart0_txd;
wire [15:0] arm_gpio_in;
wire [15:0] arm_gpio_out;
wire [15:0] arm_gpio_outen;assign uart_txd = arm_uart0_txd;
assign led = arm_gpio_out[1];
assign arm_gpio_in[0] = key;Gowin_PLLVR pll_ut0(.clkout(clk_60m), //output clkout.clkin(gclk) //input clkin
);Gowin_EMPU_Top arm_cortex_m3_core(//Inputs.sys_clk(arm_clk),.reset_n(arm_resetn),.uart0_rxd(arm_uart0_rxd), .gpioin(arm_gpio_in[15:0]),//Outputs.uart0_txd(arm_uart0_txd),.gpioout(arm_gpio_out[15:0]),.gpioouten(arm_gpio_outen[15:0])
);endmodule //top_hdl end
LED連接到GPIO1,按鍵連接到GPIO0,按鍵按下是低電平。
常用函數(shù)
常用的GPIO驅(qū)動(dòng)庫函數(shù)如下:
//清除中斷
void GPIO_IntClear(GPIO_TypeDef* GPIOx,uint32_t GPIO_Pin)
//獲取中斷觸發(fā)狀態(tài)
uint32_t GPIO_GetIntStatus(GPIO_TypeDef* GPIOx)
//中斷使能
uint32_t GPIO_SetIntEnable(GPIO_TypeDef* GPIOx,uint32_t GPIO_Pin)
//設(shè)置高電平觸發(fā)方式
void GPIO_SetIntHighLevel(GPIO_TypeDef* GPIOx,uint32_t GPIO_Pin)
//設(shè)置上升沿觸發(fā)方式
void GPIO_SetIntRisingEdge(GPIO_TypeDef* GPIOx,uint32_t GPIO_Pin)
//設(shè)置低電平觸發(fā)方式
void GPIO_SetIntLowLevel(GPIO_TypeDef* GPIOx,uint32_t GPIO_Pin)
//設(shè)置下降沿觸發(fā)方式
void GPIO_SetIntFallingEdge(GPIO_TypeDef* GPIOx,uint32_t GPIO_Pin)
一般配置流程:
1. 配置GPIO輸入輸入模式,中斷觸發(fā)方式
2. 配置NVIC中斷優(yōu)先級(jí)
3. 使能NVIC和GPIO中斷
4. 實(shí)現(xiàn)中斷服務(wù)函數(shù),并注釋掉系統(tǒng)提供的中斷服務(wù)函數(shù)
MCU程序設(shè)計(jì)
中斷觸發(fā)方式,可以在GPIO管腳初始化時(shí)進(jìn)行設(shè)置,也可以通過單獨(dú)的設(shè)定函數(shù)來設(shè)定。
首先是按鍵和LED對(duì)應(yīng)的GPIO初始化,按鍵默認(rèn)為高電平,按下是低電平,如果要按鍵按下觸發(fā)中斷,即從高電平到低電平,就設(shè)置成下降沿觸發(fā),如果想要按鍵松開觸發(fā)中斷,就設(shè)置為上升沿觸發(fā):
int gpio_init(void)
{GPIO_InitTypeDef init;NVIC_InitTypeDef InitTypeDef_NVIC;//KEY
// init.GPIO_Int = GPIO_Int_Falling_Edge; //press triginit.GPIO_Int = GPIO_Int_Rising_Edge; //release triginit.GPIO_Mode = GPIO_Mode_IN;init.GPIO_Pin = GPIO_Pin_0;GPIO_Init(GPIO0, &init);//LEDinit.GPIO_Int = GPIO_Int_Disable;init.GPIO_Mode = GPIO_Mode_OUT;init.GPIO_Pin = GPIO_Pin_1;GPIO_Init(GPIO0, &init);// GPIO_SetIntRisingEdge(GPIO0, GPIO_Pin_0); //release trig
// GPIO_SetIntFallingEdge(GPIO0, GPIO_Pin_0); //press trigGPIO_SetIntEnable(GPIO0, GPIO_Pin_0);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);InitTypeDef_NVIC.NVIC_IRQChannel = PORT0_0_IRQn;InitTypeDef_NVIC.NVIC_IRQChannelPreemptionPriority = 1;InitTypeDef_NVIC.NVIC_IRQChannelSubPriority = 1;InitTypeDef_NVIC.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&InitTypeDef_NVIC);return 0;
}
需要注意的是,中斷觸發(fā)方式只能設(shè)置成一種,不支持設(shè)置成上升沿和下降沿都觸發(fā)中斷。
中斷服務(wù)函數(shù)的實(shí)現(xiàn):
void PORT0_0_Handler(void)
{static uint16_t data = 0;data = ~data;gpio_write(data);printf("GPIO0_0 Interrupt Trig\r\n");GPIO_IntClear(GPIO0, GPIO_Pin_0);
}
需要把gw1ns4c_it.c
文件里的中斷服務(wù)函數(shù)注釋掉。
編譯,加載bin文件運(yùn)行:
按下按鍵,在串口會(huì)輸出日志,LED同時(shí)狀態(tài)翻轉(zhuǎn)。
工程下載
本文基于TangNano 4K的開發(fā)板,配套工程在以下鏈接,包括Keil和GMD開發(fā)環(huán)境,都可以正常使用。
- gw1nsr_4c_gpio_int_demo.rar
本文是高云FPGA系列教程的第7篇文章。