木子剑
生命不熄,学习不止!

阅读源代码,收集了有以下信息:

\os\lib下内核的sensors.h,   sensors.c

\os\dev下内核的battery-sensor.h

 

\MYdemo\user\cc2538-dev下的cc2538-sensors.h、   vdd3-sensor.h、   vdd3-sensor.c

\MYdemo\user\src下的smartrf-sensors.c

examples\mqtt-client\arch\cpu\cc2538的builtin-sensors.c,  builtin-sensors.h

 

我们把源码放在一起,看一下它们的关系链

 1 // cc2538-sensors.h的内容
 2 #define CC2538_SENSORS_VALUE_TYPE_RAW         0 /**< Request the raw reading */
 3 #define CC2538_SENSORS_VALUE_TYPE_CONVERTED   1 /**< Request the converted reading */
 4 #define CC2538_SENSORS_ERROR         0x80000000 /**< Generic Error */
 5 
 6 
 7 // vdd3-sensor.h的内容
 8 #define VDD3_SENSOR "VDD3"
 9 extern const struct sensors_sensor vdd3_sensor;
10 
11 
12 // vdd3-sensor.c的内容
13 static int
14 value(int type)
15 {
16   int raw = adc_get(SOC_ADC_ADCCON_CH_VDD_3, SOC_ADC_ADCCON_REF_INT,
17                     SOC_ADC_ADCCON_DIV_512);
18 
19   if(type == CC2538_SENSORS_VALUE_TYPE_RAW) {
20     return raw;
21   } else if(type == CC2538_SENSORS_VALUE_TYPE_CONVERTED) {
22     return raw * (3 * 1190) / (2047 << 4);
23   }
24 
25   return CC2538_SENSORS_ERROR;
26 }
27 
28 static int
29 configure(int type, int value)
30 {
31   return 0;
32 }
33 
34 static int
35 status(int type)
36 {
37   return 1;
38 }
39 
40 SENSORS_SENSOR(vdd3_sensor, VDD3_SENSOR, value, configure, status);
41 
42 
43 
44 // smartrf-sensors.c的内容
45 /** \brief Exports a global symbol to be used by the sensor API */
46 SENSORS(&als_sensor, &cc2538_temp_sensor, &vdd3_sensor);
47 
48 
49 
50 // builtin-sensors.c的内容
51 static char *
52 vdd3_reading(void)
53 {
54   memset(tmp_buf, 0, TMP_BUF_SZ);
55   snprintf(tmp_buf, TMP_BUF_SZ, "\"VDD3 (mV)\":%d",
56            vdd3_sensor.value(CC2538_SENSORS_VALUE_TYPE_CONVERTED));
57   return tmp_buf;
58 }
59 
60 static void
61 vdd3_init(void)
62 {
63   SENSORS_ACTIVATE(vdd3_sensor);
64 }

 我个人暂时理解如下:

1   通过struct sensors_sensor申明一个结构体变量vdd3_sensor,它有4个成员。

2   通过SENSORS_SENSOR对vdd3_sensor的4个成员进初始化。

3   通过SENSORS进行注册了,相当于AUTOSTART_PROCESSES(&xxxx),这样理解可能会好一些。

4  通过SENSORS_ACTIVATE对vdd3_sensor传感器进行激活!

5  通过结构体vdd3_sensor的value成员,读取传感器的值。

总体思维方向就是这样了,细节的话要阅读源码具体进行分析。。。。。。。

 

题外话,本来想在IAR试了一下随机函数的,但报内存不足了,玩了这么久也不知道代码多大,让我们来看一下:

 

晕,RAM快搞完了!马上就要蛋疼了~~~~~~~~~~

 

 

时间:2020-11-30

今天测试了一下xxxx_sensors,也验证了我之前的想法,竟然猜对了,         哈哈!!

AUTO_processes.c测试源码:

 1 #include "contiki.h"
 2 #include "leds.h"       //测试1
 3 #include "button-hal.h"
 4 #include "sensors.h"
 5 #include <stdio.h> /* For printf() */
 6 
 7 
 8 /*--------------------------测试打印功能-------------------------------------*/
 9 PROCESS(hello_process, "Hello process");
10 
11 PROCESS_THREAD(hello_process, ev, data)
12 {
13   PROCESS_BEGIN();
14   while(1) {
15     printf("printf--Helloworld\n");
16     UARTprintf("UARTprintf--hello-world\n\n");
17     PROCESS_EXIT(); //退出进程,释放资源
18   }
19   PROCESS_END();
20 }
21 
22 
23 /*-------------------------测试CC2538的PC3闪灯-------------------------------*/
24 PROCESS(GpioIputOutputTest, "GpioIputOutputTest");
25 PROCESS_THREAD(GpioIputOutputTest, ev, data)
26  {
27      static struct etimer et02;
28      PROCESS_BEGIN();
29 
30      etimer_set(&et02,CLOCK_SECOND/2);
31      while(1)
32      {
33         PROCESS_WAIT_EVENT();
34         if(ev == PROCESS_EVENT_TIMER)leds_toggle(LEDS_GREEN);
35         etimer_reset(&et02);
36      }
37      PROCESS_END();
38 }
39 
40 
41 /*-------------------------Button HAL AND sensor测试----------------------------------------*/
42 #include "cc2538-sensors.h"  
43 
44 PROCESS(button_hal_example, "Button HAL Example");
45 PROCESS_THREAD(button_hal_example, ev, data)
46 {
47   button_hal_button_t *btn;
48   PROCESS_BEGIN();
49   btn = button_hal_get_by_index(0);
50   static u16_t d=1;
51 
52   UARTprintf("Button HAL example.\n");
53   UARTprintf("Device button count: %u.\n", button_hal_button_count);
54 
55   SENSORS_ACTIVATE(vdd3_sensor);       //激活传感器
56   SENSORS_ACTIVATE(cc2538_temp_sensor);
57 
58   if(btn) {
59     UARTprintf("%s on pin %u with ID=0, Logic=%s, Pull=%s\n",
60            BUTTON_HAL_GET_DESCRIPTION(btn), btn->pin,
61            btn->negative_logic ? "Negative" : "Positive",
62            btn->pull == GPIO_HAL_PIN_CFG_PULL_UP ? "Pull Up" : "Pull Down");
63   }
64   while(1) {
65     PROCESS_YIELD();
66     if(ev == button_hal_press_event) {             //有按下时,
67       UARTprintf("The number %d of Press.\n",d++); //打印第n次按下
68       UARTprintf("cc2538-value:V%d\n",vdd3_sensor.value(CC2538_SENSORS_VALUE_TYPE_CONVERTED)); //芯片供电,转换后的值
69       UARTprintf("cc2538-temp:%d\n",cc2538_temp_sensor.value(CC2538_SENSORS_VALUE_TYPE_CONVERTED)); //芯片温度,转换后的值
70     }
71   }
72   PROCESS_END();
73 }
74 
75 
76 /*------------------------所有自启动模式的PROCESSES--------------------------*/
77 AUTOSTART_PROCESSES(
78                     &hello_process,                 // printf测试--通过
79                     &GpioIputOutputTest,            // led基本测试--通过
80                     &button_hal_example             // 按键和传感器测试--当前测试
81                     );

 

运行效果图:

 我是用IAR system系统在WINDOWS上测试的,当前CPU电压3.22V, 当前CPU温度24.5度,按下3次按键。

 

接下来,我们学习的内容是【 Shell 】交互操作,

是UNIX保留下来的产物,它是命令解释器,直接与内核交互的工具。

posted on 2020-11-23 09:18  木子剑  阅读(508)  评论(0编辑  收藏  举报