From f4051812199fce25f1739da38f6754c38cbdaae6 Mon Sep 17 00:00:00 2001 From: Elex Date: Tue, 19 Apr 2022 19:58:41 +0900 Subject: [PATCH] 2022-04-19T19:58:40 --- 01_blink/.vscode/c_cpp_properties.json | 2 +- 01_blink/src/blink.c | 2 +- 02_hello_serial/.vscode/c_cpp_properties.json | 2 +- 02_hello_serial/src/hello.c | 9 ++- 03_data_types/.vscode/c_cpp_properties.json | 2 +- 04_watchdog/.gitignore | 1 + 04_watchdog/.vscode/c_cpp_properties.json | 18 ++++++ 04_watchdog/CMakeLists.txt | 22 +++++++ 04_watchdog/pico_sdk_import.cmake | 62 +++++++++++++++++++ 04_watchdog/run | 43 +++++++++++++ 04_watchdog/src/watchdog.c | 50 +++++++++++++++ 05_time/.gitignore | 1 + 05_time/.vscode/c_cpp_properties.json | 18 ++++++ 05_time/.vscode/settings.json | 5 ++ 05_time/CMakeLists.txt | 22 +++++++ 05_time/README.md | 54 ++++++++++++++++ 05_time/pico_sdk_import.cmake | 62 +++++++++++++++++++ 05_time/run | 43 +++++++++++++ 05_time/src/time.c | 30 +++++++++ 06_timer/.gitignore | 1 + 06_timer/.vscode/c_cpp_properties.json | 18 ++++++ 06_timer/.vscode/settings.json | 5 ++ 06_timer/CMakeLists.txt | 22 +++++++ 06_timer/pico_sdk_import.cmake | 62 +++++++++++++++++++ 06_timer/run | 43 +++++++++++++ 06_timer/src/timer.c | 40 ++++++++++++ 26 files changed, 632 insertions(+), 7 deletions(-) create mode 100644 04_watchdog/.gitignore create mode 100644 04_watchdog/.vscode/c_cpp_properties.json create mode 100644 04_watchdog/CMakeLists.txt create mode 100644 04_watchdog/pico_sdk_import.cmake create mode 100755 04_watchdog/run create mode 100644 04_watchdog/src/watchdog.c create mode 100644 05_time/.gitignore create mode 100644 05_time/.vscode/c_cpp_properties.json create mode 100644 05_time/.vscode/settings.json create mode 100644 05_time/CMakeLists.txt create mode 100644 05_time/README.md create mode 100644 05_time/pico_sdk_import.cmake create mode 100755 05_time/run create mode 100644 05_time/src/time.c create mode 100644 06_timer/.gitignore create mode 100644 06_timer/.vscode/c_cpp_properties.json create mode 100644 06_timer/.vscode/settings.json create mode 100644 06_timer/CMakeLists.txt create mode 100644 06_timer/pico_sdk_import.cmake create mode 100755 06_timer/run create mode 100644 06_timer/src/timer.c diff --git a/01_blink/.vscode/c_cpp_properties.json b/01_blink/.vscode/c_cpp_properties.json index ede8e1a..a1e1ced 100644 --- a/01_blink/.vscode/c_cpp_properties.json +++ b/01_blink/.vscode/c_cpp_properties.json @@ -4,7 +4,7 @@ "name": "Linux GCC ARM", "includePath": [ "${workspaceFolder}/**", - "${workspaceFolder}/../../../pico-sdk/src/**" + "${env:PICO_SDK_PATH}/src/**" ], "defines": [], "compilerPath": "/usr/bin/gcc", diff --git a/01_blink/src/blink.c b/01_blink/src/blink.c index b7d1563..1a9f6fc 100644 --- a/01_blink/src/blink.c +++ b/01_blink/src/blink.c @@ -22,4 +22,4 @@ int main() gpio_put(LED_PIN, false); sleep_ms(250); } -} \ No newline at end of file +} diff --git a/02_hello_serial/.vscode/c_cpp_properties.json b/02_hello_serial/.vscode/c_cpp_properties.json index f59e754..a2817df 100644 --- a/02_hello_serial/.vscode/c_cpp_properties.json +++ b/02_hello_serial/.vscode/c_cpp_properties.json @@ -4,7 +4,7 @@ "name": "Linux GCC ARM", "includePath": [ "${workspaceFolder}/**", - "${workspaceFolder}/../../../pico-sdk/src/**" + "${env:PICO_SDK_PATH}/src/**" ], "defines": [], "compilerPath": "/usr/bin/gcc", diff --git a/02_hello_serial/src/hello.c b/02_hello_serial/src/hello.c index 5c8e4c4..65002a4 100644 --- a/02_hello_serial/src/hello.c +++ b/02_hello_serial/src/hello.c @@ -1,9 +1,10 @@ #include +#include #include "pico/stdlib.h" #include "hardware/gpio.h" #include "pico/binary_info.h" -const uint LED_PIN = 25; +const uint LED_PIN = PICO_DEFAULT_LED_PIN; int main() { @@ -15,12 +16,14 @@ int main() gpio_init(LED_PIN); gpio_set_dir(LED_PIN, GPIO_OUT); + char *str = "Hello World!"; + while (true) { gpio_put(LED_PIN, false); sleep_ms(250); gpio_put(LED_PIN, true); - puts("Hello World~~!"); + puts(str); sleep_ms(1000); } -} \ No newline at end of file +} diff --git a/03_data_types/.vscode/c_cpp_properties.json b/03_data_types/.vscode/c_cpp_properties.json index f59e754..a2817df 100644 --- a/03_data_types/.vscode/c_cpp_properties.json +++ b/03_data_types/.vscode/c_cpp_properties.json @@ -4,7 +4,7 @@ "name": "Linux GCC ARM", "includePath": [ "${workspaceFolder}/**", - "${workspaceFolder}/../../../pico-sdk/src/**" + "${env:PICO_SDK_PATH}/src/**" ], "defines": [], "compilerPath": "/usr/bin/gcc", diff --git a/04_watchdog/.gitignore b/04_watchdog/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/04_watchdog/.gitignore @@ -0,0 +1 @@ +/build diff --git a/04_watchdog/.vscode/c_cpp_properties.json b/04_watchdog/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..a2817df --- /dev/null +++ b/04_watchdog/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "Linux GCC ARM", + "includePath": [ + "${workspaceFolder}/**", + "${env:PICO_SDK_PATH}/src/**" + ], + "defines": [], + "compilerPath": "/usr/bin/gcc", + "cStandard": "c11", + "cppStandard": "c++17", + "intelliSenseMode": "linux-gcc-arm", + "configurationProvider": "ms-vscode.cmake-tools" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/04_watchdog/CMakeLists.txt b/04_watchdog/CMakeLists.txt new file mode 100644 index 0000000..a0e1708 --- /dev/null +++ b/04_watchdog/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 3.13) + +include(pico_sdk_import.cmake) + +project(watchdog C CXX ASM) +set(CMAKE_C_STANDARD 11) +set(CMAKE_CXX_STANDARD 17) +pico_sdk_init() + +add_executable(watchdog + src/watchdog.c +) + +pico_set_program_name(watchdog "Watch Dog") +pico_set_program_version(watchdog "0.1.0") + +pico_enable_stdio_usb(watchdog 1) # 표준 출력을 USB로 +pico_enable_stdio_uart(watchdog 0) # 표준 출력을 UART로, 안함. + +pico_add_extra_outputs(watchdog) + +target_link_libraries(watchdog pico_stdlib) diff --git a/04_watchdog/pico_sdk_import.cmake b/04_watchdog/pico_sdk_import.cmake new file mode 100644 index 0000000..28efe9e --- /dev/null +++ b/04_watchdog/pico_sdk_import.cmake @@ -0,0 +1,62 @@ +# This is a copy of /external/pico_sdk_import.cmake + +# This can be dropped into an external project to help locate this SDK +# It should be include()ed prior to project() + +if (DEFINED ENV{PICO_SDK_PATH} AND (NOT PICO_SDK_PATH)) + set(PICO_SDK_PATH $ENV{PICO_SDK_PATH}) + message("Using PICO_SDK_PATH from environment ('${PICO_SDK_PATH}')") +endif () + +if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT} AND (NOT PICO_SDK_FETCH_FROM_GIT)) + set(PICO_SDK_FETCH_FROM_GIT $ENV{PICO_SDK_FETCH_FROM_GIT}) + message("Using PICO_SDK_FETCH_FROM_GIT from environment ('${PICO_SDK_FETCH_FROM_GIT}')") +endif () + +if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT_PATH} AND (NOT PICO_SDK_FETCH_FROM_GIT_PATH)) + set(PICO_SDK_FETCH_FROM_GIT_PATH $ENV{PICO_SDK_FETCH_FROM_GIT_PATH}) + message("Using PICO_SDK_FETCH_FROM_GIT_PATH from environment ('${PICO_SDK_FETCH_FROM_GIT_PATH}')") +endif () + +set(PICO_SDK_PATH "${PICO_SDK_PATH}" CACHE PATH "Path to the Raspberry Pi Pico SDK") +set(PICO_SDK_FETCH_FROM_GIT "${PICO_SDK_FETCH_FROM_GIT}" CACHE BOOL "Set to ON to fetch copy of SDK from git if not otherwise locatable") +set(PICO_SDK_FETCH_FROM_GIT_PATH "${PICO_SDK_FETCH_FROM_GIT_PATH}" CACHE FILEPATH "location to download SDK") + +if (NOT PICO_SDK_PATH) + if (PICO_SDK_FETCH_FROM_GIT) + include(FetchContent) + set(FETCHCONTENT_BASE_DIR_SAVE ${FETCHCONTENT_BASE_DIR}) + if (PICO_SDK_FETCH_FROM_GIT_PATH) + get_filename_component(FETCHCONTENT_BASE_DIR "${PICO_SDK_FETCH_FROM_GIT_PATH}" REALPATH BASE_DIR "${CMAKE_SOURCE_DIR}") + endif () + FetchContent_Declare( + pico_sdk + GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk + GIT_TAG master + ) + if (NOT pico_sdk) + message("Downloading Raspberry Pi Pico SDK") + FetchContent_Populate(pico_sdk) + set(PICO_SDK_PATH ${pico_sdk_SOURCE_DIR}) + endif () + set(FETCHCONTENT_BASE_DIR ${FETCHCONTENT_BASE_DIR_SAVE}) + else () + message(FATAL_ERROR + "SDK location was not specified. Please set PICO_SDK_PATH or set PICO_SDK_FETCH_FROM_GIT to on to fetch from git." + ) + endif () +endif () + +get_filename_component(PICO_SDK_PATH "${PICO_SDK_PATH}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") +if (NOT EXISTS ${PICO_SDK_PATH}) + message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' not found") +endif () + +set(PICO_SDK_INIT_CMAKE_FILE ${PICO_SDK_PATH}/pico_sdk_init.cmake) +if (NOT EXISTS ${PICO_SDK_INIT_CMAKE_FILE}) + message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' does not appear to contain the Raspberry Pi Pico SDK") +endif () + +set(PICO_SDK_PATH ${PICO_SDK_PATH} CACHE PATH "Path to the Raspberry Pi Pico SDK" FORCE) + +include(${PICO_SDK_INIT_CMAKE_FILE}) diff --git a/04_watchdog/run b/04_watchdog/run new file mode 100755 index 0000000..91417d2 --- /dev/null +++ b/04_watchdog/run @@ -0,0 +1,43 @@ +#!/usr/bin/bash +export PICO_SDK_PATH="/media/elex/UltraFit/pico-sdk" + +function fn_clean { + if [ -d ./build ] + then + rm -r ./build + fi + mkdir build +} + +function fn_cmake { + cd build + cmake .. + cd .. +} + +function fn_make { + cd build + make + cd .. +} + +if [ -z $1 ] +then + fn_clean + fn_cmake + fn_make +elif [ $1 == 'clean' ] +then + echo 'Cleaning build dir.' + fn_clean +elif [ $1 == 'cmake' ] +then + echo 'Exec cmake' + fn_cmake +elif [ $1 == 'make' ] +then + echo 'Exec make' + fn_make +else + echo 'What do you want???' +fi diff --git a/04_watchdog/src/watchdog.c b/04_watchdog/src/watchdog.c new file mode 100644 index 0000000..85db44c --- /dev/null +++ b/04_watchdog/src/watchdog.c @@ -0,0 +1,50 @@ +#include +#include "pico/stdlib.h" +#include "hardware/watchdog.h" +#include "hardware/gpio.h" +#include "pico/binary_info.h" + +const uint LED_PIN = PICO_DEFAULT_LED_PIN; + +int main() +{ + bi_decl(bi_program_description("Watchdog Test")); + bi_decl(bi_1pin_with_name(LED_PIN, "On-board LED")); + + stdio_init_all(); + + if (watchdog_caused_reboot()) + { + puts("Rebooted by Watchdog"); + } + else + { + puts("Clean boot"); + } + + // 3초 이상 반응이 없으면 리부트. + watchdog_enable(3000, false); + + gpio_init(LED_PIN); + gpio_set_dir(LED_PIN, GPIO_OUT); + + while (true) + { + // 루프가 한 번 돌 때마다 워치독을 업데이트한다. + watchdog_update(); + + printf("Currently, %u\n", time_us_32()); + + gpio_put(LED_PIN, true); + sleep_ms(250); + gpio_put(LED_PIN, false); + + sleep_ms(1000); + if (time_us_32() > 15000000) + { + // 테스트를 위해서 5초가 소요되는 작업을 한다. + // 워치독에 의해서 리부트될 것이다. + sleep_ms(5000); + } + } +} \ No newline at end of file diff --git a/05_time/.gitignore b/05_time/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/05_time/.gitignore @@ -0,0 +1 @@ +/build diff --git a/05_time/.vscode/c_cpp_properties.json b/05_time/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..a2817df --- /dev/null +++ b/05_time/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "Linux GCC ARM", + "includePath": [ + "${workspaceFolder}/**", + "${env:PICO_SDK_PATH}/src/**" + ], + "defines": [], + "compilerPath": "/usr/bin/gcc", + "cStandard": "c11", + "cppStandard": "c++17", + "intelliSenseMode": "linux-gcc-arm", + "configurationProvider": "ms-vscode.cmake-tools" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/05_time/.vscode/settings.json b/05_time/.vscode/settings.json new file mode 100644 index 0000000..6bae624 --- /dev/null +++ b/05_time/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "gpio.h": "c" + } +} \ No newline at end of file diff --git a/05_time/CMakeLists.txt b/05_time/CMakeLists.txt new file mode 100644 index 0000000..0f34240 --- /dev/null +++ b/05_time/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 3.13) + +include(pico_sdk_import.cmake) + +project(time C CXX ASM) +set(CMAKE_C_STANDARD 11) +set(CMAKE_CXX_STANDARD 17) +pico_sdk_init() + +add_executable(time + src/time.c +) + +pico_set_program_name(time "Time") +pico_set_program_version(time "0.1.0") + +pico_enable_stdio_usb(time 1) # 표준 출력을 USB로 +pico_enable_stdio_uart(time 0) # 표준 출력을 UART로, 안함. + +pico_add_extra_outputs(time) + +target_link_libraries(time pico_stdlib) diff --git a/05_time/README.md b/05_time/README.md new file mode 100644 index 0000000..ffdf573 --- /dev/null +++ b/05_time/README.md @@ -0,0 +1,54 @@ +# pico/time.h + +## 시간 + +### 현재 시간 + +현재 시간을 가져옵니다. + +- `static absolute_time_t get_absolute_time (void)` + +### 특정 시간 + +절대 시간의 값을 부팅 이후 경과된 시간에 해당하는 시간 값으로 지정합니다. + +- `static void update_us_since_boot (absolute_time_t *t, uint64_t us_since_boot)` + +### 변환 + +절대 시간을 마이크로 초 또는 밀리토 단위로 변환합니다. + +- `static uint64_t to_us_since_boot (absolute_time_t t)` +- `static uint32_t to_ms_since_boot (absolute_time_t t)` + +### 연산 + +절대 시간에 마이크로 초 또는 밀리 초 값을 더합니다. + +- `static absolute_time_t delayed_by_us (const absolute_time_t t, uint64_t us)` +- `static absolute_time_t delayed_by_ms (const absolute_time_t t, uint32_t ms)` +- `static absolute_time_t make_timeout_time_us (uint64_t us)` +- `static absolute_time_t make_timeout_time_ms (uint32_t ms)` + +### 시간 차 + +두 절대 시간 사이의 간격을 마이크로 초 단위로 반환합니다. + +- `static int64_t absolute_time_diff_us (absolute_time_t from, absolute_time_t to)` + +### 널 + +시간 값이 널인지 여부를 확인합니다. + +- `static bool is_nil_time (absolute_time_t t)` + +# hardware/timer.h + +## 현재 시간 + +부팅 이후 경과된 시간 값을 마이크로 초 단위로 반환합니다. + +- `static uint32_t time_us_32 (void)` + 1시간 11분 정도 이후에 0으로 돌아옵니다. +- `uint64_t time_us_64 (void)` + 58만년 이상 계속해서 증가합니다. diff --git a/05_time/pico_sdk_import.cmake b/05_time/pico_sdk_import.cmake new file mode 100644 index 0000000..28efe9e --- /dev/null +++ b/05_time/pico_sdk_import.cmake @@ -0,0 +1,62 @@ +# This is a copy of /external/pico_sdk_import.cmake + +# This can be dropped into an external project to help locate this SDK +# It should be include()ed prior to project() + +if (DEFINED ENV{PICO_SDK_PATH} AND (NOT PICO_SDK_PATH)) + set(PICO_SDK_PATH $ENV{PICO_SDK_PATH}) + message("Using PICO_SDK_PATH from environment ('${PICO_SDK_PATH}')") +endif () + +if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT} AND (NOT PICO_SDK_FETCH_FROM_GIT)) + set(PICO_SDK_FETCH_FROM_GIT $ENV{PICO_SDK_FETCH_FROM_GIT}) + message("Using PICO_SDK_FETCH_FROM_GIT from environment ('${PICO_SDK_FETCH_FROM_GIT}')") +endif () + +if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT_PATH} AND (NOT PICO_SDK_FETCH_FROM_GIT_PATH)) + set(PICO_SDK_FETCH_FROM_GIT_PATH $ENV{PICO_SDK_FETCH_FROM_GIT_PATH}) + message("Using PICO_SDK_FETCH_FROM_GIT_PATH from environment ('${PICO_SDK_FETCH_FROM_GIT_PATH}')") +endif () + +set(PICO_SDK_PATH "${PICO_SDK_PATH}" CACHE PATH "Path to the Raspberry Pi Pico SDK") +set(PICO_SDK_FETCH_FROM_GIT "${PICO_SDK_FETCH_FROM_GIT}" CACHE BOOL "Set to ON to fetch copy of SDK from git if not otherwise locatable") +set(PICO_SDK_FETCH_FROM_GIT_PATH "${PICO_SDK_FETCH_FROM_GIT_PATH}" CACHE FILEPATH "location to download SDK") + +if (NOT PICO_SDK_PATH) + if (PICO_SDK_FETCH_FROM_GIT) + include(FetchContent) + set(FETCHCONTENT_BASE_DIR_SAVE ${FETCHCONTENT_BASE_DIR}) + if (PICO_SDK_FETCH_FROM_GIT_PATH) + get_filename_component(FETCHCONTENT_BASE_DIR "${PICO_SDK_FETCH_FROM_GIT_PATH}" REALPATH BASE_DIR "${CMAKE_SOURCE_DIR}") + endif () + FetchContent_Declare( + pico_sdk + GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk + GIT_TAG master + ) + if (NOT pico_sdk) + message("Downloading Raspberry Pi Pico SDK") + FetchContent_Populate(pico_sdk) + set(PICO_SDK_PATH ${pico_sdk_SOURCE_DIR}) + endif () + set(FETCHCONTENT_BASE_DIR ${FETCHCONTENT_BASE_DIR_SAVE}) + else () + message(FATAL_ERROR + "SDK location was not specified. Please set PICO_SDK_PATH or set PICO_SDK_FETCH_FROM_GIT to on to fetch from git." + ) + endif () +endif () + +get_filename_component(PICO_SDK_PATH "${PICO_SDK_PATH}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") +if (NOT EXISTS ${PICO_SDK_PATH}) + message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' not found") +endif () + +set(PICO_SDK_INIT_CMAKE_FILE ${PICO_SDK_PATH}/pico_sdk_init.cmake) +if (NOT EXISTS ${PICO_SDK_INIT_CMAKE_FILE}) + message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' does not appear to contain the Raspberry Pi Pico SDK") +endif () + +set(PICO_SDK_PATH ${PICO_SDK_PATH} CACHE PATH "Path to the Raspberry Pi Pico SDK" FORCE) + +include(${PICO_SDK_INIT_CMAKE_FILE}) diff --git a/05_time/run b/05_time/run new file mode 100755 index 0000000..91417d2 --- /dev/null +++ b/05_time/run @@ -0,0 +1,43 @@ +#!/usr/bin/bash +export PICO_SDK_PATH="/media/elex/UltraFit/pico-sdk" + +function fn_clean { + if [ -d ./build ] + then + rm -r ./build + fi + mkdir build +} + +function fn_cmake { + cd build + cmake .. + cd .. +} + +function fn_make { + cd build + make + cd .. +} + +if [ -z $1 ] +then + fn_clean + fn_cmake + fn_make +elif [ $1 == 'clean' ] +then + echo 'Cleaning build dir.' + fn_clean +elif [ $1 == 'cmake' ] +then + echo 'Exec cmake' + fn_cmake +elif [ $1 == 'make' ] +then + echo 'Exec make' + fn_make +else + echo 'What do you want???' +fi diff --git a/05_time/src/time.c b/05_time/src/time.c new file mode 100644 index 0000000..c6deaae --- /dev/null +++ b/05_time/src/time.c @@ -0,0 +1,30 @@ +#include +#include "pico/stdlib.h" +#include "pico/time.h" +#include "hardware/timer.h" +#include "hardware/gpio.h" +#include "pico/binary_info.h" + +const uint LED_PIN = PICO_DEFAULT_LED_PIN; + +int main() +{ + bi_decl(bi_program_description("Time")); + bi_decl(bi_1pin_with_name(LED_PIN, "On-board LED")); + + stdio_init_all(); + + gpio_init(LED_PIN); + gpio_set_dir(LED_PIN, GPIO_OUT); + + while (true) + { + printf("%u %u\n", to_us_since_boot(get_absolute_time()), time_us_32()); + + gpio_put(LED_PIN, true); + sleep_ms(250); + gpio_put(LED_PIN, false); + + sleep_ms(2000); + } +} \ No newline at end of file diff --git a/06_timer/.gitignore b/06_timer/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/06_timer/.gitignore @@ -0,0 +1 @@ +/build diff --git a/06_timer/.vscode/c_cpp_properties.json b/06_timer/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..a2817df --- /dev/null +++ b/06_timer/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "Linux GCC ARM", + "includePath": [ + "${workspaceFolder}/**", + "${env:PICO_SDK_PATH}/src/**" + ], + "defines": [], + "compilerPath": "/usr/bin/gcc", + "cStandard": "c11", + "cppStandard": "c++17", + "intelliSenseMode": "linux-gcc-arm", + "configurationProvider": "ms-vscode.cmake-tools" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/06_timer/.vscode/settings.json b/06_timer/.vscode/settings.json new file mode 100644 index 0000000..6bae624 --- /dev/null +++ b/06_timer/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "gpio.h": "c" + } +} \ No newline at end of file diff --git a/06_timer/CMakeLists.txt b/06_timer/CMakeLists.txt new file mode 100644 index 0000000..6e51b2c --- /dev/null +++ b/06_timer/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 3.13) + +include(pico_sdk_import.cmake) + +project(timer C CXX ASM) +set(CMAKE_C_STANDARD 11) +set(CMAKE_CXX_STANDARD 17) +pico_sdk_init() + +add_executable(timer + src/timer.c +) + +pico_set_program_name(timer "Timer") +pico_set_program_version(timer "0.1.0") + +pico_enable_stdio_usb(timer 1) # 표준 출력을 USB로 +pico_enable_stdio_uart(timer 0) # 표준 출력을 UART로, 안함. + +pico_add_extra_outputs(timer) + +target_link_libraries(timer pico_stdlib) diff --git a/06_timer/pico_sdk_import.cmake b/06_timer/pico_sdk_import.cmake new file mode 100644 index 0000000..28efe9e --- /dev/null +++ b/06_timer/pico_sdk_import.cmake @@ -0,0 +1,62 @@ +# This is a copy of /external/pico_sdk_import.cmake + +# This can be dropped into an external project to help locate this SDK +# It should be include()ed prior to project() + +if (DEFINED ENV{PICO_SDK_PATH} AND (NOT PICO_SDK_PATH)) + set(PICO_SDK_PATH $ENV{PICO_SDK_PATH}) + message("Using PICO_SDK_PATH from environment ('${PICO_SDK_PATH}')") +endif () + +if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT} AND (NOT PICO_SDK_FETCH_FROM_GIT)) + set(PICO_SDK_FETCH_FROM_GIT $ENV{PICO_SDK_FETCH_FROM_GIT}) + message("Using PICO_SDK_FETCH_FROM_GIT from environment ('${PICO_SDK_FETCH_FROM_GIT}')") +endif () + +if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT_PATH} AND (NOT PICO_SDK_FETCH_FROM_GIT_PATH)) + set(PICO_SDK_FETCH_FROM_GIT_PATH $ENV{PICO_SDK_FETCH_FROM_GIT_PATH}) + message("Using PICO_SDK_FETCH_FROM_GIT_PATH from environment ('${PICO_SDK_FETCH_FROM_GIT_PATH}')") +endif () + +set(PICO_SDK_PATH "${PICO_SDK_PATH}" CACHE PATH "Path to the Raspberry Pi Pico SDK") +set(PICO_SDK_FETCH_FROM_GIT "${PICO_SDK_FETCH_FROM_GIT}" CACHE BOOL "Set to ON to fetch copy of SDK from git if not otherwise locatable") +set(PICO_SDK_FETCH_FROM_GIT_PATH "${PICO_SDK_FETCH_FROM_GIT_PATH}" CACHE FILEPATH "location to download SDK") + +if (NOT PICO_SDK_PATH) + if (PICO_SDK_FETCH_FROM_GIT) + include(FetchContent) + set(FETCHCONTENT_BASE_DIR_SAVE ${FETCHCONTENT_BASE_DIR}) + if (PICO_SDK_FETCH_FROM_GIT_PATH) + get_filename_component(FETCHCONTENT_BASE_DIR "${PICO_SDK_FETCH_FROM_GIT_PATH}" REALPATH BASE_DIR "${CMAKE_SOURCE_DIR}") + endif () + FetchContent_Declare( + pico_sdk + GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk + GIT_TAG master + ) + if (NOT pico_sdk) + message("Downloading Raspberry Pi Pico SDK") + FetchContent_Populate(pico_sdk) + set(PICO_SDK_PATH ${pico_sdk_SOURCE_DIR}) + endif () + set(FETCHCONTENT_BASE_DIR ${FETCHCONTENT_BASE_DIR_SAVE}) + else () + message(FATAL_ERROR + "SDK location was not specified. Please set PICO_SDK_PATH or set PICO_SDK_FETCH_FROM_GIT to on to fetch from git." + ) + endif () +endif () + +get_filename_component(PICO_SDK_PATH "${PICO_SDK_PATH}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") +if (NOT EXISTS ${PICO_SDK_PATH}) + message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' not found") +endif () + +set(PICO_SDK_INIT_CMAKE_FILE ${PICO_SDK_PATH}/pico_sdk_init.cmake) +if (NOT EXISTS ${PICO_SDK_INIT_CMAKE_FILE}) + message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' does not appear to contain the Raspberry Pi Pico SDK") +endif () + +set(PICO_SDK_PATH ${PICO_SDK_PATH} CACHE PATH "Path to the Raspberry Pi Pico SDK" FORCE) + +include(${PICO_SDK_INIT_CMAKE_FILE}) diff --git a/06_timer/run b/06_timer/run new file mode 100755 index 0000000..91417d2 --- /dev/null +++ b/06_timer/run @@ -0,0 +1,43 @@ +#!/usr/bin/bash +export PICO_SDK_PATH="/media/elex/UltraFit/pico-sdk" + +function fn_clean { + if [ -d ./build ] + then + rm -r ./build + fi + mkdir build +} + +function fn_cmake { + cd build + cmake .. + cd .. +} + +function fn_make { + cd build + make + cd .. +} + +if [ -z $1 ] +then + fn_clean + fn_cmake + fn_make +elif [ $1 == 'clean' ] +then + echo 'Cleaning build dir.' + fn_clean +elif [ $1 == 'cmake' ] +then + echo 'Exec cmake' + fn_cmake +elif [ $1 == 'make' ] +then + echo 'Exec make' + fn_make +else + echo 'What do you want???' +fi diff --git a/06_timer/src/timer.c b/06_timer/src/timer.c new file mode 100644 index 0000000..96cba66 --- /dev/null +++ b/06_timer/src/timer.c @@ -0,0 +1,40 @@ +#include +#include "pico/stdlib.h" +#include "pico/time.h" +#include "hardware/timer.h" +#include "pico/binary_info.h" + +// 알람 고유 번호와 사용자 데이터를 매개 변수로 전달 받습니다. +int64_t alarm_callback(alarm_id_t id, void *user_data) +{ + printf("Timer %d fired!\n", (int)id); + + // 반환값으로 마이크로 초 단위의 값을 사용해서 경과 시간 후 다시 실행되도록 지정할 수 있습니다. + return 0; +} + +bool repeating_timer_callback(struct repeating_timer *t) +{ + printf("Repeat at %lld\n", time_us_64()); + // false를 반환하면 반복이 중단됩니다. + return true; +} + +int main() +{ + bi_decl(bi_program_description("Timer")); + + stdio_init_all(); + alarm_pool_init_default(); + + alarm_id_t alarmId = add_alarm_in_ms(10000, alarm_callback, NULL, false); + + struct repeating_timer timer; + add_repeating_timer_ms(1500, repeating_timer_callback, NULL, &timer); + + while (true) + { + printf("Currently, %u", time_us_32()); + sleep_ms(1000); + } +} \ No newline at end of file