elbear_arduino_bsp/cores/arduino/wiring_digital.c
KLASSENTS eb9b1aa0c9 v0.5.1
- в модулях Wire, SPI, Serial приведена в соответствие нумерация используемых экземпляров и периферии микроконтроллера.
- в функции analogWrite() перед запуском ШИМ проверяется, не запущен ли уже указанный канал.
- добавлена возможность переопределения функции main() в скетчах.
- при старте программы задается граница кэшируемой области SPIFI в соответствии с размером текущего исполняемого кода.
- исправление выявленных ошибок.
Co-authored-by: KLASSENTS <klassen@elron.tech>
Co-committed-by: KLASSENTS <klassen@elron.tech>
2025-05-30 12:24:08 +03:00

151 lines
4.2 KiB
C

/*
Copyright (c) 2011 Arduino. All right reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "Arduino.h"
#include "pins_arduino.h"
#include "mik32_hal_gpio.h"
#include "wiring_LL.h"
#ifdef __cplusplus
extern "C" {
#endif
// initialization
void pinMode(uint32_t PinNumber, uint32_t PinMode)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// if pin number is greater than pin list size - return
if ((PinNumber>=pinCommonQty()))
{
ErrorMsgHandler("pinMode(): pin number exceeds the total number of pins");
return;
}
if (digitalPinPwmIsOn(PinNumber))
// if the pin use PWM, disable PWM
analogWriteStop(PinNumber);
// determine the port and the pin number in the port
GPIO_TypeDef *GPIO_addr = digitalPinToPort(PinNumber);
GPIO_InitStruct.Pin = digitalPinToBitMask(PinNumber);
// set up direction and pull up/down
switch (PinMode)
{
case INPUT:
GPIO_InitStruct.Mode = HAL_GPIO_MODE_GPIO_INPUT;
GPIO_InitStruct.Pull = HAL_GPIO_PULL_NONE;
break;
case INPUT_PULLUP:
GPIO_InitStruct.Mode = HAL_GPIO_MODE_GPIO_INPUT;
GPIO_InitStruct.Pull = HAL_GPIO_PULL_UP;
break;
case OUTPUT:
GPIO_InitStruct.Mode = HAL_GPIO_MODE_GPIO_OUTPUT;
GPIO_InitStruct.Pull = HAL_GPIO_PULL_NONE;
break;
}
// init pin
HAL_GPIO_Init(GPIO_addr, &GPIO_InitStruct);
additionalPinsInit(PinNumber);
}
void fastPinMode(uint32_t PinNumber, uint32_t PinMode)
{
if ((PinNumber>=pinCommonQty()))
{
ErrorMsgHandler("fastPinMode(): pin number exceeds the total number of pins");
return;
}
GPIO_TypeDef* port = digitalPinToPort(PinNumber);
HAL_PinsTypeDef pinMask = digitalPinToBitMask(PinNumber);
// set direction
if (PinMode == OUTPUT)
GPIO_OUTPUT_MODE_PIN(port, pinMask);
else
GPIO_INPUT_MODE_PIN(port, pinMask);
// set pullup
if (PinMode == INPUT_PULLUP)
{
uint8_t pos = PIN_MASK_TO_PIN_NUMBER(pinMask);
if (port == GPIO_0) PIN_SET_PAD_CONFIG(PORT_0_PUPD, pos, HAL_GPIO_PULL_UP);
else if (port == GPIO_1) PIN_SET_PAD_CONFIG(PORT_1_PUPD, pos, HAL_GPIO_PULL_UP);
else PIN_SET_PAD_CONFIG(PORT_2_PUPD, pos, HAL_GPIO_PULL_UP);
}
}
// write pin
__attribute__((noinline, section(".ram_text"))) void digitalWrite(uint32_t PinNumber, uint32_t Val)
{
if ((PinNumber>=pinCommonQty()))
{
ErrorMsgHandler("digitalWrite(): pin number exceeds the total number of pins");
return;
}
if (digitalPinPwmIsOn(PinNumber))
// if the pin use PWM, disable PWM
analogWriteStop(PinNumber);
if (Val == HIGH)
GPIO_SET_PIN(digitalPinToPort(PinNumber), digitalPinToBitMask(PinNumber));
else
GPIO_CLEAR_PIN(digitalPinToPort(PinNumber), digitalPinToBitMask(PinNumber));
}
// read pin
__attribute__((noinline, section(".ram_text"))) int digitalRead(uint32_t PinNumber)
{
if ((PinNumber>=pinCommonQty()))
{
ErrorMsgHandler("digitalRead(): pin number exceeds the total number of pins");
return -1;
}
if (digitalPinPwmIsOn(PinNumber))
// if the pin use PWM, disable PWM
analogWriteStop(PinNumber);
return GPIO_READ_PIN(digitalPinToPort(PinNumber), digitalPinToBitMask(PinNumber));
}
// toggle pin
__attribute__((noinline, section(".ram_text"))) void digitalToggle(uint32_t PinNumber)
{
if ((PinNumber>=pinCommonQty()))
{
ErrorMsgHandler("digitalToggle(): pin number exceeds the total number of pins");
return;
}
if (digitalPinPwmIsOn(PinNumber))
// if the pin use PWM, disable PWM
analogWriteStop(PinNumber);
GPIO_TOGGLE_PIN(digitalPinToPort(PinNumber), digitalPinToBitMask(PinNumber));
}
#ifdef __cplusplus
}
#endif