一、前言
继续分析Nordic GPIO部分的配置,作为芯片最基础的内容,剖析一下Nordic是如何处理GPIO配置的。
二、GPIO结构
如上图:
ANAIN/ANAEN : 模拟信号输入输出
DIR_OVERRIDE:方向过载??
IN_OVERRIDE/OUT_OVERRIDE:输入/输出过载,应该是提高驱动能力的作用
OUT就是信号输出端
DETECT:应该是用来做输入捕捉的
IN就是信号输入端
三、GPIO配置说明
1. 初始化所有IO口
for(pinLoop = 0; pinLoop< 32 ; ++pinLoop ) { NRF_GPIO->PIN_CNF[pinLoop] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos); }
(1)关闭Sense捕捉
(2)驱动能力设置为标准模式
(3)无上拉下拉
(4)IO口设置为输入,且输入口不连接
所有IO口的配置均按照初始化的配置方式,分别配置为输入输出
输入配置:
for (; pin_range_start <= pin_range_end; pin_range_start++) { NRF_GPIO->PIN_CNF[pin_range_start] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos); }
输出配置:
2. 输出口电平控制(拉高、拉低)for (; pin_range_start <= pin_range_end; pin_range_start++) { NRF_GPIO->PIN_CNF[pin_range_start] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) | (pull_config << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos); }
NRF_GPIO->OUTSET = (1UL << GPIO_LED_STATE_PIN_NUMBER NRF_GPIO->OUTCLR = (1UL << GPIO_LED_STATE_PIN_NUMBER
3. 中断配置
中断初始化步骤:
(1)首先将中断入口配置为输入口
(2)配置中断Line,Nordic共有4个中断Line可供使用,这里选择Line号为2,后面的配置分别设置为下降沿(High to Low)
选择中断触发的IO口号,以及触发的类型EVENT就是中断
(3)使能总中断和GPIOTE的2号线中断
中断处理接口:中判断一下中断标志,然后清标志即可。
void EXTI_Init(uint8_t PinNum,uint8_t EXTI_Line) { nrf_gpio_cfg_input(PinNum,GPIO_PIN_CNF_PULL_Pullup); NRF_GPIOTE->CONFIG[EXTI_Line] = (GPIOTE_CONFIG_POLARITY_HiToLo<<GPIOTE_CONFIG_POLARITY_Pos) |(PinNum<<GPIOTE_CONFIG_PSEL_Pos) |(GPIOTE_CONFIG_MODE_Event<<GPIOTE_CONFIG_MODE_Pos); nrf_drv_common_irq_enable(GPIOTE_IRQn, GPIOTE_CONFIG_IRQ_PRIORITY); NRF_GPIOTE->INTENSET = GPIOTE_INTENSET_IN2_Set<<GPIOTE_INTENSET_IN2_Pos; } void GPIOTE_IRQHandler(void) { if(NRF_GPIOTE->EVENTS_IN[2]==1&&(NRF_GPIOTE->INTENSET&GPIOTE_INTENSET_IN2_Msk)) { NRF_GPIOTE->EVENTS_IN[2]=0; send_command1_falg =true; } }
版权声明:本文为musicalspace原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。