A good way of thinking of this is:
Mutex: Provides mutual exclusion for a single shared resource. Only one task can hold it at a time. Aka Mutual-Exclusion
Semaphore: Controls access to a pool of identical resources. Can allow multiple tasks to proceed simultaneously.
Now Binary Semaphores provide a similar overall behavior to Mutexes but do not contain a priority inheritance mechanism (this doesn’t matter for your use case for now since all tasks have the same priority). I’d recommend reading more here and following the supplied guidance…
Binary semaphores and mutexes are very similar but have some subtle differences: Mutexes include a priority inheritance mechanism, binary semaphores do not. This makes binary semaphores the better choice for implementing synchronisation (between tasks or between tasks and an interrupt), and mutexes the better choice for implementing simple mutual exclusion.