Добавлена библиотека softSerial. Общий обработчик прерываний, а также некоторые обработчики прерываний конкретных модулей перенесены в память ram
- добавлена библиотека softwareSerial. Скорость работы до 57600 включительно и на отправку, и на прием. - в bootloader добавлена проверка контрольной суммы - добавлен файл wiringLL.h, в котором собраны некоторые макросы. Этими макросами заменены функции в местах, чувствительных к длительности выполнения кода. - общие функции обработки прерываний перенесены в ram память для увеличения скорости выполнения. Так же в память ram перенесены функции обработки прерываний модулей WInterrupt (прерывания от gpio), модуля tone, модуля softwareSerial - добавлен файл-заглушка util/delay.h, необходимый для некоторых библиотек
This commit was merged in pull request #4.
This commit is contained in:
1 parent
a7468870fc
commit
47c01383e6
26 files changed
+1120
-315
No files matched your search
@@ -5,7 +5,7 @@
|
||||
#include "HardwareSerial.h"
|
||||
#include <uart_lib.h>
|
||||
#include "mik32_hal_irq.h"
|
||||
|
||||
#include "wiring_LL.h"
|
||||
|
||||
// HardwareSerial class objects for use in Arduino IDE
|
||||
HardwareSerial Serial(0);
|
||||
@@ -127,9 +127,9 @@ void HardwareSerial::rx_complete_irq(void)
|
||||
unsigned char c;
|
||||
// while there is something to receive, put the data into the buffer
|
||||
// and edit the buffer index
|
||||
while (!UART_IsRxFifoEmpty(uart))
|
||||
while(!UART_IS_RX_FIFO_EMPTY(uart))
|
||||
{
|
||||
c = UART_ReadByte(uart);
|
||||
c = UART_READ_BYTE(uart);
|
||||
if (i != _rx_buffer_tail)
|
||||
{
|
||||
// write if there is space in the buffer
|
||||
@@ -140,7 +140,7 @@ void HardwareSerial::rx_complete_irq(void)
|
||||
}
|
||||
|
||||
// wrapper for use in С-files
|
||||
extern "C" void serial_handler_wrapper(uint8_t uartNumInt)
|
||||
extern "C" void __attribute__((optimize("O3"))) serial_interrupt_handler(uint8_t uartNumInt)
|
||||
{
|
||||
if (uartNumInt == 0)
|
||||
{
|
||||
|
||||
@@ -100,7 +100,7 @@ class HardwareSerial : public Stream
|
||||
using Print::write; // pull in write(str)
|
||||
operator bool() { return isInited; }
|
||||
|
||||
void rx_complete_irq(void);
|
||||
inline void rx_complete_irq(void) __attribute__((always_inline, optimize("O3")));
|
||||
};
|
||||
|
||||
extern HardwareSerial Serial;
|
||||
|
||||
+13
-11
@@ -3,6 +3,7 @@
|
||||
|
||||
#include "mik32_hal_timer16.h"
|
||||
#include "mik32_hal_irq.h"
|
||||
#include "wiring_LL.h"
|
||||
|
||||
#define PRESCALERS_QTY 7
|
||||
typedef struct
|
||||
@@ -100,7 +101,7 @@ void tone(uint8_t pin, unsigned int frequency, unsigned long duration)
|
||||
HAL_EPIC_MaskLevelSet(HAL_EPIC_TIMER16_1_MASK);
|
||||
|
||||
pinMode(pin, OUTPUT);
|
||||
HAL_GPIO_WritePin((GPIO_TypeDef *)timer_pin_port, timer_pin_mask, GPIO_PIN_LOW);
|
||||
GPIO_CLEAR_PIN((GPIO_TypeDef *)timer_pin_port, timer_pin_mask);
|
||||
|
||||
HAL_Timer16_Counter_Start_IT(&htimer16_1, frequencyParams.period_ticks);
|
||||
timerIsOn = true;
|
||||
@@ -125,9 +126,9 @@ void noTone(uint8_t pin)
|
||||
if (timerIsOn)
|
||||
{
|
||||
// pin to 0
|
||||
HAL_GPIO_WritePin((GPIO_TypeDef *)timer_pin_port, timer_pin_mask, GPIO_PIN_LOW);
|
||||
HAL_Timer16_Disable(&htimer16_1); // disable timer
|
||||
HAL_EPIC_MaskLevelClear(HAL_EPIC_TIMER16_1_MASK);
|
||||
GPIO_CLEAR_PIN((GPIO_TypeDef *)timer_pin_port, timer_pin_mask);
|
||||
TIM16_DISABLE(htimer16_1);
|
||||
EPIC_LEVEL_CLEAR_BY_MASK(HAL_EPIC_TIMER16_1_MASK);
|
||||
pinMode(pin, INPUT); // deinit pin
|
||||
timer_pin = -1; // reset to default
|
||||
timerIsOn = false;
|
||||
@@ -135,25 +136,26 @@ void noTone(uint8_t pin)
|
||||
}
|
||||
|
||||
// irq handler
|
||||
extern "C" void tone_interrupt_handler(void)
|
||||
extern "C" void __attribute__((noinline, section(".ram_text"), optimize("O3"))) tone_interrupt_handler(void)
|
||||
{
|
||||
if(HAL_Timer16_GetInterruptStatus_ARRM(&htimer16_1))
|
||||
if (TIM16_GET_ARRM_INT_STATUS(htimer16_1))
|
||||
{
|
||||
// timer period has passed, change the pin state
|
||||
if (timer_toggle_count != 0)
|
||||
{
|
||||
HAL_GPIO_TogglePin((GPIO_TypeDef*)timer_pin_port, timer_pin_mask);
|
||||
|
||||
GPIO_TOGGLE_PIN((GPIO_TypeDef*)timer_pin_port, timer_pin_mask);
|
||||
if (timer_toggle_count > 0)
|
||||
timer_toggle_count--;
|
||||
}
|
||||
else
|
||||
{
|
||||
// turn off if the specified duration has passed
|
||||
HAL_GPIO_WritePin((GPIO_TypeDef *)timer_pin_port, timer_pin_mask, GPIO_PIN_LOW);
|
||||
noTone(timer_pin);
|
||||
GPIO_CLEAR_PIN((GPIO_TypeDef *)timer_pin_port, timer_pin_mask);
|
||||
TIM16_DISABLE(htimer16_1);
|
||||
EPIC_LEVEL_CLEAR_BY_MASK(HAL_EPIC_TIMER16_1_MASK);
|
||||
timerIsOn = false;
|
||||
}
|
||||
}
|
||||
// reset timer interrupt flags
|
||||
HAL_Timer16_ClearInterruptMask(&htimer16_1, 0xFFFFFFFF);
|
||||
TIM16_CLEAR_INT_MASK(htimer16_1, 0xFFFFFFFF);
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "pins_arduino.h"
|
||||
#include "wiring_digital.h"
|
||||
#include "WInterrupts.h"
|
||||
#include "wiring_LL.h"
|
||||
|
||||
extern void ErrorMsgHandler(const char * msg);
|
||||
|
||||
@@ -18,13 +19,13 @@ static void nothing(void)
|
||||
// enable global interrupts
|
||||
void interrupts(void)
|
||||
{
|
||||
HAL_IRQ_EnableInterrupts();
|
||||
GLOBAL_IRQ_ENABLE();
|
||||
}
|
||||
|
||||
// disable global interrupts
|
||||
void noInterrupts(void)
|
||||
{
|
||||
HAL_IRQ_DisableInterrupts();
|
||||
GLOBAL_IRQ_DISABLE();
|
||||
}
|
||||
|
||||
// we can provide no more than 8 interrupts on gpio at the same time
|
||||
@@ -100,33 +101,26 @@ void detachInterrupt(uint8_t interruptNum)
|
||||
void disableInterrupt(uint8_t interruptNum)
|
||||
{
|
||||
if(interruptNum < EXTERNAL_NUM_INTERRUPTS)
|
||||
{
|
||||
int irq_line_num = interruptToGpioIntLine(interruptNum) >> GPIO_IRQ_LINE_S;
|
||||
// disable gpio interrupt line
|
||||
GPIO_IRQ->ENABLE_CLEAR = (1 << irq_line_num);
|
||||
}
|
||||
GPIO_IRQ_LINE_DISABLE(interruptToGpioIntLine(interruptNum));
|
||||
}
|
||||
|
||||
// enable single interrupt
|
||||
void enableInterrupt(uint8_t interruptNum)
|
||||
{
|
||||
if(interruptNum < EXTERNAL_NUM_INTERRUPTS)
|
||||
{
|
||||
int irq_line_num = interruptToGpioIntLine(interruptNum) >> GPIO_IRQ_LINE_S;
|
||||
// enable gpio interrupt line
|
||||
GPIO_IRQ->ENABLE_SET = (1 << irq_line_num);
|
||||
}
|
||||
GPIO_IRQ_LINE_ENABLE(interruptToGpioIntLine(interruptNum));
|
||||
}
|
||||
|
||||
// common gpio interrupt handler
|
||||
void gpio_interrupts_handler(void)
|
||||
void __attribute__((noinline, section(".ram_text"), optimize("O3"))) gpio_interrupt_handler(void)
|
||||
{
|
||||
// go through all the interrupts and call the handler for the triggered line
|
||||
for (uint8_t i = 0; i < EXTERNAL_NUM_INTERRUPTS; i++)
|
||||
{
|
||||
if (HAL_GPIO_LineInterruptState(interruptToGpioIntLine(i)))
|
||||
if (GPIO_IRQ_LINE_STATE(interruptToGpioIntLine(i)))
|
||||
intFunc[i]();
|
||||
}
|
||||
|
||||
HAL_GPIO_ClearInterrupts();
|
||||
GPIO_IRQ_CLEAR_ALL();
|
||||
}
|
||||
@@ -19,6 +19,8 @@
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#pragma GCC diagnostic ignored "-Wrestrict" // для GCC и Clang
|
||||
|
||||
#include "WString.h"
|
||||
#include "itoa.h"
|
||||
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
#include "board.h"
|
||||
#include "mik32_hal_pcc.h"
|
||||
#include "mik32_hal_irq.h"
|
||||
#include "Arduino.h"
|
||||
|
||||
// --------------------- init --------------------- //
|
||||
// called before setup()
|
||||
void pre_init(void)
|
||||
{
|
||||
// set irq vector to ram region
|
||||
write_csr(mtvec, 0x02000000);
|
||||
|
||||
HAL_Init();
|
||||
|
||||
// gpio clock
|
||||
@@ -29,8 +33,10 @@ void post_init(void)
|
||||
// print text if Serial is enabled
|
||||
extern "C" void ErrorMsgHandler(const char * msg)
|
||||
{
|
||||
#ifdef HardwareSerial_h
|
||||
if(Serial)
|
||||
Serial.println(msg);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -10,36 +10,52 @@ MEMORY {
|
||||
}
|
||||
|
||||
STACK_SIZE = 1024;
|
||||
HEAP_SIZE = 1024;
|
||||
|
||||
CL_SIZE = 16;
|
||||
|
||||
SECTIONS {
|
||||
.text ORIGIN(ram) : {
|
||||
PROVIDE(__TEXT_START__ = .);
|
||||
*crt0.o(.text .text.*)
|
||||
*crt0.S.o(.text .text.*)
|
||||
*(.text.smallsysteminit)
|
||||
*(.text.SmallSystemInit)
|
||||
. = ORIGIN(ram) + 0xC0;
|
||||
KEEP(*crt0.o(.trap_text))
|
||||
KEEP(*crt0.S.o(.trap_text))
|
||||
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
*(.rodata)
|
||||
*(.rodata.*)
|
||||
. = ALIGN(CL_SIZE);
|
||||
PROVIDE(__TEXT_END__ = .);
|
||||
} >ram
|
||||
|
||||
.init_array (READONLY) :
|
||||
{
|
||||
PROVIDE_HIDDEN (__init_array_start = .);
|
||||
KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
|
||||
KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
|
||||
PROVIDE_HIDDEN (__init_array_end = .);
|
||||
|
||||
PROVIDE_HIDDEN (__fini_array_start = .);
|
||||
KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
|
||||
KEEP(*(.fini_array))
|
||||
PROVIDE_HIDDEN (__fini_array_end = .);
|
||||
|
||||
PROVIDE(__TEXT_END__ = .);
|
||||
} >ram AT>ram
|
||||
|
||||
.data :
|
||||
AT( __TEXT_END__ ) {
|
||||
PROVIDE(__DATA_START__ = .);
|
||||
_gp = .;
|
||||
*(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata*)
|
||||
*(.sdata .sdata.* .gnu.linkonce.s.*)
|
||||
*(.sdata .sdata.* .sdata* .sdata*.* .gnu.linkonce.s.*)
|
||||
*(.data .data.*)
|
||||
*(.ramfunc)
|
||||
. = ALIGN(CL_SIZE);
|
||||
} >ram
|
||||
|
||||
} >ram
|
||||
|
||||
__DATA_IMAGE_START__ = LOADADDR(.data);
|
||||
__DATA_IMAGE_END__ = LOADADDR(.data) + SIZEOF(.data);
|
||||
ASSERT(__DATA_IMAGE_END__ < ORIGIN(ram) + LENGTH(ram) - STACK_SIZE, "Data image overflows ram section")
|
||||
@@ -72,12 +88,19 @@ SECTIONS {
|
||||
PROVIDE(__BSS_END__ = .);
|
||||
} >ram
|
||||
|
||||
.heap : {
|
||||
PROVIDE(__heap_start = .);
|
||||
. += HEAP_SIZE;
|
||||
. = ALIGN(CL_SIZE);
|
||||
PROVIDE(__heap_end = .);
|
||||
} >ram
|
||||
|
||||
_end = .;
|
||||
PROVIDE(__end = .);
|
||||
|
||||
/* End of uninitalized data segement */
|
||||
|
||||
.stack ORIGIN(ram) + LENGTH(ram) - STACK_SIZE : {
|
||||
.stack ORIGIN(ram) + LENGTH(ram) - STACK_SIZE: {
|
||||
FILL(0);
|
||||
PROVIDE(__STACK_START__ = .);
|
||||
. += STACK_SIZE;
|
||||
|
||||
@@ -21,8 +21,8 @@ SECTIONS {
|
||||
*crt0.S.o(.text .text.*)
|
||||
*(.text.smallsysteminit)
|
||||
*(.text.SmallSystemInit)
|
||||
. = ORIGIN(rom) + 0xC0;
|
||||
KEEP(*crt0.S.o(.trap_text))
|
||||
/*. = ORIGIN(rom) + 0xC0;*/
|
||||
/*KEEP(*crt0.S.o(.trap_text))*/
|
||||
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
@@ -50,15 +50,17 @@ SECTIONS {
|
||||
AT( __TEXT_END__ ) {
|
||||
PROVIDE(__DATA_START__ = .);
|
||||
_gp = .;
|
||||
. = ORIGIN(ram) + 0xC0;
|
||||
KEEP(*crt0.S.o(.trap_text))
|
||||
*(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata*)
|
||||
*(.sdata .sdata.* .sdata* .sdata*.* .gnu.linkonce.s.*)
|
||||
*(.data .data.*)
|
||||
. = ALIGN(CL_SIZE);
|
||||
PROVIDE(__DATA_END__ = .);
|
||||
} >ram
|
||||
|
||||
__DATA_IMAGE_START__ = LOADADDR(.data);
|
||||
__DATA_IMAGE_END__ = LOADADDR(.data) + SIZEOF(.data);
|
||||
ASSERT(__DATA_IMAGE_END__ < ORIGIN(rom) + LENGTH(rom), "Data image overflows rom section")
|
||||
|
||||
/* thread-local data segment */
|
||||
.tdata : {
|
||||
@@ -84,10 +86,26 @@ SECTIONS {
|
||||
|
||||
.bss : {
|
||||
*(.bss .bss.*)
|
||||
*(COMMON)
|
||||
. = ALIGN(CL_SIZE);
|
||||
PROVIDE(__BSS_END__ = .);
|
||||
} >ram
|
||||
|
||||
/* Code intended to be copied to REGION_RAM before execution */
|
||||
.ram_text :
|
||||
AT( ALIGN(__DATA_IMAGE_END__, CL_SIZE) ) {
|
||||
PROVIDE(__RAM_TEXT_START__ = .);
|
||||
*(.ram_text)
|
||||
. = ALIGN(CL_SIZE);
|
||||
PROVIDE(__RAM_TEXT_END__ = .);
|
||||
} > ram
|
||||
|
||||
__RAM_TEXT_IMAGE_START__ = LOADADDR(.ram_text);
|
||||
__RAM_TEXT_IMAGE_END__ = LOADADDR(.ram_text) + SIZEOF(.ram_text);
|
||||
ASSERT(__RAM_TEXT_IMAGE_END__ < ORIGIN(rom) + LENGTH(rom), "rom segment overflows")
|
||||
|
||||
ASSERT(__RAM_TEXT_END__ < ORIGIN(ram) + LENGTH(ram) - STACK_SIZE - HEAP_SIZE, "REGION_RAM section overflows")
|
||||
|
||||
.heap : {
|
||||
PROVIDE(__heap_start = .);
|
||||
. += HEAP_SIZE;
|
||||
|
||||
@@ -62,6 +62,11 @@ memset_2:
|
||||
|
||||
_start:
|
||||
|
||||
li t0, 128000
|
||||
start_loop_delay:
|
||||
nop
|
||||
addi t0, t0, -1
|
||||
bnez t0, start_loop_delay
|
||||
# Init stack and global pointer
|
||||
#
|
||||
la_abs sp, __C_STACK_TOP__
|
||||
@@ -73,20 +78,19 @@ _start:
|
||||
la_abs a2, __DATA_IMAGE_END__
|
||||
la_abs a3, __DATA_START__
|
||||
memcpy a1, a2, a3, t0
|
||||
|
||||
# Init ramfunc
|
||||
#
|
||||
la_abs a1, __RAM_TEXT_IMAGE_START__
|
||||
la_abs a2, __RAM_TEXT_IMAGE_END__
|
||||
la_abs a3, __RAM_TEXT_START__
|
||||
memcpy a1, a2, a3, t0
|
||||
|
||||
# Clear bss
|
||||
#
|
||||
la_abs a1, __BSS_START__
|
||||
la_abs a2, __BSS_END__
|
||||
memset a1, a2, zero
|
||||
|
||||
#ifdef MIK32V0
|
||||
# Enable pad_config clocking
|
||||
#
|
||||
li t0, (1 << 3)
|
||||
li t1, 0x50014
|
||||
sw t0, (t1)
|
||||
#endif
|
||||
|
||||
jalr_abs ra, SmallSystemInit
|
||||
jalr_abs ra, SystemInit
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
#include "mik32_hal_irq.h"
|
||||
#include "wiring_LL.h"
|
||||
|
||||
// isr functions
|
||||
extern void serial_handler_wrapper(uint8_t uartNumInt);
|
||||
extern void gpio_interrupts_handler(void);
|
||||
extern void serial_interrupt_handler(uint8_t uartNumInt);
|
||||
extern void gpio_interrupt_handler(void);
|
||||
extern void tone_interrupt_handler(void);
|
||||
void __attribute__((weak)) wire_handler_wrapper(void)
|
||||
void __attribute__((weak)) wire_interrupt_handler(void)
|
||||
{
|
||||
// dummy function for case when wire library is not in use
|
||||
}
|
||||
@@ -14,8 +15,12 @@ void __attribute__((weak)) servo_handler_wrapper(void)
|
||||
}
|
||||
|
||||
// ---------------------------------------------- //
|
||||
void trap_handler(void)
|
||||
void __attribute__((noinline, section(".ram_text"), optimize("O3"))) trap_handler (void)
|
||||
{
|
||||
// gpio interrupt
|
||||
if (EPIC_CHECK_GPIO_IRQ())
|
||||
gpio_interrupt_handler();
|
||||
|
||||
// tone timer interrupt
|
||||
if (EPIC_CHECK_TIMER16_1())
|
||||
tone_interrupt_handler();
|
||||
@@ -26,20 +31,16 @@ void trap_handler(void)
|
||||
|
||||
// uart0 interrupt
|
||||
if (EPIC_CHECK_UART_0())
|
||||
serial_handler_wrapper(0);
|
||||
serial_interrupt_handler(0);
|
||||
|
||||
// uart1 interrupt
|
||||
if (EPIC_CHECK_UART_1())
|
||||
serial_handler_wrapper(1);
|
||||
|
||||
// gpio interrupt
|
||||
if (EPIC_CHECK_GPIO_IRQ())
|
||||
gpio_interrupts_handler();
|
||||
serial_interrupt_handler(1);
|
||||
|
||||
// i2c interrupt
|
||||
if (EPIC_CHECK_I2C_1())
|
||||
wire_handler_wrapper();
|
||||
wire_interrupt_handler();
|
||||
|
||||
// reset all interrupts
|
||||
HAL_EPIC_Clear(0xFFFFFFFF);
|
||||
EPIC_CLEAR_ALL();
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
#ifndef __DELAY_H_
|
||||
#define __DELAY_H_
|
||||
|
||||
|
||||
|
||||
#endif // __DELAY_H_
|
||||
@@ -0,0 +1,64 @@
|
||||
#ifndef _WIRING_LL_H_
|
||||
#define _WIRING_LL_H_
|
||||
|
||||
#include "mik32_hal_irq.h"
|
||||
#include "mik32_hal_gpio.h"
|
||||
#include "mik32_hal_scr1_timer.h"
|
||||
#include "mik32_hal_timer16.h"
|
||||
|
||||
// ----------------- COMMON ----------------- //
|
||||
// convert pin mask from HAL_PinsTypeDef to pin number
|
||||
#define PIN_MASK_TO_PIN_NUMBER(mask) \
|
||||
({ \
|
||||
uint8_t pos; \
|
||||
for (pos = 0; pos < 16; pos++) \
|
||||
if ((mask >> pos) & 1) \
|
||||
break; \
|
||||
pos; \
|
||||
})
|
||||
|
||||
// ----------------- SYSTICK ----------------- //
|
||||
// get ticks from systick
|
||||
#define SYSTICK_GET_TICKS() ((uint64_t)(SCR1_TIMER->MTIMEH)<<32 | SCR1_TIMER->MTIME)
|
||||
|
||||
// ----------------- UART ----------------- //
|
||||
#define UART_READ_BYTE(pUart) ((uint16_t)pUart->RXDATA)
|
||||
#define UART_IS_RX_FIFO_EMPTY(pUart) ((pUart->FLAGS & UART_FLAGS_RXNE_M) == 0)
|
||||
|
||||
// ----------------- TIMER16 ----------------- //
|
||||
#define TIM16_DISABLE(htim16) (htim16.Instance->CR &= ~TIMER16_CR_ENABLE_M)
|
||||
#define TIM16_CLEAR_INT_MASK(htim16, intMask) (htim16.Instance->ICR = intMask)
|
||||
#define TIM16_GET_ARRM_INT_STATUS(htim16) ((bool)((htim16.Instance->ISR & htim16.Instance->IER) & TIMER16_ISR_ARR_MATCH_M))
|
||||
|
||||
// ----------------- EPIC ----------------- //
|
||||
#define EPIC_LEVEL_CLEAR_BY_MASK(mask) (EPIC->MASK_LEVEL_CLEAR |= mask)
|
||||
#define EPIC_CLEAR_ALL() (EPIC->CLEAR = 0xFFFFFFFF)
|
||||
|
||||
// ----------------- IRQ ----------------- //
|
||||
#define GLOBAL_IRQ_DISABLE() (clear_csr(mie, MIE_MEIE))
|
||||
#define GLOBAL_IRQ_ENABLE() set_csr(mstatus, MSTATUS_MIE); \
|
||||
set_csr(mie, MIE_MEIE)
|
||||
|
||||
// ----------------- GPIO ----------------- //
|
||||
#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)
|
||||
#define GPIO_READ_PIN(GPIO_x, pinMask) (((GPIO_x)->SET & (pinMask)) != (uint32_t)GPIO_PIN_LOW ? GPIO_PIN_HIGH : GPIO_PIN_LOW)
|
||||
// get pin state by it's number
|
||||
#define GPIO_GET_PIN_STATE(GPIO_x, pinNumber) (((GPIO_x)->OUTPUT_ >> pinNumber) & 0b1)
|
||||
|
||||
// ----------------- GPIO IRQ ----------------- //
|
||||
#define GPIO_IRQ_LINE_ENABLE(lineMask) ( GPIO_IRQ->ENABLE_SET = (1 << (lineMask >> GPIO_IRQ_LINE_S)) )
|
||||
#define GPIO_IRQ_LINE_DISABLE(lineMask) ( GPIO_IRQ->ENABLE_CLEAR = (1 << (lineMask >> GPIO_IRQ_LINE_S)) )
|
||||
#define GPIO_IRQ_LINE_STATE(lineMask) ((GPIO_IRQ->INTERRUPT & (1 << (lineMask >> GPIO_IRQ_LINE_S))) != 0)
|
||||
#define GPIO_IRQ_CLEAR_ALL() ( GPIO_IRQ->CLEAR = 0b11111111)
|
||||
|
||||
// ----------------- PIN CONFIG ----------------- //
|
||||
// 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))
|
||||
|
||||
|
||||
|
||||
#endif /* _WIRING_LL_H_ */
|
||||
@@ -39,6 +39,11 @@ void SysTick_Init(void)
|
||||
HAL_SCR1_Timer_Init(&hscr1_timer); // Ticks are 32 MHz
|
||||
}
|
||||
|
||||
uint64_t SysTick_GetTicks(void)
|
||||
{
|
||||
return TICKS_IN_SYSTIMER;
|
||||
}
|
||||
|
||||
// number of microseconds since start of the program
|
||||
uint32_t micros(void)
|
||||
{
|
||||
|
||||
@@ -34,6 +34,12 @@ extern "C" {
|
||||
*/
|
||||
void SysTick_Init(void);
|
||||
|
||||
/**
|
||||
* \brief Returns the number of ticks since the Arduino board began running the current program.
|
||||
|
||||
* \return Number of ticks since the program started
|
||||
*/
|
||||
uint64_t SysTick_GetTicks(void);
|
||||
|
||||
/**
|
||||
* \brief Returns the number of milliseconds since the Arduino board began running the current program.
|
||||
|
||||
Reference in new issue
Block a user