Is 'STM32F103C8' 'digitalWrite' and 'digitalRead' possible in FAST mode?
Is 'STM32F103C8' 'digitalWrite' and 'digitalRead' possible in FAST mode?
[Same article, forum] https://www.stm32duino.com/viewtopic.php?t=2401
hello. [Status]
- MCU: STM32F103C8
- CORE1: https://github.com/rogerclarkmelbourne/Arduino_STM32
In the case of Arduino (AVR), there are the following libraries. https://www.arduinolibraries.info/libra ... write-fast 'digitalWrite' Operates 'digitalRead' quickly.
Is it possible to operate ‘Fast mode’ through ‘CORE1’? If anyone knows, please help.
Is it possible to operate ‘Fast mode’ through ‘CORE1’?
Hi You can easily write such "fast mode" itself, using the direct port manipulation:
int pin = PA5;
// generate a port and mask for defined pin
uint32_t* pin_set_register = portSetRegister(pin);
uint32_t pin_set_mask = digitalPinToBitMask(pin);
// set pin HIGH ( as digitalWrite() HIGH)
*pin_set_register = pin_set_mask;
// set pin LOW (digitalWrite() LOW)
*pin_set_register = pin_set_mask << 16;
@board707
Thank you. I understand how to do it.
Is there a method using 'digitalRead'?
I think that the syntax seems to be the similar, but I never need a "fast" digitalRead() in my projects.
use:
uint16_t value = *portInputRegister(pin) & digitalPinToBitMask(pin);
if value == 0 then pin is "low", otherwise pin is "high".
@stevstrong Thank you for answer. However, I'm saying this because I don't know much, but 'an error occurs during compilation'.
code : int pin7 = PA5; uint16_t value1 = *portInputRegister(pin7)& digitalPinToBitMask(pin7);
error : \generic_stm32f103c/variant.h:7:44: error: base operand of '->' is not a pointer #define portInputRegister(port) ( &(port->regs->IDR) )
then try:
uint16_t value1 = portInputRegister(pin7) & digitalPinToBitMask(pin7);
code : uint16_t value1 = *portInputRegister(digitalPinToPort(pin7)) & digitalPinToBitMask(pin7);
Thank you.
@stevstrong
It doesn't work.
code: const int SIG[] = {PA5, PA4, PA0, PA15}; //------------------------------------------------ --------------------// value1 = *portInputRegister(digitalPinToPort(SIG[0])) & digitalPinToBitMask(SIG[0]); value2 = *portInputRegister(digitalPinToPort(SIG[1])) & digitalPinToBitMask(SIG[1]); value3 = *portInputRegister(digitalPinToPort(SIG[2])) & digitalPinToBitMask(SIG[2]); uint16_t hall_y = 0; uint16_t hall_b = 0; uint16_t hall_g = 0; if(value1==0){ hall_y = 0; }else{ hall_y = 1; } if(value2==0){ hall_b = 0; }else{ hall_b = 1; } if(value3==0){ hall_g = 0; }else{ hall_g = 1; } //------------------------------------------------ --------------------//
What exactly do you mean "it doesn't work"? Which part does not work?
It doesn't work.
@SeongJongKwak The port access syntax is correct, the error somewhere else in your code.