добавлена поддержка еще одного прерывания и еще двух выводов для ШИМ для
платы Elbear. добавлены флаги компиляции, необходимые для работы в ArduinoIDE v1.8.19
This commit is contained in:
1 parent
f06650400b
commit
a32d749c60
19 files changed
+172
-116
No files matched your search
@@ -45,7 +45,7 @@ static void Timer16_Init(uint8_t prescaler)
|
||||
htimer16_1.Trigger.TimeOut = TIMER16_TIMEOUT_DISABLE;
|
||||
htimer16_1.Filter.ExternalClock = TIMER16_FILTER_NONE;
|
||||
htimer16_1.Filter.Trigger = TIMER16_FILTER_NONE;
|
||||
htimer16_1.Waveform.Enable = TIMER16_WAVEFORM_GENERATION_ENABLE;
|
||||
htimer16_1.Waveform.Enable = TIMER16_WAVEFORM_GENERATION_DISABLE;
|
||||
htimer16_1.Waveform.Polarity = TIMER16_WAVEFORM_POLARITY_NONINVERTED;
|
||||
htimer16_1.EncoderMode = TIMER16_ENCODER_DISABLE;
|
||||
HAL_Timer16_Init(&htimer16_1);
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
#include "WInterrupts.h"
|
||||
#include "wiring_LL.h"
|
||||
|
||||
// interrupts are enabled by default after setup()
|
||||
static bool intIsEnabled = true;
|
||||
|
||||
typedef void (*voidFuncPtr)(void);
|
||||
|
||||
// empty irq handler
|
||||
@@ -18,14 +21,20 @@ static void nothing(void)
|
||||
void interrupts(void)
|
||||
{
|
||||
GLOBAL_IRQ_ENABLE();
|
||||
intIsEnabled = true;
|
||||
}
|
||||
|
||||
// disable global interrupts
|
||||
void noInterrupts(void)
|
||||
{
|
||||
GLOBAL_IRQ_DISABLE();
|
||||
intIsEnabled = false;
|
||||
}
|
||||
|
||||
bool isInterruptsEnabled(void)
|
||||
{
|
||||
return intIsEnabled;
|
||||
}
|
||||
// we can provide no more than 8 interrupts on gpio at the same time
|
||||
static volatile voidFuncPtr intFunc[EXTERNAL_INTERRUPTS_QTY] =
|
||||
{
|
||||
|
||||
@@ -6,10 +6,12 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include "stdbool.h"
|
||||
|
||||
// enable/disable interrupts
|
||||
void interrupts(void);
|
||||
void noInterrupts(void);
|
||||
bool isInterruptsEnabled(void);
|
||||
|
||||
// attach/detach interrupt to pin
|
||||
void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode);
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
#include "Arduino.h"
|
||||
|
||||
// --------------------- init --------------------- //
|
||||
// called before setup()
|
||||
void pre_init(void)
|
||||
// called from crt0.S before constructors initialization
|
||||
extern "C" void SystemInit(void)
|
||||
{
|
||||
// set irq vector to ram region
|
||||
write_csr(mtvec, 0x02000000);
|
||||
@@ -25,8 +25,8 @@ void pre_init(void)
|
||||
// called after setup()
|
||||
void post_init(void)
|
||||
{
|
||||
// enable global interrupts by default
|
||||
interrupts();
|
||||
if(isInterruptsEnabled()) // if user has called noInterrupts() in setup(), this value is false
|
||||
interrupts(); // enable global interrupts
|
||||
}
|
||||
|
||||
// --------------------- other --------------------- //
|
||||
|
||||
@@ -5,8 +5,7 @@ extern volatile bool use_error_messages;
|
||||
#define DISABLE_ERROR_MESSAGES() (use_error_messages = false)
|
||||
#define ENABLE_ERROR_MESSAGES() (use_error_messages = true)
|
||||
|
||||
// functions for init called before and after setup()
|
||||
void pre_init(void) ;
|
||||
// function for init called after setup()
|
||||
void post_init(void);
|
||||
|
||||
#endif /* _BOARD_H_ */
|
||||
@@ -4,7 +4,6 @@
|
||||
|
||||
int main()
|
||||
{
|
||||
pre_init();
|
||||
setup();
|
||||
post_init();
|
||||
|
||||
|
||||
@@ -144,8 +144,8 @@ typedef enum __HAL_Timer16_EncoderTypeDef
|
||||
*/
|
||||
typedef enum __HAL_Timer16_WaveformGenTypeDef
|
||||
{
|
||||
TIMER16_WAVEFORM_GENERATION_ENABLE = 0, /**< Выключить генерацию волновой формы. */
|
||||
TIMER16_WAVEFORM_GENERATION_DISABLE = 1 /**< Включить генерацию волновой формы. */
|
||||
TIMER16_WAVEFORM_GENERATION_ENABLE = 0, /**< Включить генерацию волновой формы. */
|
||||
TIMER16_WAVEFORM_GENERATION_DISABLE = 1 /**< Выключить генерацию волновой формы. */
|
||||
} HAL_Timer16_WaveformGenTypeDef;
|
||||
|
||||
/**
|
||||
|
||||
@@ -105,7 +105,7 @@ typedef enum __HAL_TSENS_ClockTypeDef
|
||||
/**
|
||||
* @brief Определение структуры TSENS Handle.
|
||||
*/
|
||||
typedef struct __SPI_HandleTypeDef
|
||||
typedef struct __TSENS_HandleTypeDef
|
||||
{
|
||||
|
||||
ANALOG_REG_TypeDef *Instance; /**< Адрес регистров блока управления аналоговой подсистемой. */
|
||||
@@ -119,7 +119,7 @@ typedef struct __SPI_HandleTypeDef
|
||||
/**
|
||||
* @brief Возвращаемая структура для функции @ref HAL_TSENS_SingleStart.
|
||||
*/
|
||||
typedef struct __WDT_ClockTypeDef
|
||||
typedef struct __TSENS_ValueTypeDef
|
||||
{
|
||||
HAL_StatusTypeDef statusHAL; /**< Статус HAL. */
|
||||
|
||||
|
||||
@@ -105,7 +105,7 @@ typedef struct __WDT_ClockTypeDef
|
||||
} WDT_ClockTypeDef;
|
||||
|
||||
|
||||
void HAL_RTC_MspInit(WDT_HandleTypeDef* hwdt);
|
||||
void HAL_WDT_MspInit(WDT_HandleTypeDef* hwdt);
|
||||
HAL_StatusTypeDef HAL_WDT_Init(WDT_HandleTypeDef *hwdt, uint32_t timeout);
|
||||
HAL_StatusTypeDef HAL_WDT_Refresh(WDT_HandleTypeDef *hwdt, uint32_t timeout);
|
||||
HAL_StatusTypeDef HAL_WDT_Start(WDT_HandleTypeDef *hwdt, uint32_t timeout);
|
||||
|
||||
@@ -3,14 +3,56 @@
|
||||
uint16_t TimeOut = 20;
|
||||
uint16_t WDT_prescale[] = {1, 2, 4, 16, 64, 256, 1024, 4096};
|
||||
|
||||
/**
|
||||
* @brief Запись слова в регистр CON (конфигурация WDT)
|
||||
* @param hwdt указатель на структуру WDT_HandleTypeDef, которая содержит
|
||||
* информацию о конфигурации для модуля WDT.
|
||||
* @param conValue 32-х битное слово
|
||||
*/
|
||||
static void __attribute__( ( noinline, section(".ram_text") ) ) HAL_WDT_Write_Word_To_CON(WDT_HandleTypeDef* hwdt, uint32_t conValue)
|
||||
{
|
||||
//Если позволить компилятору inlining, станет невозможно выделить функцию в отдельную секцию.
|
||||
intptr_t ptr = (intptr_t)(hwdt->Instance);
|
||||
/**
|
||||
* Попытки избежать использования отдельной переменной-указателя, такие как:
|
||||
* "sb a0,0x9C(%a0)\n\t"
|
||||
* : "m" (*(hwdt->Instance))
|
||||
* не работают из-за бага GCC (internal compiler error <...> riscv_print_operand_address)
|
||||
* */
|
||||
asm volatile(
|
||||
"li a0,0x1E\n\t" //Store unlock byte somewhere
|
||||
"sb a0,0x9C(%0)\n\t" //Write UNLOCK byte into WDT KEY register
|
||||
"sw %1,0x84(%0)\n\t" //Write payload
|
||||
:
|
||||
: "r" (ptr), "r" (conValue)
|
||||
: "a0"
|
||||
);
|
||||
}
|
||||
/**
|
||||
* @brief Запись байта в регистр KEY (пуск/остановка WDT)
|
||||
* @param hwdt указатель на структуру WDT_HandleTypeDef, которая содержит
|
||||
* информацию о конфигурации для модуля WDT.
|
||||
* @param key байт для записи ( @ref WDT_KEY_START или @ref WDT_KEY_STOP )
|
||||
*/
|
||||
static void __attribute__( ( noinline, section(".ram_text") ) ) HAL_WDT_Write_Byte_To_KEY(WDT_HandleTypeDef* hwdt, uint8_t key)
|
||||
{
|
||||
intptr_t ptr = (intptr_t)(hwdt->Instance);
|
||||
asm volatile(
|
||||
"li a0,0x1E\n\t" //Store unlock byte somewhere
|
||||
"sb a0,0x9C(%0)\n\t" //Write UNLOCK byte into WDT KEY register
|
||||
"sb %1,0x9C(%0)\n\t" //Write payload
|
||||
:
|
||||
: "r" (ptr), "r" (key)
|
||||
: "a0"
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Инициализация WDT MSP.
|
||||
* @param hwdt указатель на структуру WDT_HandleTypeDef, которая содержит
|
||||
* информацию о конфигурации для модуля WDT.
|
||||
*
|
||||
* информацию о конфигурации для модуля WDT.
|
||||
*/
|
||||
__attribute__((weak)) void HAL_RTC_MspInit(WDT_HandleTypeDef *hwdt)
|
||||
__attribute__((weak)) void HAL_WDT_MspInit(WDT_HandleTypeDef *hwdt)
|
||||
{
|
||||
__HAL_PCC_WDT_CLK_ENABLE();
|
||||
}
|
||||
@@ -82,7 +124,7 @@ HAL_StatusTypeDef HAL_WDT_Init(WDT_HandleTypeDef *hwdt, uint32_t timeout)
|
||||
return HAL_ERROR;
|
||||
}
|
||||
|
||||
HAL_RTC_MspInit(hwdt);
|
||||
HAL_WDT_MspInit(hwdt);
|
||||
|
||||
|
||||
if (HAL_WDT_Stop(hwdt, timeout) != HAL_OK)
|
||||
@@ -100,8 +142,7 @@ HAL_StatusTypeDef HAL_WDT_Init(WDT_HandleTypeDef *hwdt, uint32_t timeout)
|
||||
}
|
||||
|
||||
uint32_t conValue = (wdtClock.divIndex << WDT_CON_PRESCALE_S) | WDT_CON_PRELOAD(wdtClock.tick);
|
||||
hwdt->Instance->KEY = WDT_KEY_UNLOCK;
|
||||
hwdt->Instance->CON = conValue;
|
||||
HAL_WDT_Write_Word_To_CON(hwdt, conValue);
|
||||
|
||||
return HAL_OK;
|
||||
}
|
||||
@@ -115,8 +156,7 @@ HAL_StatusTypeDef HAL_WDT_Init(WDT_HandleTypeDef *hwdt, uint32_t timeout)
|
||||
*/
|
||||
HAL_StatusTypeDef HAL_WDT_Refresh(WDT_HandleTypeDef *hwdt, uint32_t timeout)
|
||||
{
|
||||
hwdt->Instance->KEY = WDT_KEY_UNLOCK;
|
||||
hwdt->Instance->KEY = WDT_KEY_START;
|
||||
HAL_WDT_Write_Byte_To_KEY(hwdt, WDT_KEY_START);
|
||||
|
||||
while (timeout--)
|
||||
{
|
||||
@@ -139,8 +179,7 @@ HAL_StatusTypeDef HAL_WDT_Refresh(WDT_HandleTypeDef *hwdt, uint32_t timeout)
|
||||
*/
|
||||
HAL_StatusTypeDef HAL_WDT_Start(WDT_HandleTypeDef *hwdt, uint32_t timeout)
|
||||
{
|
||||
hwdt->Instance->KEY = WDT_KEY_UNLOCK;
|
||||
hwdt->Instance->KEY = WDT_KEY_START;
|
||||
HAL_WDT_Write_Byte_To_KEY(hwdt, WDT_KEY_START);
|
||||
|
||||
while (timeout--)
|
||||
{
|
||||
@@ -162,8 +201,7 @@ HAL_StatusTypeDef HAL_WDT_Start(WDT_HandleTypeDef *hwdt, uint32_t timeout)
|
||||
*/
|
||||
HAL_StatusTypeDef HAL_WDT_Stop(WDT_HandleTypeDef *hwdt, uint32_t timeout)
|
||||
{
|
||||
hwdt->Instance->KEY = WDT_KEY_UNLOCK;
|
||||
hwdt->Instance->KEY = WDT_KEY_STOP;
|
||||
HAL_WDT_Write_Byte_To_KEY(hwdt, WDT_KEY_STOP);
|
||||
|
||||
while (timeout--)
|
||||
{
|
||||
@@ -185,8 +223,7 @@ HAL_StatusTypeDef HAL_WDT_Stop(WDT_HandleTypeDef *hwdt, uint32_t timeout)
|
||||
void HAL_WDT_SetPrescale(WDT_HandleTypeDef *hwdt, HAL_WDT_Prescale prescale)
|
||||
{
|
||||
uint32_t conValue = (hwdt->Instance->CON & (~WDT_CON_PRESCALE_M)) | ((prescale << WDT_CON_PRESCALE_S) & WDT_CON_PRESCALE_M);
|
||||
hwdt->Instance->KEY = WDT_KEY_UNLOCK;
|
||||
hwdt->Instance->CON = conValue;
|
||||
HAL_WDT_Write_Word_To_CON(hwdt, conValue);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -198,6 +235,5 @@ void HAL_WDT_SetPrescale(WDT_HandleTypeDef *hwdt, HAL_WDT_Prescale prescale)
|
||||
void HAL_WDT_SetPreload(WDT_HandleTypeDef *hwdt, HAL_WDT_Prescale preload)
|
||||
{
|
||||
uint32_t conValue = (hwdt->Instance->CON & (~WDT_CON_PRELOAD_M)) | WDT_CON_PRELOAD(preload);
|
||||
hwdt->Instance->KEY = WDT_KEY_UNLOCK;
|
||||
hwdt->Instance->CON = conValue;
|
||||
HAL_WDT_Write_Word_To_CON(hwdt, conValue);
|
||||
}
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "mik32_hal_gpio.h"
|
||||
#include "mik32_hal_scr1_timer.h"
|
||||
#include "mik32_hal_timer16.h"
|
||||
#include "pad_config.h"
|
||||
|
||||
// ----------------- COMMON ----------------- //
|
||||
// convert pin mask from HAL_PinsTypeDef to pin number
|
||||
@@ -32,6 +33,7 @@
|
||||
#define TIM16_DISABLE_INT_BY_MASK(htim16,intMask) (htim16.Instance->IER &= ~(intMask))
|
||||
|
||||
// ----------------- EPIC ----------------- //
|
||||
#define EPIC_LEVEL_SET_BY_MASK(mask) (EPIC->MASK_LEVEL_SET |= mask)
|
||||
#define EPIC_LEVEL_CLEAR_BY_MASK(mask) (EPIC->MASK_LEVEL_CLEAR |= mask)
|
||||
#define EPIC_CLEAR_ALL() (EPIC->CLEAR = 0xFFFFFFFF)
|
||||
|
||||
@@ -41,6 +43,8 @@
|
||||
set_csr(mie, MIE_MEIE)
|
||||
|
||||
// ----------------- GPIO ----------------- //
|
||||
#define GPIO_INPUT_MODE_PIN(GPIO_x, pinMask) ((GPIO_x)->DIRECTION_IN = (pinMask))
|
||||
#define GPIO_OUTPUT_MODE_PIN(GPIO_x, pinMask) ((GPIO_x)->DIRECTION_OUT = (pinMask))
|
||||
#define GPIO_SET_PIN(GPIO_x, pinMask) ((GPIO_x)->SET = (pinMask))
|
||||
#define GPIO_CLEAR_PIN(GPIO_x, pinMask) ((GPIO_x)->CLEAR = (pinMask))
|
||||
#define GPIO_TOGGLE_PIN(GPIO_x, pinMask) ((GPIO_x)->OUTPUT_ ^= pinMask)
|
||||
@@ -58,8 +62,6 @@
|
||||
// return config of pin with pinNumber(0...16) in portReg (config, pupd, ds for ports 0...2)
|
||||
#define PIN_GET_PAD_CONFIG(portReg, pinNumber) ((PAD_CONFIG->portReg >> (pinNumber<<1)) & 0b11)
|
||||
#define PIN_SET_PAD_CONFIG(portReg, pinNumber, value) (PAD_CONFIG->portReg = (PAD_CONFIG->portReg & (~PAD_CONFIG_PIN_M(pinNumber))) \
|
||||
| PAD_CONFIG_PIN(pinNumber, value))
|
||||
|
||||
|
||||
| PAD_CONFIG_PIN(pinNumber, value))
|
||||
|
||||
#endif /* _WIRING_LL_H_ */
|
||||
Reference in new issue
Block a user