最近有朋友一直吐槽,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);
}
}