项目用用到qorvo的单片机PAC5523,该单片机和ST/GD不一样,基本使用寄存器配置。
GPIOx端口包含8个通用输入输出(GPIO)引脚,即GPIOE0到GPIOE7。
- 3.3伏输出,耐受3.3伏输入
- 高阻抗数字输入
- 推挽式数字输出
- 开漏式数字输出
- 可配置的驱动强度最高达25毫安
- 可配置的输入施密特触发器
- 可配置的弱上拉或下拉
- 边沿或电平敏感型中断
- 上升沿、下降沿或双边沿
- 时钟同步
寄存器 | 地址 | 描述 | 访问权限 | 复位值 |
---|---|---|---|---|
GPIOEMODE | 400D 2400h | GPIO引脚模式选择 | RW(读写) | 0000 FFFFH |
GPIOEOUTMASK | 400D 2404h | GPIO数据输出写掩码 | RW(读写) | 0000 0000h |
GPIOEOUT | 400D 2408h | GPIO数据输出值 | RW(读写) | 0000 00FFh |
GPIOEIN | 400D 240Ch | GPIO数据输入值 | RO(只读) | -- |
GPIOEINTEN | 400D 2410h | GPIO中断使能 | RW(读写) | 0000 0000h |
GPIOEINTFLAG | 400D 2414h | GPIO中断标志 | RO(只读) | 0000 0000h |
GPIOEINTCLEAR | 400D 241Ch | GPIO中断清除 | WO(只写) | 0000 0000h |
GPIOEINTTYPE | 400D 2420h | GPIO中断类型 | RW(读写) | 0000 0000h |
GPIOEINTCFG | 400D 2424h | GPIO中断配置 | RW(读写) | 0000 0000h |
GPIOEINTEDGEBOTH | 400D 2428h | GPIO中断双边沿 | RW(读写) | 0000 0000h |
GPIOECLKSYNC | 400D 242Ch | GPIO时钟同步 | RW(读写) | -- |
GPIOEDOSET | 400D 2430h | GPIO数据输出置位 | WO(只写) | -- |
GPIOEDOCLEAR | 400D 2434h | GPIO数据输出清除 | WO(只写) | 0000 FFFFH |
例1:引脚配置输出
void gpio_output_init(void)
{
PAC55XX_GPIOE->MODE.P0 = IO_PUSH_PULL_OUTPUT; //输出模式
PAC55XX_GPIOE->OUTMASK.P0 = 0;//GPIO 引脚的状态将由 GPIOEOUT.Px 来设置(0b:逻辑低电平,1b:逻辑高电平)。如果 GPIOEOUTMASK.Px 设置为 1b,那么对 GPIOEOUT.Px 所做的任何更改都将不起作用。
PAC55XX_GPIOE->DOCLEAR.P0 = 1; //清除输出
PAC55XX_SCC->PCPUEN.P0= 1; //弱上拉
PAC55XX_SCC->PEDS.P0DS = IODS_DS_14MA; //驱动强度设置
PAC55XX_GPIOE->OUT.P0 = 1;//0-输出低电平,1-输出高电平
}
例2:引脚中断
void gpio_input_init(void)
{
// input
PAC55XX_GPIOC->MODE.P7 = IO_HIGH_IMPEDENCE_INPUT; //输入模式
PAC55XX_GPIOC->OUTMASK.P7 = 1; //输入模式,配置为1
PAC55XX_SCC->PCMUXSEL.P7= 0; /* 引脚复用:000b: GPIOC7 [default],001b: TBPWM7,010b: TCPWM7,011b: Reserved,100b: USBSS,101b: USCMISO,110b: FRCLK,111b:EMUXC*/
PAC55XX_SCC->PCPUEN.P7= 1;/*弱上拉 :0b: disabled,1b: enabled*/
}
void gpio_interrupt_init(void)
{
gpio_input_init();
// interrupt
PAC55XX_GPIOC->INTTYPE.P7 = 0; //0-边沿触发,1-电平触发
PAC55XX_GPIOC->INTCFG.P7 = 0; //INTTYPE=0:0-下降沿触发,1-上升沿触发;INTTYPE=1:0-低电平,1-高电平触发
PAC55XX_GPIOC->INTEDGEBOTH.P7 = 1;//0-听从INTCFG设置,1-覆盖INTCFG,双边沿触发
PAC55XX_GPIOC->CLKSYNC.P7 = 1; //时钟同步使能:0-禁用 1-使能(在接收中断使能时设置)
PAC55XX_GPIOC->INTEN.P7 = 1; //使能中断
PAC55XX_GPIOC->INTCLEAR.P7 = 1; //中断标志位清除
NVIC_EnableIRQ(GpioC_IRQn); //NVIC使能
NVIC_SetPriority(GpioC_IRQn,1); //中断优先级设置
}
PAC5XXX_RAMFUNC void GpioC_IRQHandler(void)
{
if(PAC55XX_GPIOC->INTFLAG.P7)
{
PAC55XX_GPIOE->OUT.P0 ^= 1; //电平翻转
PAC55XX_GPIOC->INTCLEAR.P7 = 1;
}
}
U8 gpio_read_pin()
{
retrun PAC55XX_GPIOE->IN.P7; //0-低电平,1-高电平
}