zephyr版本:1.10
硬件:采用青風nrf52832開發板
開發環境:虛擬機Ubuntu16.04編譯+Windows7 64bit燒錄
使用的是 zephyr-zephyr-v1.10.0/samples/bluetooth/peripheral_hr 例程
由於1.10版本采用的是cmake,所以編譯指令和之前Kbuild有所區別:
1、export兩個環境變量:(參考doc文件下的入門文檔)
1 export ZEPHYR_GCC_VARIANT=zephyr 2 export ZEPHYR_SDK_INSTALL_DIR=/opt/zephyr-sdk
2、編譯
1 cd samples/bluetooth/peripheral 2 cmake -DBOARD=nrf52_pca10040 -H. -Bbuild 3 cd build 4 make menuconfig 5 make
這樣編譯生成的固件,使用nRF Toolbox可以模擬心跳,APP中的HRM功能
但是我們要電亮led,所以,下面,寫代碼
首先拿到GPIO設備驅動的指針
1 gpio_dev = device_get_binding(CONFIG_GPIO_NRF5_P0_DEV_NAME);
其中CONFIG_GPIO_NRF5_P0_DEV_NAME是在make menuconfig中配置
Device Drivers --->
[*] GPIO Drivers --->
-*- Nordic Semiconductor nRF5X-based GPIO driver --->
[*] nRF5x GPIO Port P0 options
(myGPIO) GPIO Port P0 Device Name
(1) GPIOTE P0 interrupt priority
第二步,配置下gpio端口的四個pin,p0.17,p0.18,p0.19,p0.20,我是配置成了上拉輸出:
1 (void) gpio_pin_configure(gpio_dev, 2 17, 3 (GPIO_DIR_OUT | GPIO_PUD_PULL_UP)); 4 (void) gpio_pin_configure(gpio_dev, 5 18, 6 (GPIO_DIR_OUT | GPIO_PUD_PULL_UP)); 7 (void) gpio_pin_configure(gpio_dev, 8 19, 9 (GPIO_DIR_OUT | GPIO_PUD_PULL_UP)); 10 (void) gpio_pin_configure(gpio_dev, 11 20, 12 (GPIO_DIR_OUT | GPIO_PUD_PULL_UP));
下面就可以操作gpio了,我們按pin來操作
1 gpio_pin_write(gpio_dev, 17 + (gpio_delay_pin % 4), gpio_delay % 2);
總結:gpio操作的接口函數在include/gpio.h中定義,剛學習這個RTOS,設備驅動慢慢搞,點個燈先test下
貼上完整代碼:
1 #include <zephyr/types.h> 2 #include <stddef.h> 3 #include <string.h> 4 #include <errno.h> 5 #include <misc/printk.h> 6 #include <misc/byteorder.h> 7 #include <zephyr.h> 8 9 #include <bluetooth/bluetooth.h> 10 #include <bluetooth/hci.h> 11 #include <bluetooth/conn.h> 12 #include <bluetooth/uuid.h> 13 #include <bluetooth/gatt.h> 14 15 #include <gatt/hrs.h> 16 #include <gatt/dis.h> 17 #include <gatt/bas.h> 18 19 #include <device.h> 20 #include <board.h> 21 #include <gpio.h> 22 23 24 25 26 #define DEVICE_NAME CONFIG_BT_DEVICE_NAME 27 #define DEVICE_NAME_LEN (sizeof(DEVICE_NAME) - 1) 28 29 struct bt_conn *default_conn; 30 31 static const struct bt_data ad[] = { 32 BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)), 33 BT_DATA_BYTES(BT_DATA_UUID16_ALL, 0x0d, 0x18, 0x0f, 0x18, 0x05, 0x18), 34 }; 35 36 static const struct bt_data sd[] = { 37 BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN), 38 }; 39 40 static void connected(struct bt_conn *conn, u8_t err) 41 { 42 if (err) { 43 printk("Connection failed (err %u)\n", err); 44 } else { 45 default_conn = bt_conn_ref(conn); 46 printk("Connected\n"); 47 } 48 } 49 50 static void disconnected(struct bt_conn *conn, u8_t reason) 51 { 52 printk("Disconnected (reason %u)\n", reason); 53 54 if (default_conn) { 55 bt_conn_unref(default_conn); 56 default_conn = NULL; 57 } 58 } 59 60 static struct bt_conn_cb conn_callbacks = { 61 .connected = connected, 62 .disconnected = disconnected, 63 }; 64 65 static void bt_ready(int err) 66 { 67 if (err) { 68 printk("Bluetooth init failed (err %d)\n", err); 69 return; 70 } 71 72 printk("Bluetooth initialized\n"); 73 74 hrs_init(0x01); 75 bas_init(); 76 dis_init(CONFIG_SOC, "Manufacturer"); 77 78 err = bt_le_adv_start(BT_LE_ADV_CONN, ad, ARRAY_SIZE(ad), 79 sd, ARRAY_SIZE(sd)); 80 if (err) { 81 printk("Advertising failed to start (err %d)\n", err); 82 return; 83 } 84 85 printk("Advertising successfully started\n"); 86 } 87 88 static void auth_cancel(struct bt_conn *conn) 89 { 90 char addr[BT_ADDR_LE_STR_LEN]; 91 92 bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); 93 94 printk("Pairing cancelled: %s\n", addr); 95 } 96 97 static struct bt_conn_auth_cb auth_cb_display = { 98 .cancel = auth_cancel, 99 }; 100 101 void main(void) 102 { 103 int err; 104 int gpio_delay = 0; 105 int gpio_delay_pin = 0; 106 struct device *gpio_dev; 107 108 err = bt_enable(bt_ready); 109 if (err) { 110 printk("Bluetooth init failed (err %d)\n", err); 111 return; 112 } 113 114 bt_conn_cb_register(&conn_callbacks); 115 bt_conn_auth_cb_register(&auth_cb_display); 116 117 /* 118 * 添加個人測試代碼,LED閃爍測試 119 */ 120 121 gpio_dev = device_get_binding(CONFIG_GPIO_NRF5_P0_DEV_NAME); 122 123 (void) gpio_pin_configure(gpio_dev, 124 17, 125 (GPIO_DIR_OUT | GPIO_PUD_PULL_UP)); 126 (void) gpio_pin_configure(gpio_dev, 127 18, 128 (GPIO_DIR_OUT | GPIO_PUD_PULL_UP)); 129 (void) gpio_pin_configure(gpio_dev, 130 19, 131 (GPIO_DIR_OUT | GPIO_PUD_PULL_UP)); 132 (void) gpio_pin_configure(gpio_dev, 133 20, 134 (GPIO_DIR_OUT | GPIO_PUD_PULL_UP)); 135 136 137 /* Implement notification. At the moment there is no suitable way 138 * of starting delayed work so we do it here 139 */ 140 while (1) { 141 k_sleep(MSEC_PER_SEC); 142 143 gpio_delay++; 144 gpio_delay = gpio_delay % 2; 145 gpio_pin_write(gpio_dev, 17 + (gpio_delay_pin % 4), gpio_delay % 2); 146 if(gpio_delay == 0) 147 { 148 gpio_delay_pin++; 149 } 150 151 /* Heartrate measurements simulation */ 152 hrs_notify(); 153 154 /* Battery level simulation */ 155 bas_notify(); 156 } 157 }

