最近有朋友一直吐槽,KEIL的代理商正在降维打击,于是默默卸载了KEIL
本章节就在IAR上面进行开发,讲下如何控制LED,网上资料很多了,LZ边看资料边验证,也算是造轮子了,hahaha
话不多说,先讲下Nordic的IO结构
一、GPIO结构原理
- 上图中的链路可以看出,PIN0-PIN31可以通过(OUT/IN)进行配置输入输出
- 可以通过CNF进行复用功能的开关;输出复用:硬件SPI/硬件UART;复用输入:ADC
- 使能Sense后就可以实现IO中断的功能(类似IO外部中断,可唤醒系统)
- IO口可以配置成输入、输出、复用(模拟)
二、GPIO相关寄存器
2.1 输出相关寄存器
OUT(0x504):写GPIO端口,按位(0-31)写入1(HIGH)对应端口输出高;写0(LOW)对应端口输出低;
OUTSET(0x0508):输出置位寄存器,按位(0-31)写入1(HIGH)对应端口输出高;写0(LOW)无效
OUTCLR(0x050C):输出清0寄存器,按位(0-31)写入1(HIGH)对应端口输出低;写0(LOW)无效
2.2 输入相关寄存器
IN(0x510):端口输入寄存器,引脚为低电平时读取值为0,引脚为高电平时读取值为1
2.3 控制寄存器
DIR(0x514):方向寄存器,写0对应PIN脚设置为输入;写1对应引脚设置为输出
DIRSET(0x518):方向设置寄存器,写1设置为输出,写0无效
DIRCLR(0x51C):方向清除寄存器,写1设置为输入,写0无效
LATCH(0x520):锁存寄存器,如上图即将所有引脚电平变化可存储在LATCH寄存器中
DETECTMODE(0x524):检测模式配置寄存器,写0直接连接到引脚检测,写1通过锁存器Latch
PIN_CNF[0-31](0x700):功能配置寄存器,可配置输入输出、上下拉、睡眠(SYSTEM OFF)后的唤醒电平(外部IO中断)
三、代码实例
3.1 输出配置
#define LED_PIN 17 //Nordic官方DEMO板的LED引脚
nrf_gpio_cfg_output(LED_PIN); //配置输出
nrf_gpio_pin_set(LED_PIN); //输出高电平
nrf_gpio_pin_clear(LED_PIN); //输出低电平
nrf_gpio_pin_toggle(LED_PIN); //电平翻转
3.2 main函数
/**@brief Function for application main entry.
*/
int main(void)
{
bool erase_bonds;
// Initialize.
log_init();
//timers_init();
//buttons_leds_init(&erase_bonds);
power_management_init();
ble_stack_init();
gap_params_init();
gatt_init();
advertising_init();
services_init();
conn_params_init();
peer_manager_init();
// Start execution.
NRF_LOG_INFO("Template example started.");
//application_timers_start();
//advertising_start(erase_bonds);
nrf_gpio_cfg_output(LED_PIN); //配置输出
// Enter main loop.
for (;;)
{
idle_state_handle();
nrf_gpio_pin_toggle(LED_PIN); //100ms闪烁
nrf_delay_ms(100);
}
}