From c6e7cf9645b802f8f496f7774f879c8b0b38fc6a Mon Sep 17 00:00:00 2001 From: Miguel Iglesias Date: Sun, 13 Oct 2024 18:06:15 +0200 Subject: [PATCH] first working prototye of the frequency counter; can count up to 2.69MHy --- .vscode/launch.json | 7 ++ CMakeLists.txt | 3 +- boards/arm/e73_tmb/Kconfig.board | 6 -- boards/arm/e73_tmb/Kconfig.defconfig | 13 --- boards/arm/e73_tmb/board.cmake | 9 -- boards/arm/e73_tmb/e73_tmb.dts | 88 ----------------- boards/arm/e73_tmb/e73_tmb_defconfig | 16 ---- main.c | 135 ++++++++++++++------------- prj.conf | 12 ++- 9 files changed, 85 insertions(+), 204 deletions(-) delete mode 100644 boards/arm/e73_tmb/Kconfig.board delete mode 100644 boards/arm/e73_tmb/Kconfig.defconfig delete mode 100644 boards/arm/e73_tmb/board.cmake delete mode 100644 boards/arm/e73_tmb/e73_tmb.dts delete mode 100644 boards/arm/e73_tmb/e73_tmb_defconfig diff --git a/.vscode/launch.json b/.vscode/launch.json index d62df2f..a2c217c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,6 +7,13 @@ "name": "Launch build_1", "config": "${workspaceFolder}/build_1", "runToEntryPoint": "main" + }, + { + "type": "nrf-connect", + "request": "launch", + "name": "Launch SensorSoftwareTest/build", + "config": "${workspaceFolder}/build", + "runToEntryPoint": "main" } ] } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index c465196..d7c4491 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,4 +20,5 @@ common target_sources(app PRIVATE main.c) # Set the build type to Debug -set(CMAKE_BUILD_TYPE Debug) \ No newline at end of file +set(CMAKE_BUILD_TYPE Debug) +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=output.map") \ No newline at end of file diff --git a/boards/arm/e73_tmb/Kconfig.board b/boards/arm/e73_tmb/Kconfig.board deleted file mode 100644 index 2d259de..0000000 --- a/boards/arm/e73_tmb/Kconfig.board +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2024 Nordic Semiconductor ASA -# SPDX-License-Identifier: Apache-2.0 - -config BOARD_E73_TMB - bool "e73-tmb" - depends on SOC_NRF52810_QFAA diff --git a/boards/arm/e73_tmb/Kconfig.defconfig b/boards/arm/e73_tmb/Kconfig.defconfig deleted file mode 100644 index 5e137fd..0000000 --- a/boards/arm/e73_tmb/Kconfig.defconfig +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2024 Nordic Semiconductor ASA -# SPDX-License-Identifier: Apache-2.0 - -if BOARD_E73_TMB - -config BOARD - default "e73_tmb" - -config BT_CTLR - default BT - - -endif diff --git a/boards/arm/e73_tmb/board.cmake b/boards/arm/e73_tmb/board.cmake deleted file mode 100644 index 5a2af1b..0000000 --- a/boards/arm/e73_tmb/board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2024 Nordic Semiconductor ASA -# SPDX-License-Identifier: Apache-2.0 - -board_runner_args(jlink "--device=nrf52810_xxaa" "--speed=4000") -board_runner_args(pyocd "--target=nrf52810" "--frequency=4000000") - -include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) -include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) -include(${ZEPHYR_BASE}/boards/common/pyocd.board.cmake) diff --git a/boards/arm/e73_tmb/e73_tmb.dts b/boards/arm/e73_tmb/e73_tmb.dts deleted file mode 100644 index 6f2c939..0000000 --- a/boards/arm/e73_tmb/e73_tmb.dts +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) 2024 Nordic Semiconductor ASA -// SPDX-License-Identifier: Apache-2.0 - -/dts-v1/; -#include - -/ { - model = "e73-tmb"; - compatible = "mi,e73-tmb"; - - chosen { - zephyr,console = &uart0; - zephyr,shell-uart = &uart0; - zephyr,uart-mcumgr = &uart0; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,code-partition = &slot0_partition; - }; - aliases { - led0 = &myled0; - led1 = &myled1; - }; - - leds { - compatible = "gpio-leds"; - myled0: led_0 { - gpios = <&gpio0 17 GPIO_ACTIVE_LOW>; - }; - - myled1: led_1 { - gpios = <&gpio0 18 GPIO_ACTIVE_HIGH>; - label = "LED"; - }; - }; -}; - -&gpio0 { - status = "okay"; -}; - -&gpiote { - status = "okay"; -}; - -&flash0 { - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - boot_partition: partition@0 { - label = "mcuboot"; - reg = <0x0 0xc000>; - }; - slot0_partition: partition@c000 { - label = "image-0"; - reg = <0xc000 0xa000>; - }; - slot1_partition: partition@16000 { - label = "image-1"; - reg = <0x16000 0xa000>; - }; - scratch_partition: partition@20000 { - label = "image-scratch"; - reg = <0x20000 0xa000>; - }; - storage_partition: partition@2a000 { - label = "storage"; - reg = <0x2a000 0x6000>; - }; - }; -}; - -&uart0 { - status = "okay"; - compatible="nordic,nrf-uart"; - pinctrl-0 = <&uart0_default>; - pinctrl-names = "default"; - current-speed = <115200>; -}; - -&pinctrl { - uart0_default: uart0_default { - group1 { - psels = , ; - }; - }; -}; diff --git a/boards/arm/e73_tmb/e73_tmb_defconfig b/boards/arm/e73_tmb/e73_tmb_defconfig deleted file mode 100644 index 24a5a92..0000000 --- a/boards/arm/e73_tmb/e73_tmb_defconfig +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) 2024 Nordic Semiconductor ASA -# SPDX-License-Identifier: Apache-2.0 - -CONFIG_SOC_SERIES_NRF52X=y -CONFIG_SOC_NRF52810_QFAA=y -CONFIG_BOARD_E73_TMB=y - -# Enable MPU -CONFIG_ARM_MPU=y - -# Enable hardware stack protection -CONFIG_HW_STACK_PROTECTION=y - -# Enable debug -CONFIG_CORTEX_M_DEBUG_MONITOR_HOOK=y -CONFIG_SEGGER_DEBUGMON=y diff --git a/main.c b/main.c index 8f6df32..9b3395e 100644 --- a/main.c +++ b/main.c @@ -1,54 +1,41 @@ +#include +#include + #include #include -#include +#include +#include #include #include -#define TST_CLK_PIN 17 //this is led 0 pin on nrf52-dk -#define FREQ_MEASURE_PIN 11 +/* The devicetree node identifier for the "led0" alias. */ -const struct device *uart0 = DEVICE_DT_GET(DT_NODELABEL(uart0)); +#define TST_CLK_PIN 18 //this is led 0 pin on nrf52-dk +#define FREQ_MEASURE_PIN 18 +static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(DT_ALIAS(led0), gpios); +static const struct gpio_dt_spec led1 = GPIO_DT_SPEC_GET(DT_ALIAS(led1), gpios); -struct uart_config uart_cfg = { - .baudrate = 9600, - .parity = UART_CFG_PARITY_NONE, - .stop_bits = UART_CFG_STOP_BITS_1, - .flow_ctrl = UART_CFG_FLOW_CTRL_NONE, - .data_bits = UART_CFG_DATA_BITS_8, -}; +int count = 0; -void send_str(const struct device *uart, char *str) -{ - int msg_len = strlen(str); - - for (int i = 0; i < msg_len; i++) { - uart_poll_out(uart, str[i]); - } - - printk("Device %s sent: \"%s\"\n", uart->name, str); +void configure_clock_pin(uint32_t pin_number){ + nrf_gpio_cfg( + pin_number, + NRF_GPIO_PIN_DIR_OUTPUT, + NRF_GPIO_PIN_INPUT_CONNECT, + NRF_GPIO_PIN_NOPULL, + NRF_GPIO_PIN_S0S1, + NRF_GPIO_PIN_NOSENSE); + *(volatile uint32_t *)(NRF_GPIOTE_BASE + 0x600 + (4 * pin_number)) = 1; } -void recv_str(const struct device *uart, char *str) -{ - char *head = str; - char c; - while (!uart_poll_in(uart, &c)) { - *head++ = c; - } - *head = '\0'; - - printk("Device %s received: \"%s\"\n", uart->name, str); -} - -void gpio_clock_8m(uint32_t pin_number) -{ +void gpio_clock_8m(uint32_t pin_number) { NRF_TIMER0->PRESCALER = 0; // 16MHz NRF_TIMER0->SHORTS = TIMER_SHORTS_COMPARE0_CLEAR_Msk; - NRF_TIMER0->CC[0] = 3; //1 for 16/2=8MHz for, 2 for 8/2=4MHz, 4 for 4/2=2MHz etc.. + NRF_TIMER0->CC[0] = 0x3; //~1KHz //1 for 16/2=8MHz for, 2 for 8/2=4MHz, 4 for 4/2=2MHz etc.. NRF_TIMER0->BITMODE = (TIMER_BITMODE_BITMODE_16Bit << TIMER_BITMODE_BITMODE_Pos); //using config [1] since [0] NRF_GPIOTE->CONFIG[1] = GPIOTE_CONFIG_MODE_Task | (pin_number << GPIOTE_CONFIG_PSEL_Pos) | @@ -68,12 +55,12 @@ static void timer_init() //gate timer { NRF_TIMER1->TASKS_STOP = 1; //trigger stop NRF_TIMER1->MODE = TIMER_MODE_MODE_Timer; //mode timer - NRF_TIMER1->PRESCALER = 8; // Fhck / 2^8 - //total gate time of timer 62500 - 1s - NRF_TIMER1->CC[0] = 62501; //end gate count + NRF_TIMER1->PRESCALER = 4; // Fhck / 2^8 -1MHz + //total gate time of timer 10000 - 100mS + NRF_TIMER1->CC[0] = 50000; //end gate count NRF_TIMER1->CC[1] = 1; //start gate count. don't start at 0 to no start on clear. - NRF_TIMER1->BITMODE = (TIMER_BITMODE_BITMODE_16Bit << TIMER_BITMODE_BITMODE_Pos); + NRF_TIMER1->BITMODE = (TIMER_BITMODE_BITMODE_32Bit << TIMER_BITMODE_BITMODE_Pos); NRF_TIMER1->TASKS_CLEAR = 1; //trigger zero timer NRF_TIMER1->INTENSET = (TIMER_INTENSET_COMPARE0_Enabled << TIMER_INTENSET_COMPARE0_Pos); //interrupt on end gate count @@ -132,57 +119,73 @@ void TIMER1_IRQHandler(void) { if (NRF_TIMER1->EVENTS_COMPARE[0] != 0) //end gate event { + gpio_pin_toggle_dt(&led); NRF_TIMER1->EVENTS_COMPARE[0] = 0; //reset end gate flag NRF_TIMER1->EVENTS_COMPARE[1] = 0; //reset start gate flag NRF_TIMER2->TASKS_CAPTURE[0] = 1; //trigger get counter value - - printk("cc: %dHz\n", NRF_TIMER2->CC[0]); //report to serial console + count = NRF_TIMER2->CC[0]; NRF_TIMER1->TASKS_CLEAR = 1; //reset timer NRF_TIMER2->TASKS_CLEAR = 1; //reset counter + //NRF_TIMER1->TASKS_STOP = 1; //stop NRF_TIMER1->TASKS_START = 1; //start next count gate } } + int main(void) { - char send_buf[64]; - - printk("Hellowold 1!"); - /*rc = uart_configure(uart0, &uart_cfg); - if (rc) { - printk("Could not configure device %s", uart0->name); - }*/ - - snprintf(send_buf, 64, "Helloworld 2"); - send_str(uart0, send_buf); - - - NVIC_EnableIRQ(TIMER1_IRQn); //enable timer1 interrupt - IRQ_DIRECT_CONNECT(TIMER1_IRQn, 3, TIMER1_IRQHandler, 0); //link interrupt flag to handler - NVIC_SetPriority(TIMER1_IRQn, 3); //set interrupt execution priority - - struct device *dev;//port container for gpio management - dev = device_get_binding("GPIO_14"); //button SW1 - /**/ - //nrf_gpio_cfg(dev, FREQ_MEASURE_PIN, NRF_GPIO_DIR_INPUT|GPIO_ACTIVE_HIGH|GPIO_PULL_DOWN); //p0.11 freq in + printf("Helloworld! \n"); nrf_gpio_cfg_input(14, NRF_GPIO_PIN_PULLUP); + nrf_gpio_cfg_input(13, NRF_GPIO_PIN_PULLUP); + + + int ret; + if (!gpio_is_ready_dt(&led)) { + return 0; + } + ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE); + + ret = gpio_pin_toggle_dt(&led); + k_msleep(100); + ret = gpio_pin_toggle_dt(&led); + k_msleep(100); + ret = gpio_pin_toggle_dt(&led); + + + + + NVIC_ClearPendingIRQ(TIMER1_IRQn); + NVIC_EnableIRQ(TIMER1_IRQn); //enable timer1 interrupt + IRQ_CONNECT(TIMER1_IRQn, 5, TIMER1_IRQHandler, 0, 0); //link interrupt flag to handler + + configure_clock_pin(FREQ_MEASURE_PIN); - //init freq count hardware counter_init(); timer_init(); - gpiote_init(FREQ_MEASURE_PIN); + gpiote_init(FREQ_MEASURE_PIN); // buttom in SW2 ppi_gpiote_counter_init(); ppi_timer_stop_counter_init(); ppi_timer_start_counter_init(); //test clock hardware - gpio_clock_8m(TST_CLK_PIN); + + gpio_clock_8m(FREQ_MEASURE_PIN); //start freq count task NRF_TIMER1->TASKS_START = 1; + gpio_pin_set_dt(&led, 1); + + + + int old_count = 0; while (1) { - //manage loop + k_msleep(100); + + if(old_count != count){ + printf("cc: %dHz\n", count); //report to serial console + old_count = count; + } } -} +} \ No newline at end of file diff --git a/prj.conf b/prj.conf index c6bac66..1fd9c06 100644 --- a/prj.conf +++ b/prj.conf @@ -1,6 +1,8 @@ -CONFIG_NRFX_TIMER0=y -CONFIG_NRFX_TIMER1=y +#CONFIG_UART_USE_RUNTIME_CONFIGURE=n +#CONFIG_UART_INTERRUPT_DRIVEN=y -CONFIG_SERIAL=y -CONFIG_UART_USE_RUNTIME_CONFIGURE=y -CONFIG_UART_INTERRUPT_DRIVEN=y \ No newline at end of file +CONFIG_GPIO=y + + +CONFIG_REBOOT=n +CONFIG_RESET_ON_FATAL_ERROR=n \ No newline at end of file