Browse Source

recode

3lead_uart_test_ok_version
zhaohe 1 year ago
parent
commit
03d2570507
  1. 4
      .vscode/settings.json
  2. 4
      app/app.uvoptx
  3. 8
      app/app.uvprojx
  4. 6
      app/main.c
  5. 2
      app/src/basic/board.c
  6. 2
      app/src/basic/board.h
  7. 2
      app/src/basic/zble_module.c
  8. 2
      app/src/basic/zdatachannel_service.c
  9. 21
      app/src/one_conduction/one_conduction_board.c
  10. 6
      app/src/one_conduction/one_conduction_main.c
  11. 0
      app/src/three_conduction/three_conduction_board.c
  12. 0
      app/src/three_conduction/three_conduction_board.h
  13. 265
      app/src/three_lead/three_lead_board.c
  14. 65
      app/src/three_lead/three_lead_board.h
  15. 0
      app/src/three_lead/three_lead_main.c
  16. 0
      app/src/three_lead/three_lead_main.h
  17. 2
      libznordic

4
.vscode/settings.json

@ -56,6 +56,8 @@
"driver_ssd1306.h": "c",
"driver_ssd1306_font.h": "c",
"driver_ssd1306_basic.h": "c",
"driver_ssd1306_interface.h": "c"
"driver_ssd1306_interface.h": "c",
"three_lead_board.h": "c",
"znordic.h": "c"
}
}

4
app/app.uvoptx

@ -1459,8 +1459,8 @@
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\libznordic\src\sys.c</PathWithFileName>
<FilenameWithoutPath>sys.c</FilenameWithoutPath>
<PathWithFileName>..\libznordic\src\znordic.c</PathWithFileName>
<FilenameWithoutPath>znordic.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>

8
app/app.uvprojx

@ -3741,9 +3741,9 @@
<GroupName>libznordic</GroupName>
<Files>
<File>
<FileName>sys.c</FileName>
<FileName>znordic.c</FileName>
<FileType>1</FileType>
<FilePath>..\libznordic\src\sys.c</FilePath>
<FilePath>..\libznordic\src\znordic.c</FilePath>
</File>
</Files>
</Group>
@ -7505,9 +7505,9 @@
<GroupName>libznordic</GroupName>
<Files>
<File>
<FileName>sys.c</FileName>
<FileName>znordic.c</FileName>
<FileType>1</FileType>
<FilePath>..\libznordic\src\sys.c</FilePath>
<FilePath>..\libznordic\src\znordic.c</FilePath>
</File>
</Files>
</Group>

6
app/main.c

