AB1601GPIO不支持较高频率的脉冲中断
當輸入信號的周期比較小時,中斷腳無法做出響應。
測試代碼如下:
#include "ab1600.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ab_uart.h"
#include "ab_clk.h"
#include "Drv_gpio.h"
#include "Drv_pinmux.h"
//pio input/output
#define PIO_INPUT 0
#define PIO_OUTPUT 1
//pio value
#define PIO_LOW 0
#define PIO_HIGH 1
//pio number
enum
{
? ? WAKEUP_KEY = 0,
? ? PIO0 = WAKEUP_KEY,
? ? PIO1,
? ? PIO2,
? ? PIO3,
? ? PIO4,
? ? PIO5,
? ? PIO6,
? ? PIO7,
? ? PIO8,
? ? PIO9,
? ? PIO10,
? ? PIO11,
? ? PIO12,
? ? PIO13,
? ? PIO14,
? ? PIO15,
? ? PIO16,
? ? PIO17,
? ? PIO18,
? ? PIO19,
? ? PIO20,
? ? PIO21,
? ? PIO22,
? ? PIO23,
? ? PIO24,
? ? PIO25,
? ? PIO26,
? ? PIO27,
? ? PIO28,
? ? PIO29,
};
static void uart1_rx_data_ind(uint16_t len)
{
uint8_t buf1[64];
uint16_t rlen;
while(rlen = AB_UART_Read(uart1_ins, buf1, 32))
{
}
}
const Ab_UartParam uart1_param_3M = {115200L, 380, UART_FORMAT_WORD_LENGTH_8_BIT | UART_FORMAT_STOP_1_BIT, uart1_rx_data_ind};
#define GPIO_TEST_PIN_OUT PIO19//輸出脈沖信號用于產生中斷
static void PinOutHigh(void)
{
DRV_Gpio_ValSet((1L << GPIO_TEST_PIN_OUT), PIO_HIGH);
}
static void PinOutLow(void)
{
DRV_Gpio_ValSet((1L << GPIO_TEST_PIN_OUT), PIO_LOW);
}
void PinOutInit(void)
{
DRV_PinMux_SigSet( (1L << GPIO_TEST_PIN_OUT), PIN_GPIO);
DRV_Gpio_DirSet( (1L << GPIO_TEST_PIN_OUT), PIO_OUTPUT);
DRV_Gpio_PullSet( (1L << GPIO_TEST_PIN_OUT), PULL_UP);
DRV_Gpio_ValSet( (1L << GPIO_TEST_PIN_OUT), PIO_LOW);
}
#define GPIO_INT_PIN_IN PIO18//用于檢測中斷輸入
#define GPIO_INT_PIN_IN_MASK (1L<<GPIO_INT_PIN_IN)
static void GpioIntHandler(unsigned char io_num)
{
printf("io %d interrupt......\n", io_num);
}
static void GpioIntEn(void)
{
//DRV_Gpio_IntReg(GPIO_INT_PIN_IN, (GPIO_INTR_TYPE_ENUM)EDGE_POS, GpioIntHandler);//上升沿
DRV_Gpio_IntReg(GPIO_INT_PIN_IN, (GPIO_INTR_TYPE_ENUM)EDGE_NEG, GpioIntHandler);//下降沿
DRV_Gpio_IntEn(GPIO_INT_PIN_IN);
}
void GpioIntInit(void)
{
DRV_PinMux_SigSet( GPIO_INT_PIN_IN_MASK, PIN_GPIO);
DRV_Gpio_DirSet( GPIO_INT_PIN_IN_MASK, PIO_INPUT);
DRV_Gpio_PullSet( GPIO_INT_PIN_IN_MASK, PULL_UP);
GpioIntEn();
}
//gpio18和gpio19相連
void main()
{
AB_CLK_Switch(AB_CLK_16M, false);//XT
AB_UART_Open(uart1_ins, (Ab_UartParam*)&uart1_param_3M);
Ab_printf_init(uart1_ins);//print output port
PinOutInit();
GpioIntInit();
printf("gpio int test!\r\n");
while(1)
{
//產生一個脈沖
PinOutHigh();
OS_delay_ms(5);//5毫秒的脈沖無法檢測到
PinOutLow();
/*
//產生一個脈沖
PinOutHigh();
OS_delay_ms(10);//10ms的可以檢測到
PinOutLow();
*/
OS_delay_ms(1000);
}
}
總結
以上是生活随笔為你收集整理的AB1601GPIO不支持较高频率的脉冲中断的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AB1601某些io口不支持较高频率信号
- 下一篇: AB1601串口之bugs