From d8dad2fc2250068ea21808045a1a5d9bffbbbf0b Mon Sep 17 00:00:00 2001 From: Filipriec Date: Thu, 9 Oct 2025 20:52:20 +0200 Subject: [PATCH] working led blinking properly well --- mbed_ledky2/main.cpp | 55 +++--- pwm_led2/.gitignore | 22 +++ pwm_led2/CMakeLists.txt | 33 ++++ pwm_led2/CONTRIBUTING.md | 5 + pwm_led2/LICENSE | 165 ++++++++++++++++++ pwm_led2/README.md | 73 ++++++++ pwm_led2/main.cpp | 50 ++++++ pwm_led2/mbed-os.lib | 1 + .../official_armmbed_example_badge.png | Bin 0 -> 8258 bytes 9 files changed, 379 insertions(+), 25 deletions(-) create mode 100644 pwm_led2/.gitignore create mode 100644 pwm_led2/CMakeLists.txt create mode 100644 pwm_led2/CONTRIBUTING.md create mode 100644 pwm_led2/LICENSE create mode 100644 pwm_led2/README.md create mode 100644 pwm_led2/main.cpp create mode 100644 pwm_led2/mbed-os.lib create mode 100644 pwm_led2/resources/official_armmbed_example_badge.png diff --git a/mbed_ledky2/main.cpp b/mbed_ledky2/main.cpp index c2b7b0a..18a9f6a 100644 --- a/mbed_ledky2/main.cpp +++ b/mbed_ledky2/main.cpp @@ -1,45 +1,50 @@ // main.cpp - #include "mbed.h" - -// Blinking rate in milliseconds -#define BLINKING_RATE 500ms - DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalIn button(PC_13); -void set_led_pattern(int pattern) { - switch (pattern) { - case 0: - led1 = 1; led2 = 0; led3 = 0; - break; - case 1: - led1 = 0; led2 = 1; led3 = 0; - break; - case 2: - led1 = 0; led2 = 0; led3 = 1; - break; +int another_press(int press_num) { + press_num += 1; + if (press_num >= 8) { + press_num = 0; + }; + + return press_num; +} + +void set_led(int number) { + if ((number & 1) == 1){ + led1 = 1; + } + else if ((number & 2) == 2){ + led2 = 1; + } + else if ((number & 3) == 4){ + led3 = 1; } } int main() { - int pattern = 0; - set_led_pattern(pattern); + int num_presses = 0; while (true) { - if (button == 0){ - pattern = (pattern + 1) % 3; - set_led_pattern(pattern); + led1 = 0; + led2 = 0; + led3 = 0; - while (button == 0) { - ThisThread::sleep_for(10ms); - } + if (button == 0) { + num_presses = another_press(num_presses); + set_led(num_presses); - ThisThread::sleep_for(150ms); + while (button == 0) { + ThisThread::sleep_for(10ms); + } } + + ThisThread::sleep_for(150ms); } } diff --git a/pwm_led2/.gitignore b/pwm_led2/.gitignore new file mode 100644 index 0000000..c9deafb --- /dev/null +++ b/pwm_led2/.gitignore @@ -0,0 +1,22 @@ +.build +.mbed +projectfiles +*.py* + +# Local build directories +cmake_build/ +BUILD/ +mbed-os/ +.mbed/ +.mbedignore +*.elf +*.bin +*.hex +*.map + +# IDE and temporary files +.vscode/ +.idea/ +*.log +*.pyc +__pycache__/ diff --git a/pwm_led2/CMakeLists.txt b/pwm_led2/CMakeLists.txt new file mode 100644 index 0000000..db75bad --- /dev/null +++ b/pwm_led2/CMakeLists.txt @@ -0,0 +1,33 @@ +# Copyright (c) 2020 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.19.0 FATAL_ERROR) + +set(MBED_PATH ${CMAKE_CURRENT_SOURCE_DIR}/mbed-os CACHE INTERNAL "") +set(MBED_CONFIG_PATH ${CMAKE_CURRENT_BINARY_DIR} CACHE INTERNAL "") +set(APP_TARGET mbed-os-example-blinky) + +include(${MBED_PATH}/tools/cmake/app.cmake) + +project(${APP_TARGET}) + +add_subdirectory(${MBED_PATH}) + +add_executable(${APP_TARGET}) + +target_sources(${APP_TARGET} + PRIVATE + main.cpp +) + +target_link_libraries(${APP_TARGET} + PRIVATE + mbed-os +) + +mbed_set_post_build(${APP_TARGET}) + +option(VERBOSE_BUILD "Have a verbose build process") +if(VERBOSE_BUILD) + set(CMAKE_VERBOSE_MAKEFILE ON) +endif() diff --git a/pwm_led2/CONTRIBUTING.md b/pwm_led2/CONTRIBUTING.md new file mode 100644 index 0000000..f433ee4 --- /dev/null +++ b/pwm_led2/CONTRIBUTING.md @@ -0,0 +1,5 @@ +# Contributing to Mbed OS + +Mbed OS is an open-source, device software platform for the Internet of Things. Contributions are an important part of the platform, and our goal is to make it as simple as possible to become a contributor. + +To encourage productive collaboration, as well as robust, consistent and maintainable code, we have a set of guidelines for [contributing to Mbed OS](https://os.mbed.com/docs/mbed-os/latest/contributing/index.html). diff --git a/pwm_led2/LICENSE b/pwm_led2/LICENSE new file mode 100644 index 0000000..59cd3f8 --- /dev/null +++ b/pwm_led2/LICENSE @@ -0,0 +1,165 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. diff --git a/pwm_led2/README.md b/pwm_led2/README.md new file mode 100644 index 0000000..d4a9e75 --- /dev/null +++ b/pwm_led2/README.md @@ -0,0 +1,73 @@ +![](./resources/official_armmbed_example_badge.png) +# Blinky Mbed OS example + +The example project is part of the [Arm Mbed OS Official Examples](https://os.mbed.com/code/) and is the [getting started example for Mbed OS](https://os.mbed.com/docs/mbed-os/latest/quick-start/index.html). It contains an application that repeatedly blinks an LED on supported [Mbed boards](https://os.mbed.com/platforms/). + +You can build the project with all supported [Mbed OS build tools](https://os.mbed.com/docs/mbed-os/latest/tools/index.html). However, this example project specifically refers to the command-line interface tools, [Arm Mbed CLI 1](https://github.com/ARMmbed/mbed-cli#installing-mbed-cli) and [Mbed CLI 2](https://github.com/ARMmbed/mbed-tools#installation). + +(Note: To see a rendered example you can import into the Arm Online Compiler, please see our [import quick start](https://os.mbed.com/docs/mbed-os/latest/quick-start/online-with-the-online-compiler.html#importing-the-code).) + +## Mbed OS build tools + +### Mbed CLI 2 +Starting with version 6.5, Mbed OS uses Mbed CLI 2. It uses Ninja as a build system, and CMake to generate the build environment and manage the build process in a compiler-independent manner. If you are working with Mbed OS version prior to 6.5 then check the section [Mbed CLI 1](#mbed-cli-1). +1. [Install Mbed CLI 2](https://os.mbed.com/docs/mbed-os/latest/build-tools/install-or-upgrade.html). +1. From the command-line, import the example: `mbed-tools import mbed-os-example-blinky` +1. Change the current directory to where the project was imported. + +### Mbed CLI 1 +1. [Install Mbed CLI 1](https://os.mbed.com/docs/mbed-os/latest/quick-start/offline-with-mbed-cli.html). +1. From the command-line, import the example: `mbed import mbed-os-example-blinky` +1. Change the current directory to where the project was imported. + +## Application functionality + +The `main()` function is the single thread in the application. It toggles the state of a digital output connected to an LED on the board. + +**Note**: This example requires a target with RTOS support, i.e. one with `rtos` declared in `supported_application_profiles` in `targets/targets.json` in [mbed-os](https://github.com/ARMmbed/mbed-os). For non-RTOS targets (usually with small memory sizes), please use [mbed-os-example-blinky-baremetal](https://github.com/ARMmbed/mbed-os-example-blinky-baremetal) instead. + +## Building and running + +1. Connect a USB cable between the USB port on the board and the host computer. +1. Run the following command to build the example project and program the microcontroller flash memory: + + * Mbed CLI 2 + + ```bash + $ mbed-tools compile -m -t --flash + ``` + + * Mbed CLI 1 + + ```bash + $ mbed compile -m -t --flash + ``` + +Your PC may take a few minutes to compile your code. + +The binary is located at: +* **Mbed CLI 2** - `./cmake_build//develop//mbed-os-example-blinky.bin` +* **Mbed CLI 1** - `./BUILD///mbed-os-example-blinky.bin` + +Alternatively, you can manually copy the binary to the board, which you mount on the host computer over USB. + +## Expected output +The LED on your target turns on and off every 500 milliseconds. + + +## Troubleshooting +If you have problems, you can review the [documentation](https://os.mbed.com/docs/latest/tutorials/debugging.html) for suggestions on what could be wrong and how to fix it. + +## Related Links + +* [Mbed OS Stats API](https://os.mbed.com/docs/latest/apis/mbed-statistics.html). +* [Mbed OS Configuration](https://os.mbed.com/docs/latest/reference/configuration.html). +* [Mbed OS Serial Communication](https://os.mbed.com/docs/latest/tutorials/serial-communication.html). +* [Mbed OS bare metal](https://os.mbed.com/docs/mbed-os/latest/reference/mbed-os-bare-metal.html). +* [Mbed boards](https://os.mbed.com/platforms/). + +### License and contributions + +The software is provided under Apache-2.0 license. Contributions to this project are accepted under the same license. Please see [CONTRIBUTING.md](./CONTRIBUTING.md) for more info. + +This project contains code from other projects. The original license text is included in those source files. They must comply with our license guide. diff --git a/pwm_led2/main.cpp b/pwm_led2/main.cpp new file mode 100644 index 0000000..5d76c53 --- /dev/null +++ b/pwm_led2/main.cpp @@ -0,0 +1,50 @@ +// main.cpp +#include "mbed.h" + +DigitalOut led1(LED1); +DigitalOut led2(LED2); +DigitalOut led3(LED3); +DigitalIn button(PC_13); + +int another_press(int press_num) { + press_num += 1; + if (press_num >= 8) { + press_num = 0; + }; + + return press_num; +} + +void set_led(int number) { + if ((number & 1) == 1){ + led1 = 1; + } + else if ((number & 2) == 2){ + led2 = 1; + } + else if ((number & 3) == 3){ + led3 = 1; + } +} + +int main() +{ + + int num_presses = 0; + while (true) { + led1 = 0; + led2 = 0; + led3 = 0; + + if (button == 0) { + num_presses = another_press(num_presses); + set_led(num_presses); + + while (button == 0) { + ThisThread::sleep_for(10ms); + } + } + + ThisThread::sleep_for(150ms); + } +} diff --git a/pwm_led2/mbed-os.lib b/pwm_led2/mbed-os.lib new file mode 100644 index 0000000..144619b --- /dev/null +++ b/pwm_led2/mbed-os.lib @@ -0,0 +1 @@ +https://github.com/ARMmbed/mbed-os/#17dc3dc2e6e2817a8bd3df62f38583319f0e4fed diff --git a/pwm_led2/resources/official_armmbed_example_badge.png b/pwm_led2/resources/official_armmbed_example_badge.png new file mode 100644 index 0000000000000000000000000000000000000000..42ddce24601e8136da83617a4c760ddcbc22884d GIT binary patch literal 8258 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