Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add STM32C0x #1188

Draft
wants to merge 20 commits into
base: develop
Choose a base branch
from
Draft

Add STM32C0x #1188

wants to merge 20 commits into from

Conversation

Apehaenger
Copy link

In relation to #1187, I tried to add STM32C011F6P6 support for a custom PCB.

Well, somehow hard for an ungifted to jump into the internals, who's intention was to use modm for his project ;-)
However, can't become more dumb by trying :-)

Unfortunately I got stuck after a couple of lines and don't know if I missed something to hack in modm or if I made something wrong with my minimal blink example :-/
If I chose a supported MCU it compiles well, but all supported MCU's I found, do also have a board, so...

This is what I get now:

jebeling@lt-je:~/Development/OpenMowerProject/xESC_YF_rev4-adapter/firmware/ext/modm/examples/stm32c0x1/blink$ lbuild build
>> modm: Recomputing device cache...

ERROR: In 'modm:build':

Traceback (most recent call last):
  File "/home/jebeling/Development/OpenMowerProject/xESC_YF_rev4-adapter/firmware/ext/modm/tools/build_script_generator/module.lb", line 251, in post_build
    all_rams = [m for m in linkerscript.get("memories") if "w" in m["access"]]
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: 'NoneType' object is not iterable

Any hints are welcome ;-)

@salkinium
Copy link
Member

You were just missing a dependency on modm:platform:core. That pulls in the startup code etc. Now there is a bunch of compile errors with RCC macros, the modm:platform:rcc module needs to be fixed.

@rleh
Copy link
Member

rleh commented Jul 12, 2024

I just created a commit very similar to 89d75c1, but was 30 seconds too late pushing it here 😆

@Apehaenger
Copy link
Author

Many thanks for your great help @salkinium and @rleh !!
Will go on trying to fix the compile errors ;-)

@salkinium
Copy link
Member

I was kinda wondering why RCC even gets pulled in for your minimal example, and for some reason the modm:platform:gpio module depends on RCC but doesn't use it? It's only required for the delay boot frequencies:

