NRF51822自学笔记 流水灯

Posted 玉缙-Glen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NRF51822自学笔记 流水灯相关的知识,希望对你有一定的参考价值。

最近在学nrf51822这个板子,下载程序点灯啥的零零碎碎弄了一天……例程blinky_example中包含了gpio.h和delay.c

看main.c之前我先看了这两个,例程里应用了一个简单不精确的延时函数,用循环内延时微秒函数实现延时毫秒,挺有意思的……

 
  1. void nrf_delay_ms(uint32_t volatile number_of_ms)  
  2. {  
  3.   while(number_of_ms != 0)  
  4.   {  
  5.     number_of_ms--;  
  6.     nrf_delay_us(999);  
  7.   }  
  8. }  
 
void nrf_delay_ms(uint32_t volatile number_of_ms)
{
  while(number_of_ms != 0)
  {
    number_of_ms--;
    nrf_delay_us(999);
  }
}
 
下面是main
 
  1. int main(void)  
  2. {  
  3.   uint8_t output_state = 0;  
  4.   
  5.   // Configure LED-pins as outputs  
  6.   nrf_gpio_range_cfg_output(LED_START,LED_STOP);  
  7.   
  8.   while(true)  
  9.   {  
  10.     nrf_gpio_port_write(LED_PORT, 1 << (output_state + LED_OFFSET));  
  11.     output_state = (output_state + 1) &STATE_MASK;  
  12.     nrf_delay_ms(100);  
  13.   }  
  14. }  
 
int main(void)
{
  uint8_t output_state = 0;

  // Configure LED-pins as outputs
  nrf_gpio_range_cfg_output(LED_START,LED_STOP);

  while(true)
  {
    nrf_gpio_port_write(LED_PORT, 1 << (output_state + LED_OFFSET));
    output_state = (output_state + 1) &STATE_MASK;
    nrf_delay_ms(100);
  }
}

LED_OFFSET=2,也就是说nrf_gpio_port_write()STATE_MASK,每经历一次while循环output_state的值加1,第二次循环中便有1<<3=1000,初始化了第二个灯gpio pin 19。

 

STATE_MASK即为取其最后一位,所以在这个条件下,修改LED_START和LED_STOP的值(修改初始化范围)最多只能点亮18,19两个灯,若要点亮其他灯(最多仍然两个)则需修改LED_OFFSET的值,来改变你第一个要点亮的灯。

若要点亮多个灯则需修改STATE_MASK的值,若改为0x07即0111,会看到五个灯流水点亮0.0~

以上是关于NRF51822自学笔记 流水灯的主要内容,如果未能解决你的问题,请参考以下文章

硬件——nrf51822第一篇GPIO的使用

[异常解决] Keil安装好nRF51822开发环境,运行DEMO报错:Error:“GPIOTE_CONFIG_NUM_OF_LOW_POWER_ENVENTS” is undefined(代码片段

相比于nrf51822蓝牙模块,nrf52832蓝牙模块性能怎么样?

[nRF51822] 6基于nRF51822平台的flash读写研究

nrf51822是蓝牙4.0还是低功耗

NRF51822和NRF52832的主要区别