[讨论] DA14580 LED blink ---------DA14580的IO控制。

dontium   2017-3-26 15:42 楼主


  首先要有个感性认识,
         打开DA14580的blinky_arrived例程,

  1. /**
  2. ****************************************************************************************
  3. * [url=home.php?mod=space&uid=159083]@brief[/url]  Main routine of the UART example
  4. *
  5. ****************************************************************************************
  6. */
  7. int main (void)
  8. {
  9.     system_init();
  10.     periph_init();
  11.     blinky_test();
  12.     while(1);
  13. }


因为仅是一个IO口及UART工作,所以,代码很简单。

将它编译,运行,并打开串口工具,



a1.jpg






回复评论 (3)

1、IO的控制      ---------system_init

  1. /**
  2. ****************************************************************************************
  3. * @brief System Initiialization
  4. *
  5. *
  6. ****************************************************************************************
  7. */
  8. void system_init(void)
  9. {
  10.     SetWord16(CLK_AMBA_REG, 0x00);                 // set clocks (hclk and pclk ) 16MHz
  11.     SetWord16(SET_FREEZE_REG,FRZ_WDOG);            // stop watch dog   
  12.     SetBits16(SYS_CTRL_REG,PAD_LATCH_EN,1);        // open pads
  13.     SetBits16(SYS_CTRL_REG,DEBUGGER_ENABLE,1);     // open debugger
  14.     SetBits16(PMU_CTRL_REG, PERIPH_SLEEP,0);       // exit peripheral power down
  15. }




程序中,SetWord16是对寄存器直接写入的宏。第一个参数为寄存器的直接地址,第二个参数为要写入的值,


Dialog常用这种办法,实现对芯片的设置的。
在它的头文件datasheet.h中,可以看到,给出了每个寄存器的地址定义,对于需要对每个位控制的寄存器,也提供了相应的结构,如:
  1. /*=============================*/
  2. struct __CLK_PER_REG
  3. /*=============================*/
  4. {
  5.     WORD BITFLD_TMR_DIV                              : 2;
  6.     WORD                                             : 1;
  7.     WORD BITFLD_TMR_ENABLE                           : 1;
  8.     WORD BITFLD_WAKEUPCT_ENABLE                      : 1;
  9.     WORD BITFLD_I2C_ENABLE                           : 1;
  10.     WORD BITFLD_UART2_ENABLE                         : 1;
  11.     WORD BITFLD_UART1_ENABLE                         : 1;
  12.     WORD BITFLD_SPI_DIV                              : 2;
  13.     WORD                                             : 1;
  14.     WORD BITFLD_SPI_ENABLE                           : 1;
  15.     WORD                                             : 2;
  16.     WORD BITFLD_QUAD_ENABLE                          : 1;
  17. };






点赞  2017-3-26 15:52
2、blinky_test函数

  1. /**
  2. ****************************************************************************************
  3. * @brief Blinky test fucntion
  4. *
  5. *
  6. ****************************************************************************************
  7. */

  8. void blinky_test(void)
  9. {
  10.     int i=0;

  11.     // Select function of the port P1.0 to pilot the LED
  12.     printf_string("\n\r\n\r");
  13.     printf_string("***************\n\r");
  14.     printf_string("* BLINKY DEMO *\n\r");
  15.     printf_string("***************\n\r");

  16.     while(1) {
  17.         i++;
  18.         if (LED_OFF_THRESHOLD   == i) {
  19.             GPIO_SetActive( LED_PORT, LED_PIN);
  20.             printf_string("\n\r *LED ON* ");
  21.         }
  22.         if (LED_ON_THRESHOLD == i) {
  23.             GPIO_SetInactive(LED_PORT, LED_PIN);
  24.             printf_string("\n\r *LED OFF* ");
  25.         }
  26.                                 if (i== 2*LED_ON_THRESHOLD){
  27.                                         i=0;
  28.                                 }
  29.     }
  30. }


此函数使用了两个控制IO状态的函数:
GPIO_SetActive
GPIO_SetInactive
其关键的也是使用SetWord16宏来对寄存器控制,但多了个端口的凑数。
点赞  2017-3-26 15:58
不错,有用。
点赞  2017-5-6 01:12
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复