arm-none-eabi/bin/ld: modm/build/stm32c0x1/blink/scons-release/modm/libmodm.a(delay_ns.o): in function `modm::delay_us(unsigned long)':
./modm/src/modm/platform/core/delay_ns.cpp:54: undefined reference to `modm::platform::delay_fcpu_MHz'
arm-none-eabi/bin/ld: ./modm/src/modm/platform/core/delay_ns.cpp:54: undefined reference to `modm::platform::delay_ns_per_loop'

So I defined them in the main.cpp file as a hack, just to get you unblocked for blinky. Would probably still be good to have the RCC module to go up to 48MHz and not stay at 16MHz boot frequency.

@salkinium
Copy link
Member

Btw, you can check the dependency graph with lbuild dependencies | dot -Tsvg -Grankdir=BT -o dependencies.svg for the example.

dependencies

@Apehaenger
Copy link
Author

Apehaenger commented Jul 12, 2024

Quite thanks for your quick and helpful suggestions!!

But you're to fast for me or I'm to slow/untalented.

In between I got blinky compiled well but I'm still to unfamiliar with modm and go by the docs step by step.
I currently hang with the basics :-/ scons program https://modm.io/guide/custom-project/#generate-compile-and-upload which drops me "Error: Debug Adapter has to be specified, see "adapter driver" command".

For sure, I do know how to flash the elf file with OpenOCD by hand, but thought to go the modm way, before switching over to CMake and VSCode. So still searching ;-) Turns out that the official OpenOCD 0.12.x doesn't has C0x support. My fault ;-) ... it's running now.

Yes sure! Once I get code running on it, I will try to fix the RCC issues. I also need to adapt the modules/driver for timer, uart, ADC, because my PCB needs them ;-)

Also quite thanks for hinting me to the dependency SVG. Already built one before (during work through the docs), but was shocked in the first view :-) ... but I'm pretty sure once I get it running, it will be helpful!!

@Apehaenger Apehaenger closed this Jul 13, 2024
@salkinium
Copy link
Member

Did you close this on purpose? If you want to add more changes to the PR, just push more commits to the branch, the PR will update automatically.

@Apehaenger
Copy link
Author

Yes ;-) due to frustration...
But 1/2 hour later I felt as looser and reviewed where I stuck.
Now I'm on track again... don't know if it's the right one :-) but if it's a step forward, I'll reopen and push my findings ;-)

@Apehaenger Apehaenger reopened this Jul 13, 2024
@Apehaenger
Copy link
Author

Apehaenger commented Jul 13, 2024

Okay, hard time but more clever now :-) ... or more hacky :-/

  • Got RCC compile errors fixed
  • stripped down my blinky sample (renamed the folder to STM32C0x)
  • removed @salkinium WIP hack

As I did not know anything about modm before, I'm pretty sure that I did it somehow wrong at some places.
I also do not know if it's running at 48MHz in real or still at 16MHz boot frequency.
So please be so kind and give me a hint what should be changed.

Some questions popped up during coding:

  1. If I go on and get my required drivers running for C0x, then the overview page with the supported MCUs also need to get updated (by me). I already recognized the circle sign of untested features, but how's about internal stuff like non-tested external clock or the requirement for ST's OpenOCD variant? Does such info get written down somewhere or doesn't it matter?
  2. During watching around whats up with my code, I saw that the board definitions do a couple of initialization. How is it with a custom PCB like mine. Do I need to do such initialization (in special sysclock) in my main or is there some kind of custom board definition possibility which I overlooked in the docs? Yes, found modules.md in boards section which cleanly answers this question
  3. What's up with the CI errors. Are they reasoned by my changes? yes

properties["bdcr"] = "CSR" if target.family in ["l0", "l1"] else "BDCR"
properties["pll_ids"] = ["1", "2", "3"] if target.family in ["h7", "u5"] else [""]
properties["bdcr"] = "CSR1" if target.family in ["c0"] else "CSR" if target.family in ["l0", "l1"] else "BDCR"
properties["pll_ids"] = ["1", "2", "3"] if target.family in ["h7", "u5"] else [] if target.family in ["c0"] else [""]
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"c0" requires an empty array for not walking through %% for id in pll_ids in rcc.cpp.in.
Is [""] a correct option?

@Apehaenger
Copy link
Author

Apehaenger commented Jul 14, 2024

Reverted a couple of previous RCC hacks (like hsi48) because I felt they're wrong.

Added a custom-board.hpp to the blinky sample because I had the impression that SysClock need to be enabled/activated as ref-docs say boot frequency is HSI (48MHz) divided by 4 which is 12MHz.

But failed in RCC with PLL definitions because I'm to unknown.
Have the impression that modm-devices doesn't parsed the PLL defines out of the CMSIS header correctly, as I couldn't find any PLL defines in stm32c0x header files.

Blinky is running with a 2 second delay (instead of 0.5s), which seem to be the 1/2 boot frequency of 48MHz.

Would be nice if someone can give me a hint ;-)

@salkinium
Copy link
Member

I'll have a look next week in more detail when I'm on holiday, under the week I'm typically too mentally exhausted from work.

@Apehaenger
Copy link
Author

Apehaenger commented Jul 15, 2024

In between I did some tries with STM32CubeMX together with STM32-VScode extension. This is not an option for me 👎
So I reverted back to my initial but wrong looking 'hsi48' hacks, because it work and also the delay look correct.

With this I can go on trying to get into my project and use modm for it 👍

So @salkinium, enjoy your holiday by reading a book or doing something funny, but don't with coding. My issue has time for somewhen after holiday!

@salkinium
Copy link
Member

I ordered a NUCLEO-C031C6 dev board, will probably end of week. I also found a super cheap (~1.5CHF) STM32C011 barebone dev board on aliexpress, but that'll arrive later.

@Apehaenger
Copy link
Author

Apehaenger commented Jul 16, 2024

Oh no, don't waste money for my dev issues.
I'm pretty happy at the moment and get step by step into modm. Trying all driver (and partly build examples) which I do need for my project.
All is working great at the moment. Also sysclock stuff is working as expected since I added the HsiSysDivider stuff.
The bigger question will be: If I made it right and if it fit to your code requirements ;-)

Edit:
Took me some time to realize that the C0x doesn't has a PLL. Since that got into my brain, I'm going forward without issues 👍

@salkinium
Copy link
Member

It's more to have a device to run the modm unit tests on. The nucleo boards are super cheap, and I need at least one device per family anyways.

modm::log::Logger modm::log::error(loggerDevice);

static void
printAdc()
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is non-sense ATM

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Development

Successfully merging this pull request may close these issues.

None yet

3 participants