• 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~

  • 相关阅读:
    Prometheus入门教程(二):Prometheus + Grafana实现可视化、告警
    Prometheus 入门教程(一):Prometheus 快速入门
    Prometheus 系列开篇:为什么要学 Prometheus ?
    你总是遗憾,是因为你还没想好,你的一生想怎么过!
    搞 Java 的年薪 40W 是什么水平?
    闪送,为何能从顺丰中杀出一条血路?
    安全攻击溯源思路及案例
    Windows下登录凭证窃取技巧
    Linux下登录凭证窃取技巧
    如何探测内网存活主机
  • 原文地址:https://www.cnblogs.com/ldgforever/p/5854181.html
Copyright © 2020-2023  润新知