Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
82fbe4939e | ||
|
|
079b3c19bc | ||
|
|
8dcd341b77 | ||
|
|
d32773e7b8 | ||
|
|
687984b356 | ||
|
|
fa310cfa0d | ||
|
|
7e64bd224e | ||
|
|
e37ab059a3 | ||
|
|
926f03b87f | ||
|
|
594ee96ffe | ||
|
|
f8c00f6086 | ||
|
|
8977dc59e1 |
No files matched your search
@@ -0,0 +1 @@
|
|||||||
|
installed.json
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
# elbear_arduino_bsp
|
||||||
|
Пакет поддержки платы Elbear Ace-Uno на базе микроконтроллера MIK32 Амур в среде программирования Arduino IDE.
|
||||||
|
|
||||||
|
|
||||||
|
## Установка пакета в ArduinoIDE
|
||||||
|
1. Установите [Arduino IDE](https://www.arduino.cc/en/software).
|
||||||
|
2. Откройте меню `Файл -> Параметры`.
|
||||||
|
3. Вставьте данную ссылку в поле "Дополнительные ссылки для Менеджера плат":
|
||||||
|
`https://elron.tech/files/package_elbear_beta_index.json`
|
||||||
|

|
||||||
|
4. Откройте меню `Инструменты -> Плата -> Менеджер плат...`.
|
||||||
|
5. В поиске найдите плату `Elbear Ace-Uno`, выберите нужную версию и нажмите кнопку `Установить`.
|
||||||
|

|
||||||
|
6. Процесс установки может занять некоторое время. Результаты установки отобразятся в поле `Вывод`, а так же во всплывающих уведомлениях.
|
||||||
|

|
||||||
|
|
||||||
|
Для загрузки скетчей по USB в ArduinoIDE необходимо, чтобы на плату Elbear Ace-Uno была загружена специальная программа-загрузчик ([elbear_fw_bootloader](https://gitflic.ru/project/elron-tech/elbear_fw_bootloader)). Если она уже есть на плате, можно сразу переходить к работе. Если загрузчика еще нет или необходимо обновить его на плате, ниже описан процесс загрузки. Актуальная версия программы-загрузчика входит в состав пакета поддержки, отдельно скачивать её не нужно.
|
||||||
|
|
||||||
|
Платы ревизии 1.1.0 готовы к использованию в ArduinoIDE из коробки, так как поставляются с предварительно загруженной программой-загрузчиком.
|
||||||
|
|
||||||
|
## Загрузка программы-загрузчика через ArduinoIDE
|
||||||
|
1. Подключите плату Elbear Ace-Uno к ПК через программатор ELJTAG.
|
||||||
|
2. В ArduinoIDE выберите программатор: `Инструменты -> Программатор -> mik32 uploader`.
|
||||||
|
3. Для загрузки программы-загрузчика выберите `Инструменты -> Записать Загрузчик`.
|
||||||
|

|
||||||
|
4. При возникновении проблем с загрузкой ознакомьтесь с разделом `Настройка программатора` в [инструкции](https://elron.tech/wp-content/uploads/2024/05/instrukcija-po-pervomu-zapusku.pdf) по первому запуску платы ELBEAR ACE-UNO.
|
||||||
|
Теперь можно загружать скетчи в плату по USB.
|
||||||
|
|
||||||
|
## Начало работы
|
||||||
|
1. Подключите плату к ПК по USB.
|
||||||
|
2. Откройте ArduinoIDE и загрузите необходимый скетч. Для начала работы можно воспользоваться готовыми примерами, например - `Файл -> Примеры -> 01.Basics -> Blink`.
|
||||||
|

|
||||||
|
3. Выберите активную плату - `Инструменты -> Плата`.
|
||||||
|

|
||||||
|
4. Выберите используемый COM порт - `Инструменты -> Порт`.
|
||||||
|

|
||||||
|
Выбранные плата и порт в ArduinoIDE должны отображаться следующим образом:
|
||||||
|

|
||||||
|
5. Проверьте скетч, нажав соответствующую кнопку.
|
||||||
|

|
||||||
|
6. Загрузите полученную прошивку на плату.
|
||||||
|

|
||||||
|
7. При необходимости можно открыть терминал и получать сообщения от платы по интерфейсу Serial. Для этого выберите `Инструменты -> Монитор порта`.
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
При возникновении вопросов или выявлении проблем можно оставить заявку [здесь](https://gitflic.ru/project/elron-tech/elbear_arduino_bsp/issue).
|
||||||
|
|
||||||
|
# Полезные ссылки
|
||||||
|
* [Описание платы и ее распиновка](https://elron.tech/russian-arduino-compatible-board/)
|
||||||
|
* [Материалы для плат разных ревизий](https://elron.tech/materialy-dlja-elbear-ace-uno/)
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
# See: https://arduino.github.io/arduino-cli/latest/platform-specification/
|
# See: https://arduino.github.io/arduino-cli/latest/platform-specification/
|
||||||
##############################################################
|
##############################################################
|
||||||
aceUno8Mb.name=Elbear Ace-Uno 8Mb
|
|
||||||
|
##################### Ace-Uno 8 Mb #####################
|
||||||
|
aceUno8Mb.name=Elbear Ace-Uno 8 Mb
|
||||||
|
|
||||||
# tool for firmware update
|
# tool for firmware update
|
||||||
aceUno8Mb.upload.tool=elbear_uploader
|
aceUno8Mb.upload.tool=elbear_uploader
|
||||||
@@ -16,8 +18,56 @@ aceUno8Mb.bootloader.file=ace-uno/bootloader.hex
|
|||||||
# build options
|
# build options
|
||||||
aceUno8Mb.build.mcu=MIK32_Amur
|
aceUno8Mb.build.mcu=MIK32_Amur
|
||||||
aceUno8Mb.build.f_cpu=32000000UL
|
aceUno8Mb.build.f_cpu=32000000UL
|
||||||
aceUno8Mb.build.board=ACE_UNO_8Mb
|
aceUno8Mb.build.board=ACE_UNO_8MB
|
||||||
aceUno8Mb.build.core=arduino
|
aceUno8Mb.build.core=arduino
|
||||||
aceUno8Mb.build.variant=standart
|
aceUno8Mb.build.variant=standart
|
||||||
aceUno8Mb.build.extra_flags=
|
aceUno8Mb.build.extra_flags=
|
||||||
aceUno8Mb.build.flags=
|
aceUno8Mb.build.flags=
|
||||||
|
|
||||||
|
|
||||||
|
##################### Ace-Uno 16 Mb #####################
|
||||||
|
aceUno16Mb.name=Elbear Ace-Uno 16 Mb
|
||||||
|
|
||||||
|
# tool for firmware update
|
||||||
|
aceUno16Mb.upload.tool=elbear_uploader
|
||||||
|
aceUno16Mb.upload.protocol=elbear_uploader
|
||||||
|
aceUno16Mb.upload.maximum_size=16777216
|
||||||
|
aceUno16Mb.upload.maximum_data_size=16384
|
||||||
|
|
||||||
|
# tool for bootloader update
|
||||||
|
aceUno16Mb.bootloader.tool=mik32_upload
|
||||||
|
aceUno16Mb.bootloader.tool.default=mik32_upload
|
||||||
|
aceUno16Mb.bootloader.file=ace-uno/bootloader.hex
|
||||||
|
|
||||||
|
# build options
|
||||||
|
aceUno16Mb.build.mcu=MIK32_Amur
|
||||||
|
aceUno16Mb.build.f_cpu=32000000UL
|
||||||
|
aceUno16Mb.build.board=ACE_UNO_16MB
|
||||||
|
aceUno16Mb.build.core=arduino
|
||||||
|
aceUno16Mb.build.variant=standart
|
||||||
|
aceUno16Mb.build.extra_flags=
|
||||||
|
aceUno16Mb.build.flags=
|
||||||
|
|
||||||
|
|
||||||
|
##################### Ace-Uno 32 Mb #####################
|
||||||
|
aceUno32Mb.name=Elbear Ace-Uno 32 Mb
|
||||||
|
|
||||||
|
# tool for firmware update
|
||||||
|
aceUno32Mb.upload.tool=elbear_uploader
|
||||||
|
aceUno32Mb.upload.protocol=elbear_uploader
|
||||||
|
aceUno32Mb.upload.maximum_size=33554432
|
||||||
|
aceUno32Mb.upload.maximum_data_size=16384
|
||||||
|
|
||||||
|
# tool for bootloader update
|
||||||
|
aceUno32Mb.bootloader.tool=mik32_upload
|
||||||
|
aceUno32Mb.bootloader.tool.default=mik32_upload
|
||||||
|
aceUno32Mb.bootloader.file=ace-uno/bootloader.hex
|
||||||
|
|
||||||
|
# build options
|
||||||
|
aceUno32Mb.build.mcu=MIK32_Amur
|
||||||
|
aceUno32Mb.build.f_cpu=32000000UL
|
||||||
|
aceUno32Mb.build.board=ACE_UNO_32MB
|
||||||
|
aceUno32Mb.build.core=arduino
|
||||||
|
aceUno32Mb.build.variant=standart
|
||||||
|
aceUno32Mb.build.extra_flags=
|
||||||
|
aceUno32Mb.build.flags=
|
||||||
@@ -35,11 +35,6 @@
|
|||||||
|
|
||||||
#include "wiring.h"
|
#include "wiring.h"
|
||||||
|
|
||||||
// define из avr-gcc (некоторые библиотеки ардуины им пользуются)
|
|
||||||
#define _BV(bit) (1 << (bit))
|
|
||||||
|
|
||||||
// void ErrorMsgHandler(const char * msg);
|
|
||||||
|
|
||||||
/* sketch */
|
/* sketch */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|||||||
@@ -6,8 +6,13 @@
|
|||||||
#include <uart_lib.h>
|
#include <uart_lib.h>
|
||||||
#include "mik32_hal_irq.h"
|
#include "mik32_hal_irq.h"
|
||||||
|
|
||||||
// объект класса HardwareSerial для использования в arduino ide
|
|
||||||
HardwareSerial Serial;
|
// HardwareSerial class objects for use in Arduino IDE
|
||||||
|
HardwareSerial Serial(0);
|
||||||
|
#if SERIAL_PORT_QTY > 1
|
||||||
|
HardwareSerial Serial1(1);
|
||||||
|
#endif
|
||||||
|
|
||||||
void serialEvent() __attribute__((weak));
|
void serialEvent() __attribute__((weak));
|
||||||
bool Serial0_available() __attribute__((weak));
|
bool Serial0_available() __attribute__((weak));
|
||||||
|
|
||||||
@@ -55,35 +60,46 @@ void HardwareSerial::begin(unsigned long baud, uint8_t config)
|
|||||||
reg2config |= UART_CONTROL2_STOP_1_M;
|
reg2config |= UART_CONTROL2_STOP_1_M;
|
||||||
|
|
||||||
// turn on the receiver and transmitter, apply the parsed config
|
// turn on the receiver and transmitter, apply the parsed config
|
||||||
UART_Init(UART_0, brr, reg1config, reg2config, reg3config);
|
if (uartNum == 0)
|
||||||
// Enable level-based interrupts for the EPIC_UART_0 line, we have only receive interrupt enabled
|
{
|
||||||
HAL_EPIC_MaskLevelSet(HAL_EPIC_UART_0_MASK);
|
UART_Init(UART_0, brr, reg1config, reg2config, reg3config);
|
||||||
|
// Enable level-based interrupts for the EPIC_UART_0 line, we have only receive interrupt enabled
|
||||||
isInited = true;
|
HAL_EPIC_MaskLevelSet(HAL_EPIC_UART_0_MASK);
|
||||||
|
isInited = true;
|
||||||
|
}
|
||||||
|
else if (uartNum == 1)
|
||||||
|
{
|
||||||
|
UART_Init(UART_1, brr, reg1config, reg2config, reg3config);
|
||||||
|
// Enable level-based interrupts for the EPIC_UART_1 line, we have only receive interrupt enabled
|
||||||
|
HAL_EPIC_MaskLevelSet(HAL_EPIC_UART_1_MASK);
|
||||||
|
isInited = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HardwareSerial::end()
|
void HardwareSerial::end()
|
||||||
{
|
{
|
||||||
if (isInited)
|
if (isInited)
|
||||||
{
|
{
|
||||||
// wait for the data to be sent if necessary
|
// deinit uart and disable uart interrupt
|
||||||
flush();
|
if (uartNum == 0)
|
||||||
|
{
|
||||||
// disable clock
|
// wait for the data to be sent if necessary
|
||||||
__HAL_PCC_UART_0_CLK_DISABLE();
|
UART_WaitDataTranferCompleteFlag(UART_0);
|
||||||
HAL_EPIC_MaskLevelClear(HAL_EPIC_UART_0_MASK);
|
UART_Deinit(UART_0);
|
||||||
|
HAL_EPIC_MaskLevelClear(HAL_EPIC_UART_0_MASK);
|
||||||
|
isInited = false;
|
||||||
|
}
|
||||||
|
else if (uartNum == 1)
|
||||||
|
{
|
||||||
|
// wait for the data to be sent if necessary
|
||||||
|
UART_WaitDataTranferCompleteFlag(UART_1);
|
||||||
|
UART_Deinit(UART_1);
|
||||||
|
HAL_EPIC_MaskLevelClear(HAL_EPIC_UART_1_MASK);
|
||||||
|
isInited = false;
|
||||||
|
}
|
||||||
|
|
||||||
// reconfigure pins to z state
|
|
||||||
GPIO_InitTypeDef GPIO_InitStruct;
|
|
||||||
memset(&GPIO_InitStruct, 0, sizeof(GPIO_InitStruct));
|
|
||||||
GPIO_InitStruct.Pin = (HAL_PinsTypeDef)(GPIO_PIN_5 | GPIO_PIN_6);
|
|
||||||
GPIO_InitStruct.Mode = HAL_GPIO_MODE_GPIO_INPUT;
|
|
||||||
GPIO_InitStruct.Pull = HAL_GPIO_PULL_NONE;
|
|
||||||
HAL_GPIO_Init(GPIO_0, &GPIO_InitStruct);
|
|
||||||
// reset buffer indices
|
// reset buffer indices
|
||||||
_rx_buffer_head = _rx_buffer_tail = 0;
|
_rx_buffer_head = _rx_buffer_tail = 0;
|
||||||
|
|
||||||
isInited = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,14 +117,19 @@ int HardwareSerial::availableForWrite(void)
|
|||||||
|
|
||||||
void HardwareSerial::rx_complete_irq(void)
|
void HardwareSerial::rx_complete_irq(void)
|
||||||
{
|
{
|
||||||
|
// which UART to use
|
||||||
|
UART_TypeDef* uart = UART_0;
|
||||||
|
if (uartNum == 1)
|
||||||
|
uart = UART_1;
|
||||||
|
|
||||||
// find next index in buffer with upper limit
|
// find next index in buffer with upper limit
|
||||||
uint8_t i = (uint8_t)(_rx_buffer_head + 1)%SERIAL_RX_BUFFER_SIZE;
|
uint8_t i = (uint8_t)(_rx_buffer_head + 1)%SERIAL_RX_BUFFER_SIZE;
|
||||||
unsigned char c;
|
unsigned char c;
|
||||||
// while there is something to receive, put the data into the buffer
|
// while there is something to receive, put the data into the buffer
|
||||||
// and edit the buffer index
|
// and edit the buffer index
|
||||||
while (!UART_IsRxFifoEmpty(UART_0))
|
while (!UART_IsRxFifoEmpty(uart))
|
||||||
{
|
{
|
||||||
c = UART_ReadByte(UART_0);
|
c = UART_ReadByte(uart);
|
||||||
if (i != _rx_buffer_tail)
|
if (i != _rx_buffer_tail)
|
||||||
{
|
{
|
||||||
// write if there is space in the buffer
|
// write if there is space in the buffer
|
||||||
@@ -119,9 +140,16 @@ void HardwareSerial::rx_complete_irq(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// wrapper for use in С-files
|
// wrapper for use in С-files
|
||||||
extern "C" void serial_handler_wrapper(void)
|
extern "C" void serial_handler_wrapper(uint8_t uartNumInt)
|
||||||
{
|
{
|
||||||
|
if (uartNumInt == 0)
|
||||||
|
{
|
||||||
Serial.rx_complete_irq();
|
Serial.rx_complete_irq();
|
||||||
|
}
|
||||||
|
else if ((uartNumInt == 1) && (SERIAL_PORT_QTY > 1))
|
||||||
|
{
|
||||||
|
Serial1.rx_complete_irq();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int HardwareSerial::peek(void)
|
int HardwareSerial::peek(void)
|
||||||
@@ -151,8 +179,16 @@ size_t HardwareSerial::write(uint8_t c)
|
|||||||
{
|
{
|
||||||
if (isInited)
|
if (isInited)
|
||||||
{
|
{
|
||||||
UART_WriteByte(UART_0, c);
|
if (uartNum == 0)
|
||||||
UART_WaitTransmission(UART_0);
|
{
|
||||||
|
UART_WriteByte(UART_0, c);
|
||||||
|
UART_WaitTransmission(UART_0);
|
||||||
|
}
|
||||||
|
else if (uartNum == 1)
|
||||||
|
{
|
||||||
|
UART_WriteByte(UART_1, c);
|
||||||
|
UART_WaitTransmission(UART_1);
|
||||||
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -181,6 +217,8 @@ size_t HardwareSerial::write(const uint8_t *buffer, size_t size)
|
|||||||
void HardwareSerial::flush()
|
void HardwareSerial::flush()
|
||||||
{
|
{
|
||||||
// wait for the data transfer complete
|
// wait for the data transfer complete
|
||||||
while((UART_0->FLAGS & UART_FLAGS_TC_M) == 0)
|
if (uartNum == 0)
|
||||||
;
|
UART_WaitDataTranferCompleteFlag(UART_0);
|
||||||
|
else if (uartNum == 1)
|
||||||
|
UART_WaitDataTranferCompleteFlag(UART_1);
|
||||||
}
|
}
|
||||||
@@ -27,6 +27,7 @@
|
|||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include "stdint.h"
|
#include "stdint.h"
|
||||||
#include "Stream.h"
|
#include "Stream.h"
|
||||||
|
#include "pins_arduino.h"
|
||||||
|
|
||||||
// Define constants and variables for buffering incoming serial data. We're
|
// Define constants and variables for buffering incoming serial data. We're
|
||||||
// using a ring buffer (I think), in which head is the index of the location
|
// using a ring buffer (I think), in which head is the index of the location
|
||||||
@@ -73,9 +74,14 @@ class HardwareSerial : public Stream
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
bool isInited = false;
|
bool isInited = false;
|
||||||
|
uint8_t uartNum;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
inline HardwareSerial(){};
|
inline HardwareSerial(uint8_t num)
|
||||||
|
{
|
||||||
|
// Set the UART to be used
|
||||||
|
uartNum = (num < SERIAL_PORT_QTY) ? num : 0; // UART0 by default
|
||||||
|
}
|
||||||
|
|
||||||
void begin(unsigned long baud) { begin(baud, SERIAL_8N1); }
|
void begin(unsigned long baud) { begin(baud, SERIAL_8N1); }
|
||||||
void begin(unsigned long, uint8_t);
|
void begin(unsigned long, uint8_t);
|
||||||
@@ -98,6 +104,10 @@ class HardwareSerial : public Stream
|
|||||||
};
|
};
|
||||||
|
|
||||||
extern HardwareSerial Serial;
|
extern HardwareSerial Serial;
|
||||||
|
#if SERIAL_PORT_QTY > 1
|
||||||
|
extern HardwareSerial Serial1;
|
||||||
|
#endif
|
||||||
|
|
||||||
extern void serialEventRun(void) __attribute__((weak));
|
extern void serialEventRun(void) __attribute__((weak));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -53,7 +53,6 @@ size_t Print::print(const __FlashStringHelper *ifsh)
|
|||||||
else break;
|
else break;
|
||||||
}
|
}
|
||||||
return n;
|
return n;
|
||||||
// return print(reinterpret_cast<const char *>(ifsh));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t Print::print(const String &s)
|
size_t Print::print(const String &s)
|
||||||
|
|||||||
@@ -425,6 +425,7 @@ HAL_StatusTypeDef HAL_SPI_Exchange(SPI_HandleTypeDef *hspi, uint8_t TransmitByte
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return error_code;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
__HAL_SPI_DISABLE(hspi);
|
__HAL_SPI_DISABLE(hspi);
|
||||||
@@ -544,6 +545,7 @@ HAL_StatusTypeDef HAL_SPI_ExchangeThreshold(SPI_HandleTypeDef *hspi, uint8_t Tra
|
|||||||
tx_counter = 0;
|
tx_counter = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return error_code;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
__HAL_SPI_DISABLE(hspi);
|
__HAL_SPI_DISABLE(hspi);
|
||||||
|
|||||||
@@ -64,6 +64,21 @@ bool UART_Init(UART_TypeDef* uart,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UART_Deinit(UART_TypeDef* uart)
|
||||||
|
{
|
||||||
|
if (uart == UART_0)
|
||||||
|
{
|
||||||
|
__HAL_PCC_UART_0_CLK_DISABLE();
|
||||||
|
// reconfigure pins to z state
|
||||||
|
HAL_GPIO_PinConfig(GPIO_0, GPIO_PIN_5 | GPIO_PIN_6, HAL_GPIO_MODE_GPIO_INPUT, HAL_GPIO_PULL_NONE, HAL_GPIO_DS_2MA);
|
||||||
|
}
|
||||||
|
else if (uart == UART_1)
|
||||||
|
{
|
||||||
|
__HAL_PCC_UART_1_CLK_DISABLE();
|
||||||
|
// reconfigure pins to z state
|
||||||
|
HAL_GPIO_PinConfig(GPIO_1, GPIO_PIN_8 | GPIO_PIN_9, HAL_GPIO_MODE_GPIO_INPUT, HAL_GPIO_PULL_NONE, HAL_GPIO_DS_2MA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool UART_IsTransmissionFinished(UART_TypeDef* uart)
|
bool UART_IsTransmissionFinished(UART_TypeDef* uart)
|
||||||
{
|
{
|
||||||
@@ -78,6 +93,14 @@ bool UART_IsTransmissionFinished(UART_TypeDef* uart)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UART_WaitDataTranferCompleteFlag(UART_TypeDef* uart)
|
||||||
|
{
|
||||||
|
// с этим флагом есть какая-то доп задержка в стоп-битах длиной почти с бит,
|
||||||
|
// но можно отслеживать полное завершение отправки посылки
|
||||||
|
while((uart->FLAGS & UART_FLAGS_TC_M) == 0)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
void UART_WaitTransmission(UART_TypeDef* uart)
|
void UART_WaitTransmission(UART_TypeDef* uart)
|
||||||
{
|
{
|
||||||
while (!UART_IsTransmissionFinished(uart)) ;
|
while (!UART_IsTransmissionFinished(uart)) ;
|
||||||
|
|||||||
@@ -38,6 +38,16 @@ bool UART_Init(UART_TypeDef* uart, uint32_t divider,
|
|||||||
uint32_t control1, uint32_t control2, uint32_t control3
|
uint32_t control1, uint32_t control2, uint32_t control3
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/** Деинициализирует контроллер USART
|
||||||
|
|
||||||
|
Функция отключает тактирование модуля и перенастраивает
|
||||||
|
используемые для модуля выводы портов
|
||||||
|
|
||||||
|
\param uart указатель для доступа к UART
|
||||||
|
|
||||||
|
*/
|
||||||
|
void UART_Deinit(UART_TypeDef* uart);
|
||||||
|
|
||||||
|
|
||||||
/** Определяет, активен ли передатчик модуля
|
/** Определяет, активен ли передатчик модуля
|
||||||
|
|
||||||
@@ -54,6 +64,11 @@ bool UART_IsTransmissionFinished(UART_TypeDef* uart);
|
|||||||
*/
|
*/
|
||||||
void UART_WaitTransmission(UART_TypeDef* uart);
|
void UART_WaitTransmission(UART_TypeDef* uart);
|
||||||
|
|
||||||
|
/** Ожидает, пока модуль полностью завершит передачу
|
||||||
|
|
||||||
|
\param uart указатель для доступа к UART
|
||||||
|
*/
|
||||||
|
void UART_WaitDataTranferCompleteFlag(UART_TypeDef* uart);
|
||||||
|
|
||||||
/** Ожидает, пока модуль примет данные
|
/** Ожидает, пока модуль примет данные
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#include "mik32_hal_irq.h"
|
#include "mik32_hal_irq.h"
|
||||||
|
|
||||||
// isr functions
|
// isr functions
|
||||||
extern void serial_handler_wrapper(void);
|
extern void serial_handler_wrapper(uint8_t uartNumInt);
|
||||||
extern void gpio_interrupts_handler(void);
|
extern void gpio_interrupts_handler(void);
|
||||||
extern void tone_interrupt_handler(void);
|
extern void tone_interrupt_handler(void);
|
||||||
void __attribute__((weak)) wire_handler_wrapper(void)
|
void __attribute__((weak)) wire_handler_wrapper(void)
|
||||||
@@ -16,9 +16,13 @@ void trap_handler(void)
|
|||||||
if (EPIC_CHECK_TIMER16_1())
|
if (EPIC_CHECK_TIMER16_1())
|
||||||
tone_interrupt_handler();
|
tone_interrupt_handler();
|
||||||
|
|
||||||
// uart interrupt
|
// uart0 interrupt
|
||||||
if (EPIC_CHECK_UART_0())
|
if (EPIC_CHECK_UART_0())
|
||||||
serial_handler_wrapper();
|
serial_handler_wrapper(0);
|
||||||
|
|
||||||
|
// uart1 interrupt
|
||||||
|
if (EPIC_CHECK_UART_1())
|
||||||
|
serial_handler_wrapper(1);
|
||||||
|
|
||||||
// gpio interrupt
|
// gpio interrupt
|
||||||
if (EPIC_CHECK_GPIO_IRQ())
|
if (EPIC_CHECK_GPIO_IRQ())
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include "wiring_private.h"
|
||||||
|
|
||||||
#define HIGH 0x1
|
#define HIGH 0x1
|
||||||
#define LOW 0x0
|
#define LOW 0x0
|
||||||
@@ -80,7 +81,8 @@ enum BitOrder
|
|||||||
#define sq(x) ((x)*(x))
|
#define sq(x) ((x)*(x))
|
||||||
|
|
||||||
// Bits and Bytes
|
// Bits and Bytes
|
||||||
#define bit(b) (1UL << (b))
|
#define _BV(bit) (1 << (bit)) // from avr-gcc (some arduino libs uses it)
|
||||||
|
#define bit(b) (1UL << (b))
|
||||||
#define lowByte(w) ((uint8_t) ((w) & 0xff))
|
#define lowByte(w) ((uint8_t) ((w) & 0xff))
|
||||||
#define highByte(w) ((uint8_t) ((w) >> 8))
|
#define highByte(w) ((uint8_t) ((w) >> 8))
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,8 @@
|
|||||||
extern "C"{
|
extern "C"{
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// available interrupts number
|
||||||
|
#define EXTERNAL_NUM_INTERRUPTS 7
|
||||||
|
|
||||||
typedef void (*voidFuncPtr)(void);
|
typedef void (*voidFuncPtr)(void);
|
||||||
|
|
||||||
|
|||||||
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
After Width: | Height: | Size: 79 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 87 KiB |
|
After Width: | Height: | Size: 61 KiB |
@@ -1,4 +1,5 @@
|
|||||||
#include "SPI.h"
|
#include "SPI.h"
|
||||||
|
#include "mik32_hal_spi.h"
|
||||||
|
|
||||||
SPI_HandleTypeDef hspi;
|
SPI_HandleTypeDef hspi;
|
||||||
bool newConfig = false;
|
bool newConfig = false;
|
||||||
@@ -204,7 +205,7 @@ uint8_t SPIClass::transfer(uint8_t data)
|
|||||||
data = reverse_bits(data);
|
data = reverse_bits(data);
|
||||||
|
|
||||||
// send and recieve data
|
// send and recieve data
|
||||||
HAL_StatusTypeDef SPI_Status = exchange(&hspi, &data, &rxByte, 1, SPI_TIMEOUT_DEFAULT*2);
|
HAL_StatusTypeDef SPI_Status = HAL_SPI_Exchange(&hspi, &data, &rxByte, 1, SPI_TIMEOUT_DEFAULT*2);
|
||||||
if (SPI_Status != HAL_OK)
|
if (SPI_Status != HAL_OK)
|
||||||
HAL_SPI_ClearError(&hspi);
|
HAL_SPI_ClearError(&hspi);
|
||||||
|
|
||||||
@@ -236,7 +237,7 @@ uint16_t SPIClass::transfer16(uint16_t data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// send and recieve data
|
// send and recieve data
|
||||||
HAL_StatusTypeDef SPI_Status = exchange(&hspi, buf, buf, 2, SPI_TIMEOUT_DEFAULT*2);
|
HAL_StatusTypeDef SPI_Status = HAL_SPI_Exchange(&hspi, buf, buf, 2, SPI_TIMEOUT_DEFAULT*2);
|
||||||
if (SPI_Status != HAL_OK)
|
if (SPI_Status != HAL_OK)
|
||||||
HAL_SPI_ClearError(&hspi);
|
HAL_SPI_ClearError(&hspi);
|
||||||
|
|
||||||
@@ -267,7 +268,7 @@ void SPIClass::transfer(void *buf, size_t count)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// send and recieve data using the same buffer
|
// send and recieve data using the same buffer
|
||||||
HAL_StatusTypeDef SPI_Status = exchange(&hspi, (uint8_t*)buf, (uint8_t*)buf, count, SPI_TIMEOUT_DEFAULT*2);
|
HAL_StatusTypeDef SPI_Status = HAL_SPI_Exchange(&hspi, (uint8_t*)buf, (uint8_t*)buf, count, SPI_TIMEOUT_DEFAULT*2);
|
||||||
if (SPI_Status != HAL_OK)
|
if (SPI_Status != HAL_OK)
|
||||||
HAL_SPI_ClearError(&hspi);
|
HAL_SPI_ClearError(&hspi);
|
||||||
|
|
||||||
@@ -329,70 +330,10 @@ void SPIClass::setClockDivider(uint8_t clockDiv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HAL_StatusTypeDef SPIClass::exchange(SPI_HandleTypeDef *hspi, uint8_t TransmitBytes[], uint8_t ReceiveBytes[], uint32_t DataSize, uint32_t Timeout)
|
|
||||||
{
|
|
||||||
uint32_t txallowed = 1;
|
|
||||||
HAL_StatusTypeDef error_code = HAL_OK;
|
|
||||||
uint32_t timeout_counter = 0;
|
|
||||||
|
|
||||||
hspi->ErrorCode = HAL_SPI_ERROR_NONE;
|
|
||||||
hspi->pRxBuffPtr = (uint8_t *)ReceiveBytes;
|
|
||||||
hspi->RxCount = DataSize;
|
|
||||||
hspi->pTxBuffPtr = (uint8_t *)TransmitBytes;
|
|
||||||
hspi->TxCount = DataSize;
|
|
||||||
|
|
||||||
hspi->Instance->TX_THR = 1;
|
|
||||||
|
|
||||||
/* Включить SPI если выключено */
|
|
||||||
if (!(hspi->Instance->ENABLE & SPI_ENABLE_M))
|
|
||||||
{
|
|
||||||
__HAL_SPI_ENABLE(hspi);
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((hspi->TxCount > 0) || (hspi->RxCount > 0))
|
|
||||||
{
|
|
||||||
/* Проверка флага TX_FIFO_NOT_FULL */
|
|
||||||
if ((hspi->Instance->INT_STATUS & SPI_INT_STATUS_TX_FIFO_NOT_FULL_M) && (hspi->TxCount > 0) && (txallowed == 1))
|
|
||||||
{
|
|
||||||
hspi->Instance->TXDATA = *(hspi->pTxBuffPtr);
|
|
||||||
hspi->pTxBuffPtr++;
|
|
||||||
hspi->TxCount--;
|
|
||||||
/* Следующие данные - прием (Rx). Tx не разрешен */
|
|
||||||
txallowed = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Ожидание когда установится флаг RX_FIFO_NOT_EMPTY */
|
|
||||||
if ((hspi->Instance->INT_STATUS & SPI_INT_STATUS_RX_FIFO_NOT_EMPTY_M) && (hspi->RxCount > 0))
|
|
||||||
{
|
|
||||||
*(hspi->pRxBuffPtr) = hspi->Instance->RXDATA;
|
|
||||||
hspi->pRxBuffPtr++;
|
|
||||||
hspi->RxCount--;
|
|
||||||
/* Следующие данные - передача (Tx). Tx разрешается */
|
|
||||||
txallowed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (((timeout_counter++) >= Timeout) || (Timeout == 0U))
|
|
||||||
{
|
|
||||||
error_code = HAL_TIMEOUT;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return error_code;
|
|
||||||
|
|
||||||
error:
|
|
||||||
__HAL_SPI_DISABLE(hspi);
|
|
||||||
hspi->Instance->ENABLE |= SPI_ENABLE_CLEAR_TX_FIFO_M | SPI_ENABLE_CLEAR_RX_FIFO_M; /* Очистка буферов RX и TX */
|
|
||||||
volatile uint32_t unused = hspi->Instance->INT_STATUS; /* Очистка флагов ошибок чтением */
|
|
||||||
(void) unused;
|
|
||||||
|
|
||||||
|
|
||||||
return error_code;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint8_t reverse_bits(uint8_t byte)
|
static uint8_t reverse_bits(uint8_t byte)
|
||||||
{
|
{
|
||||||
byte = (byte & 0xF0) >> 4 | (byte & 0x0F) << 4;
|
byte = (byte & 0xF0) >> 4 | (byte & 0x0F) << 4;
|
||||||
byte = (byte & 0xCC) >> 2 | (byte & 0x33) << 2;
|
byte = (byte & 0xCC) >> 2 | (byte & 0x33) << 2;
|
||||||
byte = (byte & 0xAA) >> 1 | (byte & 0x55) << 1;
|
byte = (byte & 0xAA) >> 1 | (byte & 0x55) << 1;
|
||||||
return byte;
|
return byte;
|
||||||
}
|
}
|
||||||
@@ -15,7 +15,6 @@
|
|||||||
#define _SPI_H_INCLUDED
|
#define _SPI_H_INCLUDED
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "mik32_hal_spi.h"
|
|
||||||
|
|
||||||
// SPI_HAS_TRANSACTION means SPI has beginTransaction(), endTransaction(),
|
// SPI_HAS_TRANSACTION means SPI has beginTransaction(), endTransaction(),
|
||||||
// usingInterrupt(), and SPISetting(clock, bitOrder, dataMode)
|
// usingInterrupt(), and SPISetting(clock, bitOrder, dataMode)
|
||||||
@@ -121,9 +120,6 @@ public:
|
|||||||
// This function is deprecated. New applications should use
|
// This function is deprecated. New applications should use
|
||||||
// beginTransaction() to configure SPI settings.
|
// beginTransaction() to configure SPI settings.
|
||||||
void setClockDivider(uint8_t clockDiv);
|
void setClockDivider(uint8_t clockDiv);
|
||||||
|
|
||||||
// A temporary function until this error is fixed in the HAL library
|
|
||||||
HAL_StatusTypeDef exchange(SPI_HandleTypeDef *hspi, uint8_t TransmitBytes[], uint8_t ReceiveBytes[], uint32_t DataSize, uint32_t Timeout);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern SPIClass SPI;
|
extern SPIClass SPI;
|
||||||
|
|||||||
@@ -23,13 +23,14 @@
|
|||||||
#ifndef Pins_Arduino_h
|
#ifndef Pins_Arduino_h
|
||||||
#define Pins_Arduino_h
|
#define Pins_Arduino_h
|
||||||
|
|
||||||
|
#include "wiring_constants.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "mik32_hal_gpio.h"
|
#include "mik32_hal_gpio.h"
|
||||||
#include "mik32_hal_timer32.h"
|
#include "mik32_hal_timer32.h"
|
||||||
#include "wiring_constants.h"
|
|
||||||
|
|
||||||
extern bool spiNssPinIsBlocked;
|
extern bool spiNssPinIsBlocked;
|
||||||
|
|
||||||
@@ -63,9 +64,13 @@ HAL_PinsTypeDef digitalPinToBitMask(uint32_t digPinNumber);
|
|||||||
// total number of pins available for initialization
|
// total number of pins available for initialization
|
||||||
uint16_t pinCommonQty(void);
|
uint16_t pinCommonQty(void);
|
||||||
// the function returns a reference to the OUTPUT address of the GPIO register
|
// the function returns a reference to the OUTPUT address of the GPIO register
|
||||||
uint32_t* portOutputRegister(GPIO_TypeDef* GPIO_x);
|
volatile uint32_t* portOutputRegister(GPIO_TypeDef* GPIO_x);
|
||||||
// the function returns a reference to the STATE address of the GPIO register
|
// the function returns a reference to the STATE address of the GPIO register
|
||||||
uint32_t* portInputRegister(GPIO_TypeDef* GPIO_x);
|
volatile uint32_t* portInputRegister(GPIO_TypeDef* GPIO_x);
|
||||||
|
|
||||||
|
// UART
|
||||||
|
// available uarts quantity
|
||||||
|
#define SERIAL_PORT_QTY 2
|
||||||
|
|
||||||
// ADC
|
// ADC
|
||||||
// determines the ADC channel number by the board pin number
|
// determines the ADC channel number by the board pin number
|
||||||
@@ -110,7 +115,6 @@ static const uint8_t SCL = PIN_WIRE_SCL;
|
|||||||
#define WIRE_FREQ_1000K 1000000
|
#define WIRE_FREQ_1000K 1000000
|
||||||
|
|
||||||
// interrupts
|
// interrupts
|
||||||
#define EXTERNAL_NUM_INTERRUPTS 7
|
|
||||||
// determines the board pin number by interrupt number
|
// determines the board pin number by interrupt number
|
||||||
uint32_t interruptToDigitalPin(uint8_t interruptNum);
|
uint32_t interruptToDigitalPin(uint8_t interruptNum);
|
||||||
// determines interrupt number by the board pin number
|
// determines interrupt number by the board pin number
|
||||||
|
|||||||
@@ -95,24 +95,24 @@ uint16_t pinCommonQty(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// the function returns a reference to the OUTPUT address of the GPIO register
|
// the function returns a reference to the OUTPUT address of the GPIO register
|
||||||
uint32_t* portOutputRegister(GPIO_TypeDef* GPIO_x)
|
volatile uint32_t* portOutputRegister(GPIO_TypeDef* GPIO_x)
|
||||||
{
|
{
|
||||||
return &GPIO_x->OUTPUT_;
|
return &GPIO_x->OUTPUT_;
|
||||||
}
|
}
|
||||||
|
|
||||||
// the function returns a reference to the STATE address of the GPIO register
|
// the function returns a reference to the STATE address of the GPIO register
|
||||||
uint32_t* portInputRegister(GPIO_TypeDef* GPIO_x)
|
volatile uint32_t* portInputRegister(GPIO_TypeDef* GPIO_x)
|
||||||
{
|
{
|
||||||
return &GPIO_x->STATE;
|
return &GPIO_x->STATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------- АЦП ---------------------- //
|
// ---------------------- ADC ---------------------- //
|
||||||
// determines the ADC channel number by the board pin number
|
// determines the ADC channel number by the board pin number
|
||||||
uint32_t analogInputToChannelNumber(uint32_t PinNumber)
|
uint32_t analogInputToChannelNumber(uint32_t PinNumber)
|
||||||
{
|
{
|
||||||
uint32_t adcChannel = 0;
|
uint32_t adcChannel = 0;
|
||||||
|
|
||||||
// if passed a value from 0 - 5, instead of A0 - A5
|
// if get a value 0...5 instead of A0...A5
|
||||||
if (PinNumber < 4) PinNumber += 14;
|
if (PinNumber < 4) PinNumber += 14;
|
||||||
else if (PinNumber < 6) PinNumber += 16;
|
else if (PinNumber < 6) PinNumber += 16;
|
||||||
|
|
||||||
|
|||||||