AB1601GPIO不支持较高频率的脉冲中断

来源:互联网 发布:淘宝信鸽赛中二手 编辑:程序博客网 时间:2024/05/05 12:38

当输入信号的周期比较小时,中断脚无法做出响应。

测试代码如下:

#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);
}
}


原创粉丝点击