@ -1,5 +1,5 @@
#include "one_conduction/one_conduction_main.h"
#include "three_conduction/three_conduction_main.h"
#include "three_lead\three_lead_board.h"
int main(void) { one_conduction_main(); }
@ -75,7 +75,7 @@ static void board_init() {
}
int main(void) {
zsys_init();
znordic_init();
NRF_LOG_INFO("compile time :%s", __TIME__);
NRF_LOG_INFO("Version :%d", VERSION);
NRF_LOG_INFO("Manufacturer :%s", MANUFACTURER_NAME);
@ -98,6 +98,6 @@ int main(void) {
// wd_init();
zble_module_start_adv();
zsys_loop();
znordic_loop();
}
#endif

2
app/src/basic/board.c

@ -2,7 +2,7 @@
#include "app_timer.h"
#include "nrf_gpio.h"
#include "sys.h"
#include "znordic.h"
//
#include "diskio_blkdev.h"
#include "ff.h"

2
app/src/basic/board.h

@ -3,7 +3,7 @@
#include "nrf_drv_saadc.h"
#include "nrf_drv_twi.h"
#include "sys.h"
#include "znordic.h"
/*******************************************************************************
* DEBUG_LIGHT *

2
app/src/basic/zble_module.c

@ -5,7 +5,7 @@
#include <stdint.h>
#include <string.h>
#include "sys.h"
#include "znordic.h"
/*******************************************************************************
* 广 *
*******************************************************************************/

2
app/src/basic/zdatachannel_service.c

@ -4,7 +4,7 @@
#include "ble_srv_common.h"
#include "nrf_log.h"
#include "sdk_common.h"
#include "sys.h"
#include "znordic.h"
#define ZDATACHANNEL_UUID_NUS_SERVICE 0x0001 /**< The UUID of the Nordic UART Service. */
#define ZDATACHANNEL_TX_CHARACTERISTIC 0x0003 /**< The UUID of the TX Characteristic. */

21
app/src/one_conduction/one_conduction_board.c

@ -1,6 +1,6 @@
#include "one_conduction_board.h"
#include "sys.h"
#include "znordic.h"
//
#include "app_timer.h"
#include "diskio_blkdev.h"
@ -40,21 +40,6 @@
* TOOLS *
*******************************************************************************/
static void znrf_gpio_cfg_output(uint32_t pin_number, nrf_gpio_pin_pull_t pull) { //
nrf_gpio_cfg(pin_number, NRF_GPIO_PIN_DIR_OUTPUT, NRF_GPIO_PIN_INPUT_DISCONNECT, pull, NRF_GPIO_PIN_S0S1, NRF_GPIO_PIN_NOSENSE);
}
static int16_t adc_channel_read_val(uint16_t channel) {
nrf_saadc_value_t value;
ret_code_t err_code;
err_code = nrfx_saadc_sample_convert(channel, &value);
if (err_code != NRF_SUCCESS) {
ZLOGE("nrfx_saadc_sample_convert(%d) fail err_code:%d", channel, err_code);
return 0;
}
return value;
}
/*******************************************************************************
* ADC *
*******************************************************************************/
@ -202,7 +187,7 @@ void SingleLeadECG_ecg_init() {
bool SingleLeadECG_ecg_nlod_get_connected_state() { return nrf_gpio_pin_read(ECG_NLOD_PIN) == 0; }
bool SingleLeadECG_ecg_plod_get_connected_state() { return nrf_gpio_pin_read(ECG_PLOD_PIN) == 0; }
int16_t SingleLeadECG_ecg_plod_get_ecg_val() { return adc_channel_read_val(ECG_ADC_CHANNEL); }
int16_t SingleLeadECG_ecg_plod_get_ecg_val() { return znrf_adc_channel_read_val(ECG_ADC_CHANNEL); }
/*******************************************************************************
* BATTERY *
@ -213,7 +198,7 @@ void SingleLeadECG_battery_init() {
ZERROR_CHECK(nrfx_saadc_channel_init(BATTERY_ADC_CHANNEL, &channel_config));
}
int16_t SingleLeadECG_battery_get_adc_val() {
int16_t val = adc_channel_read_val(BATTERY_ADC_CHANNEL);
int16_t val = znrf_adc_channel_read_val(BATTERY_ADC_CHANNEL);
return val;
}

6
app/src/one_conduction/one_conduction_main.c

@ -1,7 +1,7 @@
#include "basic/zble_module.h"
#include "basic/zdatachannel_service.h"
#include "one_conduction_board.h"
#include "sys.h"
#include "znordic.h"
ZDATACHANNEL_DEF(m_zhrs, 2 /*回调事件优先级*/, 1 /*client num*/);
@ -56,7 +56,7 @@ void on_service_init(void) {
}
void one_conduction_main() {
zsys_init();
znordic_init();
NRF_LOG_INFO("compile time :%s", __TIME__);
NRF_LOG_INFO("Version :%d", VERSION);
NRF_LOG_INFO("Manufacturer :%s", MANUFACTURER_NAME);
@ -69,5 +69,5 @@ void one_conduction_main() {
zble_module_init(&cfg);
zble_module_start_adv();
zsys_loop();
znordic_loop();
}

0
app/src/three_conduction/three_conduction_board.c

0
app/src/three_conduction/three_conduction_board.h

265
app/src/three_lead/three_lead_board.c

@ -0,0 +1,265 @@
#include "three_lead_board.h"
#include "znordic.h"
//
#include "app_timer.h"
#include "diskio_blkdev.h"
#include "ff.h"
#include "nrf_block_dev_sdc.h"
#include "nrf_delay.h"
#include "nrf_drv_pwm.h"
#include "nrf_drv_saadc.h"
#include "nrf_drv_twi.h"
#include "nrf_drv_wdt.h"
#include "nrf_gpio.h"
#define SCREEN_SPI_INSTANCE 0
#define SCREEN_RESET_PIN 20
#define SCREEN_POWER_PIN 30
#define SCREEN_A0PIN 31
#define SCREEN_CS_PIN 29
#define SCREEN_CLK_PIN 4
#define SCREEN_MOSI_PIN 11
#define LED_GREEN_PIN 9
#define LED_BLUE_PIN 10
#define ECG_NLOD_PIN 3
#define ECG_PLOD_PIN 28
#define ECG_ADC_PIN NRF_SAADC_INPUT_AIN2
#define ECG_ADC_CHANNEL 0 // 不重复即可
#define BATTERY_ADC_PIN NRF_SAADC_INPUT_VDD
#define BATTERY_ADC_CHANNEL 1 // 不重复即可
#define EEPROM_I2C_SCL_M 15 // I2C SCL引脚
#define EEPROM_I2C_SDA_M 17 // I2C SDA引脚
#define EEPROM_I2C_INSTANCE 1 // I2C使用的硬件控制器ID
/*******************************************************************************
* TOOLS *
*******************************************************************************/
/*******************************************************************************
* ADC *
*******************************************************************************/
void ThreeLeadECG_adc_module_init() {
nrf_drv_saadc_config_t adccfg = NRFX_SAADC_DEFAULT_CONFIG;
adccfg.resolution = NRF_SAADC_RESOLUTION_12BIT; // 4096
ZERROR_CHECK(nrf_drv_saadc_init(&adccfg, NULL));
}
/*******************************************************************************
* *
*******************************************************************************/
static nrf_drv_pwm_t m_beep_pwm0 = NRF_DRV_PWM_INSTANCE(0);
static nrf_pwm_values_individual_t m_beep_pwm0_seq_values = {0};
static nrf_pwm_sequence_t const m_beep_pwm0_seq = {
.values.p_individual = &m_beep_pwm0_seq_values,
.length = NRF_PWM_VALUES_LENGTH(m_beep_pwm0_seq_values),
.repeats = 0,
.end_delay = 0,
};
static nrf_drv_pwm_config_t const m_beep_pwm0_config0 = {
.output_pins = {11},
.irq_priority = APP_IRQ_PRIORITY_LOWEST,
.base_clock = NRF_PWM_CLK_125kHz,
.count_mode = NRF_PWM_MODE_UP,
.top_value = 46, // 125kHz / 46 = 2.717k
.load_mode = NRF_PWM_LOAD_INDIVIDUAL,
.step_mode = NRF_PWM_STEP_AUTO,
};
void ThreeLeadECG_beep_init() { APP_ERROR_CHECK(nrfx_pwm_init(&m_beep_pwm0, &m_beep_pwm0_config0, NULL)); }
void ThreeLeadECG_beep_set_state(bool state) {
if (state) {
m_beep_pwm0_seq_values.channel_0 = 23; // top_value
nrfx_pwm_simple_playback(&m_beep_pwm0, &m_beep_pwm0_seq, 1, NRF_DRV_PWM_FLAG_LOOP);
} else {
nrfx_pwm_stop(&m_beep_pwm0, true);
}
}
/*******************************************************************************
* SCREEN *
*******************************************************************************/
typedef struct {
// BASIC IF
uint32_t reset_pin;
uint32_t power_pin;
uint32_t a0pin; // cmd/data
// SPI IF
uint32_t cs_pin;
uint32_t clk_pin;
uint32_t mosi_pin;
} screen_handler_t;
static screen_handler_t m_screen_handler = {
.reset_pin = SCREEN_RESET_PIN,
.power_pin = SCREEN_POWER_PIN,
.a0pin = SCREEN_A0PIN,
.cs_pin = SCREEN_CS_PIN,
.clk_pin = SCREEN_CLK_PIN,
.mosi_pin = SCREEN_MOSI_PIN,
};
static const nrf_drv_spi_t m_screen_spi = NRF_DRV_SPI_INSTANCE(SCREEN_SPI_INSTANCE); /**< SPI instance. */
void ThreeLeadECG_screen_init() {
znrf_gpio_cfg_output(SCREEN_RESET_PIN, NRF_GPIO_PIN_NOPULL);
znrf_gpio_cfg_output(SCREEN_POWER_PIN, NRF_GPIO_PIN_NOPULL);
znrf_gpio_cfg_output(SCREEN_A0PIN, NRF_GPIO_PIN_NOPULL);
nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
spi_config.ss_pin = SCREEN_CS_PIN; // NRF_DRV_SPI_PIN_NOT_USED
spi_config.miso_pin = NRF_DRV_SPI_PIN_NOT_USED;
spi_config.mosi_pin = SCREEN_MOSI_PIN;
spi_config.sck_pin = SCREEN_CLK_PIN;
spi_config.frequency = NRF_DRV_SPI_FREQ_1M;
ZERROR_CHECK(nrf_drv_spi_init(&m_screen_spi, &spi_config, NULL, NULL));
}
void ThreeLeadECG_screen_deinit() {
// TODO
}
uint8_t ThreeLeadECG_spi_init(void) { return 0; }
uint8_t ThreeLeadECG_spi_deinit(void) { return 0; }
uint8_t ThreeLeadECG_spi_cmd_data_gpio_init(void) { return 0; }
uint8_t ThreeLeadECG_spi_cmd_data_gpio_deinit(void) { return 0; }
void ThreeLeadECG_debug_print(const char *const fmt, ...) {}
uint8_t ThreeLeadECG_reset_gpio_init(void) { return 0; }
uint8_t ThreeLeadECG_reset_gpio_deinit(void) { return 0; }
uint8_t ThreeLeadECG_spi_write_cmd(uint8_t *buf, uint16_t len) { //
ZERROR_CHECK(nrf_drv_spi_transfer(&m_screen_spi, buf, len, NULL, 0));
return 0;
}
void ThreeLeadECG_delay_ms(uint32_t ms) { nrf_delay_ms(ms); }
uint8_t ThreeLeadECG_spi_cmd_data_gpio_write(uint8_t value) {
if (value) {
nrf_gpio_pin_set(SCREEN_A0PIN);
} else {
nrf_gpio_pin_clear(SCREEN_A0PIN);
}
return 0;
}
uint8_t ThreeLeadECG_reset_gpio_write(uint8_t value) {
if (value) {
nrf_gpio_pin_set(SCREEN_RESET_PIN);
} else {
nrf_gpio_pin_clear(SCREEN_RESET_PIN);
}
return 0;
}
/*******************************************************************************
* LED *
*******************************************************************************/
void ThreeLeadECG_led_init() {
znrf_gpio_cfg_output(LED_GREEN_PIN, NRF_GPIO_PIN_NOPULL);
znrf_gpio_cfg_output(LED_BLUE_PIN, NRF_GPIO_PIN_NOPULL);
}
void ThreeLeadECG_led_green_set_state(bool state) {
if (state) {
nrf_gpio_pin_set(LED_GREEN_PIN);
} else {
nrf_gpio_pin_clear(LED_GREEN_PIN);
}
}
void ThreeLeadECG_led_blue_set_state(bool state) {
if (state) {
nrf_gpio_pin_set(LED_BLUE_PIN);
} else {
nrf_gpio_pin_clear(LED_BLUE_PIN);
}
}
/*******************************************************************************
* ecg *
*******************************************************************************/
void ThreeLeadECG_ecg_init() {
nrf_saadc_channel_config_t channel_config = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(ECG_ADC_PIN);
channel_config.acq_time = NRF_SAADC_ACQTIME_40US;
ZERROR_CHECK(nrfx_saadc_channel_init(ECG_ADC_CHANNEL, &channel_config));
nrf_gpio_cfg_sense_input(ECG_NLOD_PIN, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_NOSENSE);
nrf_gpio_cfg_sense_input(ECG_PLOD_PIN, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_NOSENSE);
}
bool ThreeLeadECG_ecg_nlod_get_connected_state() { return nrf_gpio_pin_read(ECG_NLOD_PIN) == 0; }
bool ThreeLeadECG_ecg_plod_get_connected_state() { return nrf_gpio_pin_read(ECG_PLOD_PIN) == 0; }
int16_t ThreeLeadECG_ecg_plod_get_ecg_val() { return znrf_adc_channel_read_val(ECG_ADC_CHANNEL); }
/*******************************************************************************
* BATTERY *
*******************************************************************************/
void ThreeLeadECG_battery_init() {
nrf_saadc_channel_config_t channel_config = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(BATTERY_ADC_PIN);
channel_config.acq_time = NRF_SAADC_ACQTIME_10US;
ZERROR_CHECK(nrfx_saadc_channel_init(BATTERY_ADC_CHANNEL, &channel_config));
}
int16_t ThreeLeadECG_battery_get_adc_val() {
int16_t val = znrf_adc_channel_read_val(BATTERY_ADC_CHANNEL);
return val;
}
/*******************************************************************************
* eeprom *
*******************************************************************************/
static const nrf_drv_twi_t m_eeprom_twi_master = NRF_DRV_TWI_INSTANCE(EEPROM_I2C_INSTANCE);
void ThreeLeadECG_eeprom_init() {
const nrf_drv_twi_config_t config = {
.scl = EEPROM_I2C_SCL_M,
.sda = EEPROM_I2C_SDA_M,
.frequency = NRF_DRV_TWI_FREQ_100K,
.interrupt_priority = APP_IRQ_PRIORITY_HIGH,
.clear_bus_init = false,
};
ZERROR_CHECK(nrf_drv_twi_init(&m_eeprom_twi_master, &config, NULL, NULL));
nrf_drv_twi_enable(&m_eeprom_twi_master);
}
static uint8_t eeprom_cache[EEPROM_PAGE + 2];
static void assign_i2c_add(uint32_t add, bool wr, uint8_t *i2cadd, uint8_t *memadd0, uint8_t *memadd1) {
// DEVICE SELECT
// bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
// 1 0 1 0 E2 A17 A16 RW(W=0)
//
// PS: E2 0bit3为0
//
// MEM0
// bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8
// MEM1
// bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
//
*i2cadd = 0xA0;
uint8_t a16a17 = (add >> 16) & 0x03;
*i2cadd |= a16a17 << 1;
*i2cadd = wr ? *i2cadd & 0xFE : *i2cadd | 0x01;
*memadd0 = add >> 8;
*memadd1 = add & 0xFF;
}
void ThreeLeadECG_eeprom_write(uint16_t page, uint8_t *data, uint16_t len) { //
uint32_t addr = page * EEPROM_PAGE;
len = len > EEPROM_PAGE ? EEPROM_PAGE : len;
uint8_t deviceSelect = 0;
assign_i2c_add(addr, true, &deviceSelect, &eeprom_cache[0], &eeprom_cache[1]);
nrf_drv_twi_tx(&m_eeprom_twi_master, deviceSelect, eeprom_cache, len + 2, false);
}
void ThreeLeadECG_eeprom_read(uint32_t add, uint8_t *data, uint16_t len) {
uint8_t deviceSelect = 0;
uint8_t wadd[2] = {0};
assign_i2c_add(add, false, &deviceSelect, &wadd[0], &wadd[1]);
nrf_drv_twi_tx(&m_eeprom_twi_master, deviceSelect, wadd, 2, false);
deviceSelect |= 0x01; // read
nrf_drv_twi_rx(&m_eeprom_twi_master, deviceSelect, data, len);
}

65
app/src/three_lead/three_lead_board.h

@ -0,0 +1,65 @@
#pragma once
#define VERSION 1
#define MANUFACTURER_NAME "iflytop"
#define BLE_NAME "iflytop_test"
/*******************************************************************************
* INCLUDE *
*******************************************************************************/
#include <stdbool.h>
#include "basic/ssd1306/driver_ssd1306_interface.h"
/*******************************************************************************
* basic *
*******************************************************************************/
void ThreeLeadECG_adc_module_init();
/*******************************************************************************
* *
*******************************************************************************/
void ThreeLeadECG_beep_init();
void ThreeLeadECG_beep_set_state(bool state);
/*******************************************************************************
* EEPROM *
*******************************************************************************/
/**
*
* PageSize 256byte
*
*/
#define EEPROM_PAGE 256
void ThreeLeadECG_eeprom_init();
void ThreeLeadECG_eeprom_write_page(uint16_t page, uint8_t* data, uint16_t len);
void ThreeLeadECG_eeprom_read(uint32_t add, uint8_t* data, uint16_t len);
/*******************************************************************************
* SCREEN *
*******************************************************************************/
void ThreeLeadECG_screen_init();
void ThreeLeadECG_screen_deinit();
/*******************************************************************************
* LED *
*******************************************************************************/
void ThreeLeadECG_led_init();
void ThreeLeadECG_led_green_set_state(bool state);
void ThreeLeadECG_led_blue_set_state(bool state);
/*******************************************************************************
* ECG *
*******************************************************************************/
void ThreeLeadECG_ecg_init();
bool ThreeLeadECG_ecg_nlod_get_connected_state();
bool ThreeLeadECG_ecg_plod_get_connected_state();
int16_t ThreeLeadECG_ecg_plod_get_ecg_val();
/*******************************************************************************
* BATTERY *
*******************************************************************************/
void ThreeLeadECG_battery_init();
int16_t ThreeLeadECG_battery_get_adc_val();

0
app/src/three_conduction/three_conduction_main.h → app/src/three_lead/three_lead_main.c

0
app/src/three_conduction/three_conduction_main.c → app/src/three_lead/three_lead_main.h

2
libznordic

@ -1 +1 @@
Subproject commit e20cb4c21a5a95b8b60d76d29156faba65246b67
Subproject commit efdb1b55c3432d3b539fb9fcecb14209874dae0d
Loading…
Cancel
Save