From b56b9366e6c80572256d715b68cd006d2c352d34 Mon Sep 17 00:00:00 2001 From: TD <tobiasz.dryjanski@pg.edu.pl> Date: Fri, 26 Nov 2021 19:12:28 +0100 Subject: [PATCH] zmiana cw3 na adc --- Instrukcje.md | 31 +-- cw3_template/.vscode/settings.json | 6 +- cw3_template/kimia_usb_log.c | 200 ++++++++++++++++++ cw3_template/kimia_usb_log.h | 77 +++++++ cw3_template/main.c | 93 ++++---- cw3_template/pca10059/s140/armgcc/Makefile | 7 +- .../s140/armgcc/_build/nrf52840_xxaa.bin | Bin 48572 -> 0 bytes .../s140/armgcc/_build/nrf52840_xxaa.in | 1 - .../pca10059/s140/config/sdk_config.h | 169 ++++++++++++++- cw3_template/temperature.c | 25 --- cw3_template/temperature.h | 4 - cw3_template/usb.c | 119 ----------- cw3_template/usb.h | 48 ----- 13 files changed, 507 insertions(+), 273 deletions(-) create mode 100644 cw3_template/kimia_usb_log.c create mode 100644 cw3_template/kimia_usb_log.h delete mode 100755 cw3_template/pca10059/s140/armgcc/_build/nrf52840_xxaa.bin delete mode 100644 cw3_template/pca10059/s140/armgcc/_build/nrf52840_xxaa.in delete mode 100644 cw3_template/temperature.c delete mode 100644 cw3_template/temperature.h delete mode 100644 cw3_template/usb.c delete mode 100644 cw3_template/usb.h diff --git a/Instrukcje.md b/Instrukcje.md index 54d5158..cfbc190 100644 --- a/Instrukcje.md +++ b/Instrukcje.md @@ -184,28 +184,29 @@ Tranzystory sÄ elementami elektronicznymi ktĂłre przewodzÄ prÄ d warunkowo. Wa ĹšrĂłdĹa: img: https://www.vhv.rs/viewpic/iJxRhbb_free-vector-electronic-phototransistor-pnp-circuit-phototransistor-symbol/ - - + +## Konwerter analogowo-cyfrowy + W przypadku diody w lab1 API nrf52 zajÄĹo siÄ wszystkimi niskopoziomowymi problemami za nas, by zapaliÄ diodÄ. JeĹli chcemy wysterowaÄ lub odczytaÄ inny element musimy napisaÄ sterownik samemu. Do tego moĹźemy uĹźyÄ znanego juĹź GPIO lub ADC (Analog-Digital Converter), korzystajÄ c z niskopoziomowego API tych moduĹĂłw. - +Konwerter ADC zamienia wartoĹÄ analogowÄ (napiÄcie) na wartoĹÄ cyfrowÄ (liczbÄ w pamiÄci). + +== TODO == -## Zaawansowana obsĹuga GPIO - -W przypadku diody w lab1 API nrf52 zajÄĹo siÄ wszystkimi niskopoziomowymi problemami za nas, by zapaliÄ diodÄ. JeĹli chcemy wysterowaÄ lub odczytaÄ inny element musimy napisaÄ sterownik samemu. Do tego moĹźemy uĹźyÄ znanego juĹź GPIO lub ADC (Analog-Digital Converter), korzystajÄ c z niskopoziomowego API tych moduĹĂłw. -PodĹÄ czmy nasz fototranzystor podobnie jak diodÄ z lab1, lecz ustawmy GPIO w tryb wejĹcia. Wtedy zmiana stanu fototranzystora pod wpĹywem ĹwiatĹa wznowi lub zatrzyma przepĹyw prÄ du. Jest do jednoznaczne z podĹÄ czeniem naszego pinu GPIO z napiÄciem 3.3V (gdy tranzystor przewodzi - tworzy poĹÄ czenie miÄdzy swoimi pinami), lub odĹÄ czeniem go od tego zasilania (gdy tranzystor nie przewodzi). Innymi sĹowy fototranzystor staje siÄ swego rodzaju przeĹÄ cznikiem. Za pomocÄ API GPIO jesteĹmy w stanie odczytaÄ wartoĹÄ na pinie GPIO w naszej aplikacji jako jedynkÄ lub zero. - -Problem jaki siÄ tu pojawia to jednowÄ tkowoĹÄ naszego mikrokontrolera. Odczyt wartoĹci GPIO jest instrukcjÄ , liniÄ w kodzie, wiÄc jeĹli chcielibyĹmy wykonaÄ jakÄ Ĺ operacjÄ gdy zmieni siÄ wartoĹÄ natÄĹźenia ĹwiatĹa musielibyĹmy czytaÄ tÄ wartoĹÄ w pÄtli i czekaÄ aĹź siÄ zmieni (polling). Pilnowanie tej wartoĹci i robienie innych operacji nie wchodzi wtedy w grÄ. Na pomoc przychodzÄ nam przerwania - moĹźemy ustawiÄ je tak by zmiana wartoĹci na pinie GPIO generowaĹa przerwanie. DziÄki temu nasz program bÄdzie mĂłgĹ siÄ zajÄ Ä innymi operacjami podczas tego oczekiwania. - ## Zadania - - â GPIO (General Purpose Input/Output) czyli wejĹcia/wyjĹcia ogĂłlnego przeznaczenia, sÄ to piny sĹuĹźace do komunikacji pomiÄdzy elementami systemu (np. miÄdzy mikrokontrolerem a urzÄ dzeniami peryferyjnymi). Takie wyprowadzenia mogÄ peĹniÄ rolÄ zarĂłwno wejĹÄ jak i wyjĹÄ, i jest to zazwyczaj wĹaĹciwoĹÄ konfigurowalna. WaĹźnÄ wĹasnoĹciÄ urzÄ dzeĹ korzystajÄ cych z interfejsu GPIO jest moĹźliwoĹÄ zgĹaszania przerwaĹ. -â Do naszego moduĹu nRF52840, a dokĹadniej do pinu P0.20 podĹÄ czony zostaĹ fototranzystor. Fototranzystor to element optoelektroniczny, ktĂłry pod wpĹywem ĹwiatĹa zmienia napiÄcie na swoim wyjĹciu. MoĹźna zastosowaÄ go jako prosty detektor ĹwiatĹa. -â KorzystajÄ c z wiedzy zdobytej w poprzednich Äwiczeniach oraz dokumentacji https://infocenter.nordicsemi.com/topic/sdk_nrf5_v16.0.0/hardware_driver_gpiote.html stwĂłrz prosty czujnik oĹwietlenia. Program powinien dziaĹaÄ w taki sposĂłb, aby po jego uruchomieniu zapaliĹa siÄ dioda, natomiast po zapaleniu ĹwiatĹa (korzystajÄ c z interfejsu webowego) dioda zgasĹa. Zainicjalizuj pin, do ktĂłrego podĹÄ czony jest fototranzystor jako wejĹcie, skonfiguruj w odpowiedni sposĂłb przerwanie oraz napisz funkcjÄ obsĹugujÄ cÄ to przerwanie. Dla parametru konfiguracyjnego `pull` ustaw wartoĹÄ `NRF_GPIO_PIN_PULLUP` (tak jak w sekcji *Initialization* dokumentacji). + GĹĂłwnym celem Äwiczenia jest napisanie prostego czujnika oĹwietlenia ktĂłry zapala diodÄ 1 i 0 gdy ĹwiatĹo jest zgaszone, i gasi diody gdy ĹwiatĹo jest zapalone. + Do naszego moduĹu nRF52840, a dokĹadniej do pinu P0.02 podĹÄ czony zostaĹ fototranzystor. Fototranzystor to element optoelektroniczny, ktĂłry pod wpĹywem ĹwiatĹa zmienia napiÄcie na swoim wyjĹciu. MoĹźna zastosowaÄ go jako prosty detektor ĹwiatĹa. Pin P0.02 jest pinem z analogowym wejĹciem(AIN). We wprowadzeniu do Zad1 jest fragment pinoutu mikrokontrolera - sprawdĹş jaki numer wejĹcia analogowego ma ten pin. + WedĹug dokumentacji uzupeĹnijcie inicjalizacjÄ SAADC tak by odbieraÄ skwantyzowane prĂłbki napiÄcia na pinie P0.02 i wysyĹaÄ tÄ wartoĹÄ na USB. Niech timer odmierza kolejne prĂłbki. MoĹźecie przeksztaĹciÄ tÄ wartoĹÄ na faktyczne napiÄcie w mV mnoĹźÄ c jÄ : value*(3.3 + 0.3) * 1000)/1024) [wyjaĹnienie wzoru w dokumentacji]. SprawdĹşcie jak zmienia siÄ ta wartoĹÄ gdy ĹwiatĹo jest zapalone i zgaszone i na tej podstawie wybierzcie jakÄ Ĺ wartoĹÄ granicznÄ . + +Dokumentacja: +https://infocenter.nordicsemi.com/index.jsp?topic=%2Fsdk_nrf5_v16.0.0%2Fgroup__nrf__drv__saadc.html&anchor=ga4f67c6dad745133956b9ffc9df68d145 +https://infocenter.nordicsemi.com/index.jsp?topic=%2Fsdk_nrf5_v16.0.0%2Fgroup__nrfx__saadc.html&anchor=gab71a209892aedc84800887de200c5857 + + # Lab 4 @@ -353,4 +354,4 @@ PrzykĹadem serwisu jest LED Button Service. Jest to prosty serwis pozwalajÄ cy - \ No newline at end of file + diff --git a/cw3_template/.vscode/settings.json b/cw3_template/.vscode/settings.json index 8c07ffd..76a164f 100644 --- a/cw3_template/.vscode/settings.json +++ b/cw3_template/.vscode/settings.json @@ -7,5 +7,9 @@ "editor.rulers": [90], "nrf52SDKPath": "${workspaceFolder}/../../../", "userName": "root", - "group": "08" + "group": "07", + "files.associations": { + "kimia_usb_log.h": "c", + "nrfx_saadc.h": "c" + } } \ No newline at end of file diff --git a/cw3_template/kimia_usb_log.c b/cw3_template/kimia_usb_log.c new file mode 100644 index 0000000..d96f582 --- /dev/null +++ b/cw3_template/kimia_usb_log.c @@ -0,0 +1,200 @@ +#include "kimia_usb_log.h" + + + +#include "nrf_log.h" +#include "nrf_log_ctrl.h" +#include "nrf_log_default_backends.h" + +#include "app_usbd_core.h" +#include "app_usbd.h" +#include "app_usbd_string_desc.h" +#include "app_usbd_cdc_acm.h" +#include "app_usbd_serial_num.h" + + + + +static void cdc_acm_user_ev_handler(app_usbd_class_inst_t const * p_inst, + app_usbd_cdc_acm_user_event_t event); + + + + + +/** + * @brief CDC_ACM class instance + * */ +APP_USBD_CDC_ACM_GLOBAL_DEF(m_app_cdc_acm, + cdc_acm_user_ev_handler, + CDC_ACM_COMM_INTERFACE, + CDC_ACM_DATA_INTERFACE, + CDC_ACM_COMM_EPIN, + CDC_ACM_DATA_EPIN, + CDC_ACM_DATA_EPOUT, + APP_USBD_CDC_COMM_PROTOCOL_AT_V250 +); + + + +static char m_rx_buffer[READ_SIZE]; +static char m_tx_buffer[WRITE_SIZE];//NRF_DRV_USBD_EPSIZE + +/** + * @brief User event handler @ref app_usbd_cdc_acm_user_ev_handler_t (headphones) + * */ +static void cdc_acm_user_ev_handler(app_usbd_class_inst_t const * p_inst, + app_usbd_cdc_acm_user_event_t event) +{ + app_usbd_cdc_acm_t const * p_cdc_acm = app_usbd_cdc_acm_class_get(p_inst); + + switch (event) + { + case APP_USBD_CDC_ACM_USER_EVT_PORT_OPEN: + { + //bsp_board_led_on(LED_CDC_ACM_OPEN); + + /*Setup first transfer*/ + ret_code_t ret = app_usbd_cdc_acm_read(&m_app_cdc_acm, + m_rx_buffer, + READ_SIZE); + UNUSED_VARIABLE(ret); + break; + } + case APP_USBD_CDC_ACM_USER_EVT_PORT_CLOSE: + //bsp_board_led_off(LED_CDC_ACM_OPEN); + break; + case APP_USBD_CDC_ACM_USER_EVT_TX_DONE: + //bsp_board_led_invert(LED_CDC_ACM_TX); + break; + case APP_USBD_CDC_ACM_USER_EVT_RX_DONE: + { + ret_code_t ret; + NRF_LOG_INFO("Bytes waiting: %d", app_usbd_cdc_acm_bytes_stored(p_cdc_acm)); + + do + { + /*Get amount of data transfered*/ + size_t size = app_usbd_cdc_acm_rx_size(p_cdc_acm); + NRF_LOG_INFO("RX: size: %lu char: %c", size, m_rx_buffer[0]); + KIMIA_USB_PRINT("Input:%c\r\n", m_rx_buffer[0]); + + /* Fetch data until internal buffer is empty */ + ret = app_usbd_cdc_acm_read(&m_app_cdc_acm, + m_rx_buffer, + READ_SIZE); + } while (ret == NRF_SUCCESS); + + +// static char m_tx_buffer[NRF_DRV_USBD_EPSIZE]; +// size_t size = sprintf(m_tx_buffer, "LE KEK"); +// app_usbd_cdc_acm_write(&m_app_cdc_acm, m_tx_buffer, size); + + //bsp_board_led_invert(LED_CDC_ACM_RX); + break; + } + default: + break; + } +} +static void usbd_user_ev_handler(app_usbd_event_type_t event) +{ + switch (event) + { + case APP_USBD_EVT_DRV_SUSPEND: + // bsp_board_led_off(LED_USB_RESUME); + break; + case APP_USBD_EVT_DRV_RESUME: + //bsp_board_led_on(LED_USB_RESUME); + break; + case APP_USBD_EVT_STARTED: + break; + case APP_USBD_EVT_STOPPED: + app_usbd_disable(); + //bsp_board_leds_off(); + break; + case APP_USBD_EVT_POWER_DETECTED: + NRF_LOG_INFO("USB power detected"); + + if (!nrf_drv_usbd_is_enabled()) + { + app_usbd_enable(); + } + break; + case APP_USBD_EVT_POWER_REMOVED: + NRF_LOG_INFO("USB power removed"); + app_usbd_stop(); + break; + case APP_USBD_EVT_POWER_READY: + NRF_LOG_INFO("USB ready"); + app_usbd_start(); + break; + default: + break; + } +} + + + +void kimia_usb_log_init() +{ + ret_code_t ret; + static const app_usbd_config_t usbd_config = { + .ev_state_proc = usbd_user_ev_handler + }; + app_usbd_serial_num_generate(); + + ret = app_usbd_init(&usbd_config); + APP_ERROR_CHECK(ret); + //NRF_LOG_INFO("USBD CDC ACM example started."); + + app_usbd_class_inst_t const * class_cdc_acm = app_usbd_cdc_acm_class_inst_get(&m_app_cdc_acm); + ret = app_usbd_class_append(class_cdc_acm); + APP_ERROR_CHECK(ret); + + + //power nie jest zaimplementowany + +// if (USBD_POWER_DETECTION) +// { +// ret = app_usbd_power_events_enable(); +// APP_ERROR_CHECK(ret); +// } +// else +// { +// NRF_LOG_INFO("No USB power detection enabled\r\nStarting USB now"); +// +// app_usbd_enable(); +// app_usbd_start(); +// } + app_usbd_enable(); + app_usbd_start(); + +} + + +char* kimia_usb_log_get_txbuf() +{ + return m_tx_buffer; +} + +#define EMERGENCY_TXT "kimia_usb_log_write() WARNING: String may be too long\r\n" +void kimia_usb_log_write(char* tx,size_t size) +{ + //size_t size2=strnlen(tx,WRITE_SIZE); + if(size>=WRITE_SIZE-1){ + //tekst wiÄkszy lub rĂłwny buforowi + app_usbd_cdc_acm_write(&m_app_cdc_acm, EMERGENCY_TXT, sizeof(EMERGENCY_TXT)); + }else{ + app_usbd_cdc_acm_write(&m_app_cdc_acm, tx, size); + } + + + +} + + +bool kimia_usb_log_process() +{ + return app_usbd_event_queue_process(); +} diff --git a/cw3_template/kimia_usb_log.h b/cw3_template/kimia_usb_log.h new file mode 100644 index 0000000..c440eb1 --- /dev/null +++ b/cw3_template/kimia_usb_log.h @@ -0,0 +1,77 @@ +#ifndef KIMIA_USB_LOG__H__ +#define KIMIA_USB_LOG__H__ + +#include "stdbool.h" +#include "string.h" + + +#ifndef USBD_POWER_DETECTION +#define USBD_POWER_DETECTION false +#endif + +#define READ_SIZE 1 +#define WRITE_SIZE 1000 + +#define CDC_ACM_COMM_INTERFACE 0 +#define CDC_ACM_COMM_EPIN NRF_DRV_USBD_EPIN2 + +#define CDC_ACM_DATA_INTERFACE 1 +#define CDC_ACM_DATA_EPIN NRF_DRV_USBD_EPIN1 +#define CDC_ACM_DATA_EPOUT NRF_DRV_USBD_EPOUT1 + + + +/** +* To makro dziaĹa dokĹadnie jak printf, tyle Ĺźe printuje na USB +* +*/ +#define KIMIA_USB_PRINT( ...) \ + kimia_usb_log_write(kimia_usb_log_get_txbuf(),snprintf(kimia_usb_log_get_txbuf(),WRITE_SIZE, __VA_ARGS__) ) + + + + +/** +* Inicjalizacja biblioteki +*/ +void kimia_usb_log_init(); + +/** +* Funkcja zajmujÄ ca siÄ obsĹugÄ procesu USB, pownna byÄ dodana w funkcji idle_state_handle by wszystko dziaĹaĹo +* +* @ret false jeĹli nie ma Ĺźadnych eventĂłw +*/ +bool kimia_usb_log_process(); + +/** +* Zwraca statyczny bufor tx ukryty w pliku .c +*/ +char* kimia_usb_log_get_txbuf(); + +/** +* Funkcja pomocnicza dla makra KIMIA_USB_PRINT +* UĹźywanie jej poza makrem bÄdzie raczej uciÄ Ĺźliwe +*/ +void kimia_usb_log_write(char* tx,size_t size); + +/* +$(SDKDIR)/components/libraries/usbd +app_usbd.c +app_usbd_core.c +app_usbd_string_desc.c +app_usbd_serial_num.c + +$(SDKDIR)/components/libraries/usbd/class/cdc/acm +app_usbd_cdc_acm.c + + +$(SDKDIR)/modules/nrfx/drivers/src +nrfx_usbd.c +nrfx_systick.c +nrfx_power.c + +$(SDKDIR)/integration/nrfx/legacy +nrf_drv_power.c +*/ + +#endif \ No newline at end of file diff --git a/cw3_template/main.c b/cw3_template/main.c index 470f0d0..9add474 100644 --- a/cw3_template/main.c +++ b/cw3_template/main.c @@ -48,26 +48,31 @@ #include "nrf_gpio.h" #include "nrf_delay.h" #include "nrf_drv_power.h" +#include "nrfx_saadc.h" #include "app_error.h" #include "boards.h" #include "bsp.h" -#include "usb.h" -#include "app_timer.h" -// NOTE: lab3 -#include "nrf_drv_gpiote.h" +#include "nrf_pwr_mgmt.h" +#include "nrf_drv_saadc.h" + -#define PIN_IN 20 -extern char m_rx_buffer[READ_SIZE]; -extern char m_tx_buffer[NRF_DRV_USBD_EPSIZE]; -extern bool usb_ready; +#include "app_timer.h" +#include "kimia_usb_log.h" -extern app_usbd_cdc_acm_t m_app_cdc_acm; +static void idle_state_handle(void) +{ + if (kimia_usb_log_process() == false) + { + nrf_pwr_mgmt_run(); + } +} + static void init_bsp(void) { ret_code_t ret; @@ -75,38 +80,32 @@ static void init_bsp(void) APP_ERROR_CHECK(ret); } -static void usb_init(app_usbd_config_t usbd_config) + + + + +void saadc_callback(nrf_drv_saadc_evt_t const * p_event) { - ret_code_t ret; - - app_usbd_serial_num_generate(); + //empty callback +} - ret = app_usbd_init(&usbd_config); - APP_ERROR_CHECK(ret); - app_usbd_class_inst_t const * class_cdc_acm = app_usbd_cdc_acm_class_inst_get(&m_app_cdc_acm); - ret = app_usbd_class_append(class_cdc_acm); - APP_ERROR_CHECK(ret); +void saadc_init(void) +{ + ret_code_t err_code; + + err_code = nrf_drv_saadc_init(NULL, saadc_callback); + APP_ERROR_CHECK(err_code); - if (USBD_POWER_DETECTION) - { - ret = app_usbd_power_events_enable(); - APP_ERROR_CHECK(ret); - } - else - { - app_usbd_enable(); - app_usbd_start(); - } } + + int main(void) { ret_code_t ret; - static const app_usbd_config_t usbd_config = { - .ev_state_proc = usbd_user_ev_handler - }; + ret = nrf_drv_clock_init(); APP_ERROR_CHECK(ret); @@ -118,34 +117,16 @@ int main(void) /* Just waiting */ } - ret = app_timer_init(); - APP_ERROR_CHECK(ret); - - usb_init(usbd_config); + kimia_usb_log_init(); init_bsp(); + saadc_init(); + + KIMIA_USB_PRINT("LAB3."); //print do usb zadziaĹa tylko po jakimĹ czasie, uĹźyjcie tej funkcji w timerze - bsp_board_led_on(BSP_BOARD_LED_0); - - bool msg_sent = 0; - while (true) + //Dont change this loop + for (;;) { - - while (app_usbd_event_queue_process()) - { - /* Nothing to do */ - } - - if (usb_ready && !msg_sent) - { - size_t size = sprintf(m_tx_buffer, "Systemy wbudowane i mikrokontrolery!\r\n"); - app_usbd_cdc_acm_write(&m_app_cdc_acm, m_tx_buffer, size); - msg_sent = 1; - } - - /* Sleep CPU only if there was no interrupt since last loop processing */ - __WFE(); + idle_state_handle(); } } - -/** @} */ diff --git a/cw3_template/pca10059/s140/armgcc/Makefile b/cw3_template/pca10059/s140/armgcc/Makefile index 53157c2..ff5018f 100644 --- a/cw3_template/pca10059/s140/armgcc/Makefile +++ b/cw3_template/pca10059/s140/armgcc/Makefile @@ -2,7 +2,7 @@ PROJECT_NAME := usbd_cdc_acm_pca10056 TARGETS := nrf52840_xxaa OUTPUT_DIRECTORY := _build -SDK_ROOT := ../../../../../.. +SDK_ROOT := /home/td/Desktop/KODY/sdk_nor/nRF5SDK160098a08e2 PROJ_DIR := ../../.. $(OUTPUT_DIRECTORY)/nrf52840_xxaa.out: \ @@ -68,12 +68,13 @@ SRC_FILES += \ $(SDK_ROOT)/components/libraries/bsp/bsp.c \ $(SDK_ROOT)/components/libraries/bsp/bsp_cli.c \ $(PROJ_DIR)/main.c \ - $(PROJ_DIR)/usb.c \ $(SDK_ROOT)/external/segger_rtt/SEGGER_RTT.c \ $(SDK_ROOT)/external/segger_rtt/SEGGER_RTT_Syscalls_GCC.c \ $(SDK_ROOT)/external/segger_rtt/SEGGER_RTT_printf.c \ $(SDK_ROOT)/modules/nrfx/mdk/system_nrf52840.c \ $(SDK_ROOT)/external/utf_converter/utf.c \ + $(PROJ_DIR)/kimia_usb_log.c \ + $(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_saadc.c \ # Include folders common to all targets INC_FOLDERS += \ @@ -140,7 +141,7 @@ CFLAGS += -DFLOAT_ABI_HARD CFLAGS += -DNRF52840_XXAA CFLAGS += -mcpu=cortex-m4 CFLAGS += -mthumb -mabi=aapcs -CFLAGS += -Wall -Werror +#CFLAGS += -Wall -Werror CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 # keep every function in a separate section, this allows linker to discard unused ones CFLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing diff --git a/cw3_template/pca10059/s140/armgcc/_build/nrf52840_xxaa.bin b/cw3_template/pca10059/s140/armgcc/_build/nrf52840_xxaa.bin deleted file mode 100755 index 81fb90d32afef69f288bcfac932d887d15a8fe81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48572 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 diff --git a/cw3_template/pca10059/s140/armgcc/_build/nrf52840_xxaa.in b/cw3_template/pca10059/s140/armgcc/_build/nrf52840_xxaa.in deleted file mode 100644 index 913ec2f..0000000 --- a/cw3_template/pca10059/s140/armgcc/_build/nrf52840_xxaa.in +++ /dev/null @@ -1 +0,0 @@ -_build/nrf52840_xxaa/gcc_startup_nrf52840.S.o _build/nrf52840_xxaa/nrf_log_backend_rtt.c.o _build/nrf52840_xxaa/nrf_log_backend_serial.c.o _build/nrf52840_xxaa/nrf_log_backend_uart.c.o _build/nrf52840_xxaa/nrf_log_default_backends.c.o _build/nrf52840_xxaa/nrf_log_frontend.c.o _build/nrf52840_xxaa/nrf_log_str_formatter.c.o _build/nrf52840_xxaa/boards.c.o _build/nrf52840_xxaa/app_button.c.o _build/nrf52840_xxaa/app_error.c.o _build/nrf52840_xxaa/app_error_handler_gcc.c.o _build/nrf52840_xxaa/app_error_weak.c.o _build/nrf52840_xxaa/app_fifo.c.o _build/nrf52840_xxaa/app_scheduler.c.o _build/nrf52840_xxaa/app_timer2.c.o _build/nrf52840_xxaa/app_uart_fifo.c.o _build/nrf52840_xxaa/app_usbd.c.o _build/nrf52840_xxaa/app_usbd_cdc_acm.c.o _build/nrf52840_xxaa/app_usbd_core.c.o _build/nrf52840_xxaa/app_usbd_serial_num.c.o _build/nrf52840_xxaa/app_usbd_string_desc.c.o _build/nrf52840_xxaa/app_util_platform.c.o _build/nrf52840_xxaa/drv_rtc.c.o _build/nrf52840_xxaa/fnmatch.c.o _build/nrf52840_xxaa/hardfault_handler_gcc.c.o _build/nrf52840_xxaa/hardfault_implementation.c.o _build/nrf52840_xxaa/nrf_assert.c.o _build/nrf52840_xxaa/nrf_atfifo.c.o _build/nrf52840_xxaa/nrf_atomic.c.o _build/nrf52840_xxaa/nrf_balloc.c.o _build/nrf52840_xxaa/nrf_cli.c.o _build/nrf52840_xxaa/nrf_cli_uart.c.o _build/nrf52840_xxaa/nrf_fprintf.c.o _build/nrf52840_xxaa/nrf_fprintf_format.c.o _build/nrf52840_xxaa/nrf_memobj.c.o _build/nrf52840_xxaa/nrf_pwr_mgmt.c.o _build/nrf52840_xxaa/nrf_queue.c.o _build/nrf52840_xxaa/nrf_ringbuf.c.o _build/nrf52840_xxaa/nrf_section_iter.c.o _build/nrf52840_xxaa/nrf_sortlist.c.o _build/nrf52840_xxaa/nrf_strerror.c.o _build/nrf52840_xxaa/nrf_drv_clock.c.o _build/nrf52840_xxaa/nrf_drv_power.c.o _build/nrf52840_xxaa/nrf_drv_uart.c.o _build/nrf52840_xxaa/nrf_nvic.c.o _build/nrf52840_xxaa/nrf_soc.c.o _build/nrf52840_xxaa/nrfx_atomic.c.o _build/nrf52840_xxaa/nrfx_clock.c.o _build/nrf52840_xxaa/nrfx_gpiote.c.o _build/nrf52840_xxaa/nrfx_power.c.o _build/nrf52840_xxaa/nrfx_prs.c.o _build/nrf52840_xxaa/nrfx_systick.c.o _build/nrf52840_xxaa/nrfx_uart.c.o _build/nrf52840_xxaa/nrfx_uarte.c.o _build/nrf52840_xxaa/nrfx_usbd.c.o _build/nrf52840_xxaa/bsp.c.o _build/nrf52840_xxaa/bsp_cli.c.o _build/nrf52840_xxaa/main.c.o _build/nrf52840_xxaa/usb.c.o _build/nrf52840_xxaa/SEGGER_RTT.c.o _build/nrf52840_xxaa/SEGGER_RTT_Syscalls_GCC.c.o _build/nrf52840_xxaa/SEGGER_RTT_printf.c.o _build/nrf52840_xxaa/system_nrf52840.c.o _build/nrf52840_xxaa/utf.c.o -lc -lnosys -lm diff --git a/cw3_template/pca10059/s140/config/sdk_config.h b/cw3_template/pca10059/s140/config/sdk_config.h index d6b19ce..2c93a14 100644 --- a/cw3_template/pca10059/s140/config/sdk_config.h +++ b/cw3_template/pca10059/s140/config/sdk_config.h @@ -48,6 +48,173 @@ #endif // <h> nRF_Drivers +// <e> NRFX_SAADC_ENABLED - nrfx_saadc - SAADC peripheral driver +//========================================================== +#ifndef NRFX_SAADC_ENABLED +#define NRFX_SAADC_ENABLED 1 +#endif +// <o> NRFX_SAADC_CONFIG_RESOLUTION - Resolution + +// <0=> 8 bit +// <1=> 10 bit +// <2=> 12 bit +// <3=> 14 bit + +#ifndef NRFX_SAADC_CONFIG_RESOLUTION +#define NRFX_SAADC_CONFIG_RESOLUTION 1 +#endif + +// <o> NRFX_SAADC_CONFIG_OVERSAMPLE - Sample period + +// <0=> Disabled +// <1=> 2x +// <2=> 4x +// <3=> 8x +// <4=> 16x +// <5=> 32x +// <6=> 64x +// <7=> 128x +// <8=> 256x + +#ifndef NRFX_SAADC_CONFIG_OVERSAMPLE +#define NRFX_SAADC_CONFIG_OVERSAMPLE 0 +#endif + +// <q> NRFX_SAADC_CONFIG_LP_MODE - Enabling low power mode + + +#ifndef NRFX_SAADC_CONFIG_LP_MODE +#define NRFX_SAADC_CONFIG_LP_MODE 0 +#endif + +// <o> NRFX_SAADC_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_SAADC_CONFIG_IRQ_PRIORITY +#define NRFX_SAADC_CONFIG_IRQ_PRIORITY 6 +#endif + +// <e> NRFX_SAADC_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_SAADC_CONFIG_LOG_ENABLED +#define NRFX_SAADC_CONFIG_LOG_ENABLED 0 +#endif +// <o> NRFX_SAADC_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_SAADC_CONFIG_LOG_LEVEL +#define NRFX_SAADC_CONFIG_LOG_LEVEL 3 +#endif + +// <o> NRFX_SAADC_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SAADC_CONFIG_INFO_COLOR +#define NRFX_SAADC_CONFIG_INFO_COLOR 0 +#endif + +// <o> NRFX_SAADC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SAADC_CONFIG_DEBUG_COLOR +#define NRFX_SAADC_CONFIG_DEBUG_COLOR 0 +#endif + +// </e> + +// </e> + + +// <e> SAADC_ENABLED - nrf_drv_saadc - SAADC peripheral driver - legacy layer +//========================================================== +#ifndef SAADC_ENABLED +#define SAADC_ENABLED 1 +#endif +// <o> SAADC_CONFIG_RESOLUTION - Resolution + +// <0=> 8 bit +// <1=> 10 bit +// <2=> 12 bit +// <3=> 14 bit + +#ifndef SAADC_CONFIG_RESOLUTION +#define SAADC_CONFIG_RESOLUTION 1 +#endif + +// <o> SAADC_CONFIG_OVERSAMPLE - Sample period + +// <0=> Disabled +// <1=> 2x +// <2=> 4x +// <3=> 8x +// <4=> 16x +// <5=> 32x +// <6=> 64x +// <7=> 128x +// <8=> 256x + +#ifndef SAADC_CONFIG_OVERSAMPLE +#define SAADC_CONFIG_OVERSAMPLE 0 +#endif + +// <q> SAADC_CONFIG_LP_MODE - Enabling low power mode + + +#ifndef SAADC_CONFIG_LP_MODE +#define SAADC_CONFIG_LP_MODE 0 +#endif + +// <o> SAADC_CONFIG_IRQ_PRIORITY - Interrupt priority + + +// <i> Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef SAADC_CONFIG_IRQ_PRIORITY +#define SAADC_CONFIG_IRQ_PRIORITY 6 +#endif + +// </e> + + //========================================================== // <e> GPIOTE_ENABLED - nrf_drv_gpiote - GPIOTE peripheral driver - legacy layer //========================================================== @@ -1760,7 +1927,7 @@ // <e> NRF_LOG_BACKEND_RTT_ENABLED - nrf_log_backend_rtt - Log RTT backend //========================================================== #ifndef NRF_LOG_BACKEND_RTT_ENABLED -#define NRF_LOG_BACKEND_RTT_ENABLED 0 +#define NRF_LOG_BACKEND_RTT_ENABLED 1 #endif // <o> NRF_LOG_BACKEND_RTT_TEMP_BUFFER_SIZE - Size of buffer for partially processed strings. // <i> Size of the buffer is a trade-off between RAM usage and processing. diff --git a/cw3_template/temperature.c b/cw3_template/temperature.c deleted file mode 100644 index 1d29a23..0000000 --- a/cw3_template/temperature.c +++ /dev/null @@ -1,25 +0,0 @@ -#include "temperature.h" - -int32_t get_temperature(void) -{ - // This function contains workaround for PAN_028 rev2.0A anomalies 28, 29,30 and 31. - int32_t volatile temp; - - NRF_TEMP->TASKS_START = 1; /** Start the temperature measurement. */ - - /* Busy wait while temperature measurement is not finished, you can skip waiting if you enable interrupt for DATARDY event and read the result in the interrupt. */ - /*lint -e{845} // A zero has been given as right argument to operator '|'" */ - while (NRF_TEMP->EVENTS_DATARDY == 0) - { - // Do nothing. - } - NRF_TEMP->EVENTS_DATARDY = 0; - - /**@note Workaround for PAN_028 rev2.0A anomaly 29 - TEMP: Stop task clears the TEMP register. */ - temp = (nrf_temp_read() / 4); - - /**@note Workaround for PAN_028 rev2.0A anomaly 30 - TEMP: Temp module analog front end does not power down when DATARDY event occurs. */ - NRF_TEMP->TASKS_STOP = 1; /** Stop the temperature measurement. */ - - return temp; -} \ No newline at end of file diff --git a/cw3_template/temperature.h b/cw3_template/temperature.h deleted file mode 100644 index 20896e0..0000000 --- a/cw3_template/temperature.h +++ /dev/null @@ -1,4 +0,0 @@ -#include <stdint.h> -#include "nrf_temp.h" - -int32_t get_temperature(void); \ No newline at end of file diff --git a/cw3_template/usb.c b/cw3_template/usb.c deleted file mode 100644 index c9d64c4..0000000 --- a/cw3_template/usb.c +++ /dev/null @@ -1,119 +0,0 @@ -#include "usb.h" -#include "app_timer.h" - -char m_rx_buffer[READ_SIZE]; -char m_tx_buffer[NRF_DRV_USBD_EPSIZE]; -volatile bool usb_ready = 0; - -APP_TIMER_DEF(m_usb_timer); - -/** - * @brief CDC_ACM class instance - * */ -APP_USBD_CDC_ACM_GLOBAL_DEF(m_app_cdc_acm, - cdc_acm_user_ev_handler, - CDC_ACM_COMM_INTERFACE, - CDC_ACM_DATA_INTERFACE, - CDC_ACM_COMM_EPIN, - CDC_ACM_DATA_EPIN, - CDC_ACM_DATA_EPOUT, - APP_USBD_CDC_COMM_PROTOCOL_AT_V250 -); - -static void usb_timer_handler(void* p_context) -{ - usb_ready = 1; -} - - -/** - * @brief User event handler @ref app_usbd_cdc_acm_user_ev_handler_t (headphones) - * */ -void cdc_acm_user_ev_handler(app_usbd_class_inst_t const * p_inst, - app_usbd_cdc_acm_user_event_t event) -{ - app_usbd_cdc_acm_t const * p_cdc_acm = app_usbd_cdc_acm_class_get(p_inst); - - switch (event) - { - case APP_USBD_CDC_ACM_USER_EVT_PORT_OPEN: - { - //bsp_board_led_on(LED_CDC_ACM_OPEN); - - /*Setup first transfer*/ - ret_code_t ret = app_usbd_cdc_acm_read(&m_app_cdc_acm, - m_rx_buffer, - READ_SIZE); - UNUSED_VARIABLE(ret); - ret = app_timer_create(&m_usb_timer, APP_TIMER_MODE_SINGLE_SHOT, usb_timer_handler); - APP_ERROR_CHECK(ret); - ret = app_timer_start(m_usb_timer, APP_TIMER_TICKS(50), 0); - APP_ERROR_CHECK(ret); - break; - } - case APP_USBD_CDC_ACM_USER_EVT_PORT_CLOSE: - //bsp_board_led_off(LED_CDC_ACM_OPEN); - break; - case APP_USBD_CDC_ACM_USER_EVT_TX_DONE: - //bsp_board_led_invert(LED_CDC_ACM_TX); - break; - case APP_USBD_CDC_ACM_USER_EVT_RX_DONE: - { - ret_code_t ret; - //NRF_LOG_INFO("Bytes waiting: %d", app_usbd_cdc_acm_bytes_stored(p_cdc_acm)); - do - { - /*Get amount of data transfered*/ - app_usbd_cdc_acm_rx_size(p_cdc_acm); - //NRF_LOG_INFO("RX: size: %lu char: %c", size, m_rx_buffer[0]); - - /* Fetch data until internal buffer is empty */ - ret = app_usbd_cdc_acm_read(&m_app_cdc_acm, - m_rx_buffer, - READ_SIZE); - } while (ret == NRF_SUCCESS); - - //bsp_board_led_invert(LED_CDC_ACM_RX); - break; - } - default: - break; - } -} - -void usbd_user_ev_handler(app_usbd_event_type_t event) -{ - switch (event) - { - case APP_USBD_EVT_DRV_SUSPEND: - //bsp_board_led_off(LED_USB_RESUME); - break; - case APP_USBD_EVT_DRV_RESUME: - //bsp_board_led_on(LED_USB_RESUME); - break; - case APP_USBD_EVT_STARTED: - break; - case APP_USBD_EVT_STOPPED: - app_usbd_disable(); - //bsp_board_leds_off(); - break; - case APP_USBD_EVT_POWER_DETECTED: - // NRF_LOG_INFO("USB power detected"); - - if (!nrf_drv_usbd_is_enabled()) - { - app_usbd_enable(); - } - break; - case APP_USBD_EVT_POWER_REMOVED: - //NRF_LOG_INFO("USB power removed"); - app_usbd_stop(); - break; - case APP_USBD_EVT_POWER_READY: - //NRF_LOG_INFO("USB ready"); - app_usbd_start(); - break; - default: - break; - } -} \ No newline at end of file diff --git a/cw3_template/usb.h b/cw3_template/usb.h deleted file mode 100644 index 091f472..0000000 --- a/cw3_template/usb.h +++ /dev/null @@ -1,48 +0,0 @@ -#include "app_util.h" -#include "app_usbd_core.h" -#include "app_usbd.h" -#include "app_usbd_string_desc.h" -#include "app_usbd_cdc_acm.h" -#include "app_usbd_serial_num.h" -#include "nrf_delay.h" - - -/** - * @brief Enable power USB detection - * - * Configure if example supports USB port connection - */ -#ifndef USBD_POWER_DETECTION -#define USBD_POWER_DETECTION true -#endif - -#define READ_SIZE 1 - - - - -void cdc_acm_user_ev_handler(app_usbd_class_inst_t const * p_inst, - app_usbd_cdc_acm_user_event_t event); - -void usbd_user_ev_handler(app_usbd_event_type_t event); - -#define CDC_ACM_COMM_INTERFACE 0 -#define CDC_ACM_COMM_EPIN NRF_DRV_USBD_EPIN2 - -#define CDC_ACM_DATA_INTERFACE 1 -#define CDC_ACM_DATA_EPIN NRF_DRV_USBD_EPIN1 -#define CDC_ACM_DATA_EPOUT NRF_DRV_USBD_EPOUT1 - - -///** -// * @brief CDC_ACM class instance -// * */ -//APP_USBD_CDC_ACM_GLOBAL_DEF(m_app_cdc_acm, -// cdc_acm_user_ev_handler, -// CDC_ACM_COMM_INTERFACE, -// CDC_ACM_DATA_INTERFACE, -// CDC_ACM_COMM_EPIN, -// CDC_ACM_DATA_EPIN, -// CDC_ACM_DATA_EPOUT, -// APP_USBD_CDC_COMM_PROTOCOL_AT_V250 -//); \ No newline at end of file -- GitLab