GPIO的控制部分,经常用来操作LED灯,读取BUTTON的状态。
对GPIO的控制部分,主要是在nrf_gpio.h中,最基本的几个接口使用:
nrf_gpio_cfg_output
nrf_gpio_cfg_input
nrf_gpio_pin_set
nrf_gpio_pin_clear
nrf_gpio_pin_read
Common部分,经常会用到us级别的延迟。
在nrf_delay.h中需要对如下的接口了解。
nrf_delay_us
timer部分。
Uart部分。
在simple_uart.c中。
simple_uart_config,默认波特率是38400.
simple_uart_putstring
simple_uart_put
simple_uart_get_with_timeout
simple_uart_get
SPI master部分。
在spi_master.c中。
spi_master_open
spi_master_evt_handler_reg
spi_master_send_recv
在spi_slave.c中。
spi_slave_init
spi_slave_buffers_set
spi_slave_evt_handler_register
arm_startup_nrf51.s中的技术细节。
中断向量表的定义如下
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD POWER_CLOCK_IRQHandler ;POWER_CLOCK
DCD RADIO_IRQHandler ;RADIO
DCD UART0_IRQHandler ;UART0
DCD SPI0_TWI0_IRQHandler ;SPI0_TWI0
DCD SPI1_TWI1_IRQHandler ;SPI1_TWI1
DCD 0 ;Reserved
DCD GPIOTE_IRQHandler ;GPIOTE
DCD ADC_IRQHandler ;ADC
DCD TIMER0_IRQHandler ;TIMER0
DCD TIMER1_IRQHandler ;TIMER1
DCD TIMER2_IRQHandler ;TIMER2
DCD RTC0_IRQHandler ;RTC0
DCD TEMP_IRQHandler ;TEMP
DCD RNG_IRQHandler ;RNG
DCD ECB_IRQHandler ;ECB
DCD CCM_AAR_IRQHandler ;CCM_AAR
DCD WDT_IRQHandler ;WDT
DCD RTC1_IRQHandler ;RTC1
DCD QDEC_IRQHandler ;QDEC
DCD LPCOMP_IRQHandler ;LPCOMP
DCD SWI0_IRQHandler ;SWI0
DCD SWI1_IRQHandler ;SWI1
DCD SWI2_IRQHandler ;SWI2
DCD SWI3_IRQHandler ;SWI3
DCD SWI4_IRQHandler ;SWI4
DCD SWI5_IRQHandler ;SWI5
DCD 0 ;Reserved
DCD 0 ;Reserved
DCD 0 ;Reserved
DCD 0 ;Reserved
DCD 0 ;Reserved
DCD 0 ;Reserved
__Vectors_End
例如我们经常会在外面定义GPIOTE_IRQHandler如下,这样就和中断向量表中的定义就对应起来了。
void GPIOTE_IRQHandler(void)
{
if(NRF_GPIOTE->EVENTS_PORT !=0)
{
NRF_GPIOTE->EVENTS_PORT = 0; //clear the PORT EVENT
for(uint8_t i=0; i<BUTTONS_NUMBER; i++)
{
if(nrf_gpio_pin_read(buttons_list[i]) == 0)
{
nrf_delay_ms(10); //delete jitter
if(nrf_gpio_pin_read(buttons_list[i]) == 0) nrf_gpio_pin_toggle(leds_list[i]);
}
}
}
}
熟悉一些常见的汇编指令。
NRF_POWER_RAMONx_RAMxON_ONMODE_Msk EQU 0x3
MOVS R1, #NRF_POWER_RAMONx_RAMxON_ONMODE_Msk
这样R1寄存器的之就是3
NRF_POWER_RAMON_ADDRESS EQU 0x40000524
LDR R0, =NRF_POWER_RAMON_ADDRESS
这样R0寄存器的值就是0x40000524
LDR R2, [R0]
这是R2的值就是0x00000003
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
在编译出来的map文件中,可以看到SystemInit接口是在
SystemInit 0x000001b5 Thumb Code 64 system_nrf51.o(i.SystemInit)
__main 0x000000c1 Thumb Code 0 entry.o(.ARM.Collect$$$$00000000)
谢谢