Обновление до версии 0.3.0
- обновлен elbear_fw_bootloader - добавлена проверка контрольной суммы каждой строки hex файла. - в модуль работы с АЦП добавлена функция analogReadResolution(). Функция analogRead() теперь возвращает усредненное по 10 измерениям значение. - общая функция обработки прерываний перенесена в память RAM. Обработчики прерываний модулей External Interrupts и Advanced I/O (функция tone()) так же перенесены в память RAM для увеличения скорости выполнения кода. - в пакет добавлены библиотеки EEPROM, Servo, SoftSerial, NeoPixel, MFRC522 адаптированные для работы с платой Elbear Ace-Uno. - добавлено описание особенностей работы с пакетом
This commit was merged in pull request #6.
This commit is contained in:
1 parent
7a7c552743
commit
766b7b32ea
114 files changed
+11064
-666
No files matched your search
@@ -7,7 +7,7 @@ extern "C" {
|
||||
|
||||
#include "mik32_hal_def.h"
|
||||
#include <mcu32_memory_map.h>
|
||||
#include <eeprom.h>
|
||||
#include <eeprom_def.h>
|
||||
#include <power_manager.h>
|
||||
|
||||
#ifndef HAL_EEPROM_TIMEOUT
|
||||
|
||||
@@ -375,14 +375,96 @@ typedef enum __HAL_GPIO_InterruptMode
|
||||
|
||||
HAL_StatusTypeDef HAL_GPIO_Init(GPIO_TypeDef *GPIO_x, GPIO_InitTypeDef *GPIO_Init);
|
||||
HAL_StatusTypeDef HAL_GPIO_PinConfig(GPIO_TypeDef *GPIO_x, HAL_PinsTypeDef pin, HAL_GPIO_ModeTypeDef mode, HAL_GPIO_PullTypeDef pull, HAL_GPIO_DSTypeDef driveStrength);
|
||||
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIO_x, HAL_PinsTypeDef pin);
|
||||
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIO_x, HAL_PinsTypeDef pin, GPIO_PinState pinState);
|
||||
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIO_x, HAL_PinsTypeDef pin);
|
||||
HAL_StatusTypeDef HAL_GPIO_InitInterruptLine(HAL_GPIO_Line_Config mux, HAL_GPIO_InterruptMode mode);
|
||||
HAL_StatusTypeDef HAL_GPIO_DeInitInterruptLine(HAL_GPIO_Line irqLine);
|
||||
uint32_t HAL_GPIO_LineInterruptState(HAL_GPIO_Line irqLine);
|
||||
GPIO_PinState HAL_GPIO_LinePinState(HAL_GPIO_Line irqLine);
|
||||
void HAL_GPIO_ClearInterrupts();
|
||||
|
||||
/**
|
||||
* @brief Считать текущее состояние выводов порта GPIO_x.
|
||||
* @param GPIO_x порт GPIO_x, где x может быть (0, 1, 2).
|
||||
* @param pin маска выводов порта GPIO_x, с которых считывание значение.
|
||||
* @return @ref GPIO_PIN_HIGH если с одного или больше выводов, указанных в pin, считалась 1. Иначе @ref GPIO_PIN_LOW.
|
||||
*/
|
||||
static inline __attribute__((always_inline)) GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIO_x, HAL_PinsTypeDef pin)
|
||||
{
|
||||
if ((GPIO_x->SET & pin) != (uint32_t)GPIO_PIN_LOW)
|
||||
return GPIO_PIN_HIGH;
|
||||
else
|
||||
return GPIO_PIN_LOW;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Задать логический уровень выходного сигнала для указанных выводов порта GPIO_x.
|
||||
* @param GPIO_x порт GPIO_x, где x может быть (0, 1, 2).
|
||||
* @param pin маска выводов порта GPIO_x, к которым применяются указанные настройки.
|
||||
* @param pinState значение состояние вывода, в которое будут установлены указанные выводы.
|
||||
* Этот параметр должен быть одним из значений:
|
||||
* - @ref GPIO_PIN_LOW низкий выходной уровень
|
||||
* - @ref GPIO_PIN_HIGH высокий выходной уровень
|
||||
*/
|
||||
static inline __attribute__((always_inline)) void HAL_GPIO_WritePin(GPIO_TypeDef *GPIO_x, HAL_PinsTypeDef pin, GPIO_PinState pinState)
|
||||
{
|
||||
if (pinState == GPIO_PIN_LOW)
|
||||
GPIO_x->CLEAR = pin;
|
||||
else
|
||||
GPIO_x->SET = pin;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Переключить логический уровень выходного сигнала для указанных выводов порта GPIO_x.
|
||||
* @param GPIO_x порт GPIO_x, где x может быть (0, 1, 2).
|
||||
* @param pin маска выводов порта GPIO_x, к которым применяются указанные настройки.
|
||||
*/
|
||||
static inline __attribute__((always_inline)) void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIO_x, HAL_PinsTypeDef pin)
|
||||
{
|
||||
GPIO_x->OUTPUT_ ^= pin;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Возвращает направление вывода при работе в режиме вход/выход
|
||||
* @param GPIO_x порт GPIO_x, где x может быть (0, 1, 2).
|
||||
* @param pin маска вывода порта GPIO_x, направление которого необходимо узнать.
|
||||
* @return Возвращает направление вывода - input или output.
|
||||
*/
|
||||
static inline __attribute__((always_inline)) HAL_GPIO_ModeTypeDef HAL_GPIO_GetPinDirection(GPIO_TypeDef *GPIO_x, HAL_PinsTypeDef pin)
|
||||
{
|
||||
return (GPIO_x->DIRECTION_IN & pin) == 0 ? HAL_GPIO_MODE_GPIO_OUTPUT : HAL_GPIO_MODE_GPIO_INPUT;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Получить состояние линии прерывания.
|
||||
* @param irqLine номер линии прерывания.
|
||||
* @return Возвращает 1 если сработало прерывание данной линии, иначе 0.
|
||||
*/
|
||||
static inline __attribute__((always_inline)) uint32_t HAL_GPIO_LineInterruptState(HAL_GPIO_Line irqLine)
|
||||
{
|
||||
int irq_line_num = irqLine >> GPIO_IRQ_LINE_S;
|
||||
return (GPIO_IRQ->INTERRUPT & (1 << (irq_line_num))) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Функция чтения логического уровня вывода, подключенного к линии прерывания.
|
||||
* @param irqLine номер линии прерывания.
|
||||
* @return Логический уровень вывода.
|
||||
*/
|
||||
static inline __attribute__((always_inline)) GPIO_PinState HAL_GPIO_LinePinState(HAL_GPIO_Line irqLine)
|
||||
{
|
||||
int irq_line_num = irqLine >> GPIO_IRQ_LINE_S;
|
||||
return (GPIO_PinState)((GPIO_IRQ->STATE & (1 << (irq_line_num))) >> irq_line_num);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Функция сброса регистра состояния прерываний.
|
||||
* @note Когда срабатывает прерывание на одной из линии, в регистре INTERRUPT
|
||||
* выставляется 1 в разряде, соответствующем линии прерывания.
|
||||
* После обработки прерывания необходимо сбросить данный регистр
|
||||
* в обработчике прерывания trap_handler().
|
||||
* Если после обработки прерывания регистр не был сброшен,
|
||||
* обработчик будет вызван снова, программа будет бесконечно вызывать обработчик.
|
||||
*/
|
||||
static inline __attribute__((always_inline)) void HAL_GPIO_ClearInterrupts()
|
||||
{
|
||||
GPIO_IRQ->CLEAR = 0b11111111;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -380,9 +380,6 @@ typedef struct
|
||||
|
||||
|
||||
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c);
|
||||
void HAL_I2C_Disable(I2C_HandleTypeDef *hi2c);
|
||||
void HAL_I2C_Reset(I2C_HandleTypeDef *hi2c);
|
||||
void HAL_I2C_Enable(I2C_HandleTypeDef *hi2c);
|
||||
void HAL_I2C_AnalogFilterInit(I2C_HandleTypeDef *hi2c, HAL_I2C_AnalogFilterTypeDef AnalogFilter);
|
||||
void HAL_I2C_DigitalFilterInit(I2C_HandleTypeDef *hi2c, HAL_I2C_DigitalFilterTypeDef DigitalFilter);
|
||||
void HAL_I2C_SetClockSpeed(I2C_HandleTypeDef *hi2c);
|
||||
@@ -394,6 +391,7 @@ void HAL_I2C_SBCMode(I2C_HandleTypeDef *hi2c, HAL_I2C_SBCModeTypeDef SBCMode);
|
||||
void HAL_I2C_SlaveInit(I2C_HandleTypeDef *hi2c);
|
||||
void HAL_I2C_MasterInit(I2C_HandleTypeDef *hi2c);
|
||||
HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c);
|
||||
HAL_StatusTypeDef HAL_I2C_Deinit(I2C_HandleTypeDef *hi2c);
|
||||
void HAL_I2C_AutoEnd(I2C_HandleTypeDef *hi2c, HAL_I2C_AutoEndModeTypeDef AutoEnd);
|
||||
HAL_StatusTypeDef HAL_I2C_Master_WaitTXIS(I2C_HandleTypeDef *hi2c, uint32_t Timeout);
|
||||
HAL_StatusTypeDef HAL_I2C_Master_WaitRXNE(I2C_HandleTypeDef *hi2c, uint32_t Timeout);
|
||||
@@ -427,6 +425,60 @@ HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pDa
|
||||
HAL_StatusTypeDef HAL_I2C_Slave_Receive_NOSTRETCH_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t DataSize);
|
||||
HAL_StatusTypeDef HAL_I2C_Slave_ReceiveSBC_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t DataSize);
|
||||
|
||||
|
||||
static inline __attribute__((always_inline)) void HAL_I2C_Disable(I2C_HandleTypeDef *hi2c)
|
||||
{
|
||||
hi2c->Instance->CR1 &= ~I2C_CR1_PE_M;
|
||||
}
|
||||
|
||||
static inline __attribute__((always_inline)) void HAL_I2C_Reset(I2C_HandleTypeDef *hi2c)
|
||||
{
|
||||
hi2c->ErrorCode = I2C_ERROR_NONE;
|
||||
|
||||
hi2c->Instance->CR1 &= ~I2C_CR1_PE_M;
|
||||
hi2c->Instance->CR1 |= I2C_CR1_PE_M;
|
||||
}
|
||||
|
||||
static inline __attribute__((always_inline)) void HAL_I2C_Enable(I2C_HandleTypeDef *hi2c)
|
||||
{
|
||||
hi2c->Instance->CR1 |= I2C_CR1_PE_M;
|
||||
}
|
||||
|
||||
static inline __attribute__((always_inline)) void HAL_I2C_Reset_Interrupt_Flag(I2C_HandleTypeDef *hi2c, uint32_t mask)
|
||||
{
|
||||
hi2c->Instance->ICR |= mask;
|
||||
}
|
||||
|
||||
static inline __attribute__((always_inline)) void HAL_I2C_Reset_TXDR_Content(I2C_HandleTypeDef *hi2c)
|
||||
{
|
||||
hi2c->Instance->ISR |= I2C_ISR_TXE_M;
|
||||
}
|
||||
|
||||
static inline __attribute__((always_inline)) uint32_t HAL_I2C_Get_Interrupts_Status(I2C_HandleTypeDef *hi2c)
|
||||
{
|
||||
return hi2c->Instance->ISR;
|
||||
}
|
||||
|
||||
static inline __attribute__((always_inline)) uint32_t HAL_I2C_Get_CR1_Content(I2C_HandleTypeDef *hi2c)
|
||||
{
|
||||
return hi2c->Instance->CR1;
|
||||
}
|
||||
|
||||
static inline __attribute__((always_inline)) void HAL_I2C_Write_TXDR(I2C_HandleTypeDef *hi2c, uint8_t value)
|
||||
{
|
||||
hi2c->Instance->TXDR = value;
|
||||
}
|
||||
|
||||
static inline __attribute__((always_inline)) uint8_t HAL_I2C_Get_RXDR(I2C_HandleTypeDef *hi2c)
|
||||
{
|
||||
return hi2c->Instance->RXDR;
|
||||
}
|
||||
|
||||
static inline __attribute__((always_inline)) void HAL_I2C_Clear_Reload(I2C_HandleTypeDef *hi2c)
|
||||
{
|
||||
hi2c->Instance->CR2 &= ~I2C_CR2_RELOAD_M;
|
||||
}
|
||||
|
||||
static inline __attribute__((always_inline)) void HAL_I2C_ADDR_IRQ(I2C_HandleTypeDef *hi2c)
|
||||
{
|
||||
if (hi2c->Instance->CR1 & I2C_CR1_SBC_M)
|
||||
|
||||
@@ -253,7 +253,8 @@ void HAL_SPI_CS_Disable(SPI_HandleTypeDef *hspi);
|
||||
HAL_StatusTypeDef HAL_SPI_Exchange(SPI_HandleTypeDef *hspi, uint8_t TransmitBytes[], uint8_t ReceiveBytes[], uint32_t Size, uint32_t Timeout);
|
||||
HAL_StatusTypeDef HAL_SPI_ExchangeThreshold(SPI_HandleTypeDef *hspi, uint8_t TransmitBytes[], uint8_t ReceiveBytes[], uint32_t DataSize, uint32_t Timeout);
|
||||
HAL_StatusTypeDef HAL_SPI_Exchange_IT(SPI_HandleTypeDef *hspi, uint8_t TransmitBytes[], uint8_t ReceiveBytes[], uint32_t Size);
|
||||
|
||||
void HAL_SPI_Set_Clock_Divider(SPI_HandleTypeDef *hspi);
|
||||
void HAL_SPI_Set_Clock_Mode(SPI_HandleTypeDef *hspi);
|
||||
|
||||
/**
|
||||
* @brief Разрешить прерывания в соответствии с маской.
|
||||
|
||||
@@ -230,8 +230,6 @@ typedef struct __Timer16_HandleTypeDef
|
||||
|
||||
|
||||
void HAL_TIMER16_MspInit(Timer16_HandleTypeDef* htimer16);
|
||||
void HAL_Timer16_Disable(Timer16_HandleTypeDef *htimer16);
|
||||
void HAL_Timer16_Enable(Timer16_HandleTypeDef *htimer16);
|
||||
void HAL_Timer16_SetActiveEdge(Timer16_HandleTypeDef *htimer16, uint8_t ActiveEdge);
|
||||
void HAL_Timer16_SetSourceClock(Timer16_HandleTypeDef *htimer16, uint8_t SourceClock);
|
||||
void HAL_Timer16_SetCountMode(Timer16_HandleTypeDef *htimer16, uint8_t CountMode);
|
||||
@@ -278,6 +276,26 @@ void HAL_Timer16_SetInterruptARRM(Timer16_HandleTypeDef *htimer16);
|
||||
void HAL_Timer16_SetInterruptCMPM(Timer16_HandleTypeDef *htimer16);
|
||||
void HAL_Timer16_InterruptInit(Timer16_HandleTypeDef *htimer16);
|
||||
|
||||
/**
|
||||
* @brief Выключить таймер.
|
||||
* Может использоваться для отключения таймера или при записи в регистр CFGR.
|
||||
*
|
||||
* @param htimer16 Указатель на структуру с настройками Timer16.
|
||||
*/
|
||||
static inline void __attribute__((always_inline)) HAL_Timer16_Disable(Timer16_HandleTypeDef *htimer16)
|
||||
{
|
||||
htimer16->Instance->CR &= ~TIMER16_CR_ENABLE_M;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Включить таймер
|
||||
* @param htimer16 Указатель на структуру с настройками Timer16.
|
||||
*/
|
||||
static inline void __attribute__((always_inline)) HAL_Timer16_Enable(Timer16_HandleTypeDef *htimer16)
|
||||
{
|
||||
htimer16->Instance->CR |= TIMER16_CR_ENABLE_M;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Получить статус прерываний Timer16.
|
||||
* Функция возвращает статус прерываний в соответствии с маской разрешенный прерываний.
|
||||
@@ -291,6 +309,16 @@ static inline __attribute__((always_inline)) uint32_t HAL_Timer16_GetInterruptSt
|
||||
return interrupt_status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Получить статус прерывания по соответствию автозагрузке ARRM
|
||||
* @param htimer16 Указатель на структуру с настройками Timer16
|
||||
* @return Статус прерывания ARRM - true, если прерывание сработало
|
||||
*/
|
||||
static inline __attribute__((always_inline)) bool HAL_Timer16_GetInterruptStatus_ARRM(Timer16_HandleTypeDef *htimer16)
|
||||
{
|
||||
return (bool)((htimer16->Instance->ISR & htimer16->Instance->IER) & TIMER16_ISR_ARR_MATCH_M);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Очистить флаг прерывания.
|
||||
* @param htimer16 Указатель на структуру с настройками Timer16.
|
||||
|
||||
@@ -226,6 +226,7 @@ static inline __attribute__((always_inline)) HAL_StatusTypeDef HAL_Timer32_WaitF
|
||||
void HAL_TIMER32_MspInit(TIMER32_HandleTypeDef* htimer32);
|
||||
void HAL_TIMER32_Channel_MspInit(TIMER32_CHANNEL_HandleTypeDef* timerChannel);
|
||||
HAL_StatusTypeDef HAL_Timer32_Init(TIMER32_HandleTypeDef *timer);
|
||||
HAL_StatusTypeDef HAL_Timer32_Deinit(TIMER32_HandleTypeDef *timer);
|
||||
void HAL_Timer32_State_Set(TIMER32_HandleTypeDef *timer, HAL_TIMER32_StateTypeDef state);
|
||||
void HAL_Timer32_Top_Set(TIMER32_HandleTypeDef *timer, uint32_t top);
|
||||
void HAL_Timer32_Prescaler_Set(TIMER32_HandleTypeDef *timer, uint32_t prescaler);
|
||||
|
||||
@@ -93,58 +93,6 @@ HAL_StatusTypeDef HAL_GPIO_PinConfig(GPIO_TypeDef *GPIO_x, HAL_PinsTypeDef pin,
|
||||
return HAL_GPIO_Init(GPIO_x, &GPIO_InitStruct);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Считать текущее состояние выводов порта GPIO_x.
|
||||
* @param GPIO_x порт GPIO_x, где x может быть (0, 1, 2).
|
||||
* @param pin маска выводов порта GPIO_x, с которых считывание значение.
|
||||
* @return @ref GPIO_PIN_HIGH если с одного или больше выводов, указанных в pin, считалась 1. Иначе @ref GPIO_PIN_LOW.
|
||||
*/
|
||||
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIO_x, HAL_PinsTypeDef pin)
|
||||
{
|
||||
GPIO_PinState bitStatus;
|
||||
|
||||
if ((GPIO_x->SET & pin) != (uint32_t)GPIO_PIN_LOW)
|
||||
{
|
||||
bitStatus = GPIO_PIN_HIGH;
|
||||
}
|
||||
else
|
||||
{
|
||||
bitStatus = GPIO_PIN_LOW;
|
||||
}
|
||||
return bitStatus;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Задать логический уровень выходного сигнала для указанных выводов порта GPIO_x.
|
||||
* @param GPIO_x порт GPIO_x, где x может быть (0, 1, 2).
|
||||
* @param pin маска выводов порта GPIO_x, к которым применяются указанные настройки.
|
||||
* @param pinState значение состояние вывода, в которое будут установлены указанные выводы.
|
||||
* Этот параметр должен быть одним из значений:
|
||||
* - @ref GPIO_PIN_LOW низкий выходной уровень
|
||||
* - @ref GPIO_PIN_HIGH высокий выходной уровень
|
||||
*/
|
||||
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIO_x, HAL_PinsTypeDef pin, GPIO_PinState pinState)
|
||||
{
|
||||
if (pinState == GPIO_PIN_LOW)
|
||||
{
|
||||
GPIO_x->CLEAR = pin;
|
||||
}
|
||||
else
|
||||
{
|
||||
GPIO_x->SET = pin;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Переключить логический уровень выходного сигнала для указанных выводов порта GPIO_x.
|
||||
* @param GPIO_x порт GPIO_x, где x может быть (0, 1, 2).
|
||||
* @param pin маска выводов порта GPIO_x, к которым применяются указанные настройки.
|
||||
*/
|
||||
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIO_x, HAL_PinsTypeDef pin)
|
||||
{
|
||||
GPIO_x->OUTPUT_ ^= pin;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Функция инициализации линии прерывания.
|
||||
* \param mux настройка мультиплексора линии прерывания.
|
||||
@@ -222,39 +170,3 @@ HAL_StatusTypeDef HAL_GPIO_DeInitInterruptLine(HAL_GPIO_Line irqLine)
|
||||
|
||||
return HAL_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Получить состояние линии прерывания.
|
||||
* @param irqLine номер линии прерывания.
|
||||
* @return Возвращает 1 если сработало прерывание данной линии, иначе 0.
|
||||
*/
|
||||
uint32_t HAL_GPIO_LineInterruptState(HAL_GPIO_Line irqLine)
|
||||
{
|
||||
int irq_line_num = irqLine >> GPIO_IRQ_LINE_S;
|
||||
return (GPIO_IRQ->INTERRUPT & (1 << (irq_line_num))) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Функция чтения логического уровня вывода, подключенного к линии прерывания.
|
||||
* @param irqLine номер линии прерывания.
|
||||
* @return Логический уровень вывода.
|
||||
*/
|
||||
GPIO_PinState HAL_GPIO_LinePinState(HAL_GPIO_Line irqLine)
|
||||
{
|
||||
int irq_line_num = irqLine >> GPIO_IRQ_LINE_S;
|
||||
return (GPIO_PinState)((GPIO_IRQ->STATE & (1 << (irq_line_num))) >> irq_line_num);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Функция сброса регистра состояния прерываний.
|
||||
* @note Когда срабатывает прерывание на одной из линии, в регистре INTERRUPT
|
||||
* выставляется 1 в разряде, соответствующем линии прерывания.
|
||||
* После обработки прерывания необходимо сбросить данный регистр
|
||||
* в обработчике прерывания trap_handler().
|
||||
* Если после обработки прерывания регистр не был сброшен,
|
||||
* обработчик будет вызван снова, программа будет бесконечно вызывать обработчик.
|
||||
*/
|
||||
void HAL_GPIO_ClearInterrupts()
|
||||
{
|
||||
GPIO_IRQ->CLEAR = 0b11111111;
|
||||
}
|
||||
@@ -26,24 +26,6 @@ __attribute__((weak)) void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
|
||||
|
||||
}
|
||||
|
||||
void HAL_I2C_Disable(I2C_HandleTypeDef *hi2c)
|
||||
{
|
||||
hi2c->Instance->CR1 &= ~I2C_CR1_PE_M;
|
||||
}
|
||||
|
||||
void HAL_I2C_Reset(I2C_HandleTypeDef *hi2c)
|
||||
{
|
||||
hi2c->ErrorCode = I2C_ERROR_NONE;
|
||||
|
||||
hi2c->Instance->CR1 &= ~I2C_CR1_PE_M;
|
||||
hi2c->Instance->CR1 |= I2C_CR1_PE_M;
|
||||
}
|
||||
|
||||
void HAL_I2C_Enable(I2C_HandleTypeDef *hi2c)
|
||||
{
|
||||
hi2c->Instance->CR1 |= I2C_CR1_PE_M;
|
||||
}
|
||||
|
||||
void HAL_I2C_AnalogFilterInit(I2C_HandleTypeDef *hi2c, HAL_I2C_AnalogFilterTypeDef AnalogFilter)
|
||||
{
|
||||
hi2c->Init.AnalogFilter = AnalogFilter;
|
||||
@@ -244,6 +226,24 @@ HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c)
|
||||
return HAL_OK;
|
||||
}
|
||||
|
||||
HAL_StatusTypeDef HAL_I2C_Deinit(I2C_HandleTypeDef *hi2c)
|
||||
{
|
||||
HAL_I2C_Disable(hi2c);
|
||||
|
||||
if (hi2c->Instance == I2C_0)
|
||||
{
|
||||
__HAL_PCC_I2C_0_CLK_DISABLE();
|
||||
HAL_GPIO_PinConfig(GPIO_0, GPIO_PIN_9 | GPIO_PIN_10, HAL_GPIO_MODE_GPIO_INPUT, HAL_GPIO_PULL_NONE, HAL_GPIO_DS_2MA);
|
||||
}
|
||||
else if(hi2c->Instance == I2C_1)
|
||||
{
|
||||
__HAL_PCC_I2C_1_CLK_DISABLE();
|
||||
HAL_GPIO_PinConfig(GPIO_1, GPIO_PIN_12 | GPIO_PIN_13, HAL_GPIO_MODE_GPIO_INPUT, HAL_GPIO_PULL_NONE, HAL_GPIO_DS_2MA);
|
||||
}
|
||||
|
||||
return HAL_OK;
|
||||
}
|
||||
|
||||
void HAL_I2C_AutoEnd(I2C_HandleTypeDef *hi2c, HAL_I2C_AutoEndModeTypeDef AutoEnd)
|
||||
{
|
||||
hi2c->Instance->CR2 &= ~I2C_CR2_AUTOEND_M;
|
||||
|
||||
@@ -282,6 +282,37 @@ HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi)
|
||||
return error_code;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Установить новый делитель частоты
|
||||
*
|
||||
* @param hspi указатель на структуру SPI_HandleTypeDef, которая содержит
|
||||
* информацию о конфигурации для модуля SPI.
|
||||
*/
|
||||
void HAL_SPI_Set_Clock_Divider(SPI_HandleTypeDef *hspi)
|
||||
{
|
||||
uint32_t config = hspi->Instance->CONFIG;
|
||||
HAL_SPI_Disable(hspi);
|
||||
config &= ~(0b111 << SPI_CONFIG_BAUD_RATE_DIV_S); // очистить
|
||||
config |= (hspi->Init.BaudRateDiv << SPI_CONFIG_BAUD_RATE_DIV_S); // установить новое
|
||||
hspi->Instance->CONFIG = config; // сохранить конфигурацию
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Установить новый режим работы
|
||||
*
|
||||
* @param hspi указатель на структуру SPI_HandleTypeDef, которая содержит
|
||||
* информацию о конфигурации для модуля SPI.
|
||||
*/
|
||||
void HAL_SPI_Set_Clock_Mode(SPI_HandleTypeDef *hspi)
|
||||
{
|
||||
uint32_t config = hspi->Instance->CONFIG;
|
||||
HAL_SPI_Disable(hspi);
|
||||
config &= ~((1 << SPI_CONFIG_CLK_PH_S) | (1 << SPI_CONFIG_CLK_POL_S)); // очистить
|
||||
config |= ((hspi->Init.CLKPhase << SPI_CONFIG_CLK_PH_S) |
|
||||
(hspi->Init.CLKPolarity << SPI_CONFIG_CLK_POL_S)); // установить новые значения
|
||||
hspi->Instance->CONFIG = config; // сохранить конфигурацию
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Очистить буфер TX_FIFO.
|
||||
*
|
||||
|
||||
@@ -99,26 +99,6 @@ __attribute__((weak)) void HAL_TIMER16_MspInit(Timer16_HandleTypeDef* htimer16)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Выключить таймер.
|
||||
* Может использоваться для отключения таймера или при записи в регистр CFGR.
|
||||
*
|
||||
* @param htimer16 Указатель на структуру с настройками Timer16.
|
||||
*/
|
||||
void HAL_Timer16_Disable(Timer16_HandleTypeDef *htimer16)
|
||||
{
|
||||
htimer16->Instance->CR &= ~TIMER16_CR_ENABLE_M;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Включить таймер
|
||||
* @param htimer16 Указатель на структуру с настройками Timer16.
|
||||
*/
|
||||
void HAL_Timer16_Enable(Timer16_HandleTypeDef *htimer16)
|
||||
{
|
||||
htimer16->Instance->CR |= TIMER16_CR_ENABLE_M;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Установить активный фронт для подсчёта или задать подрежим энкодера.
|
||||
* Используется при тактировании Timer16 от внешнего источника тактового сигнала на выводе Input1.
|
||||
|
||||
@@ -78,6 +78,41 @@ HAL_StatusTypeDef HAL_Timer32_Init(TIMER32_HandleTypeDef *timer)
|
||||
return HAL_OK;
|
||||
}
|
||||
|
||||
HAL_StatusTypeDef HAL_Timer32_Deinit(TIMER32_HandleTypeDef *timer)
|
||||
{
|
||||
if ((timer->Instance != TIMER32_0) && (timer->Instance != TIMER32_1) && (timer->Instance != TIMER32_2))
|
||||
{
|
||||
return HAL_ERROR;
|
||||
}
|
||||
|
||||
if (timer->Instance == TIMER32_0)
|
||||
{
|
||||
__HAL_PCC_TIMER32_0_CLK_DISABLE();
|
||||
}
|
||||
|
||||
if (timer->Instance == TIMER32_1)
|
||||
{
|
||||
__HAL_PCC_TIMER32_1_CLK_DISABLE();
|
||||
if (timer->Clock.Source == TIMER32_SOURCE_TX_PAD)
|
||||
HAL_GPIO_PinConfig(GPIO_0, GPIO_PIN_4, HAL_GPIO_MODE_GPIO_INPUT, HAL_GPIO_PULL_NONE, HAL_GPIO_DS_2MA);
|
||||
}
|
||||
|
||||
if (timer->Instance == TIMER32_2)
|
||||
{
|
||||
__HAL_PCC_TIMER32_2_CLK_DISABLE();
|
||||
if (timer->Clock.Source == TIMER32_SOURCE_TX_PAD)
|
||||
HAL_GPIO_PinConfig(GPIO_1, GPIO_PIN_4, HAL_GPIO_MODE_GPIO_INPUT, HAL_GPIO_PULL_NONE, HAL_GPIO_DS_2MA);
|
||||
}
|
||||
|
||||
HAL_Timer32_InterruptMask_Clear(timer, 0xFFFFFFFF);
|
||||
HAL_Timer32_Prescaler_Set(timer, 0);
|
||||
HAL_Timer32_InterruptFlags_ClearMask(timer, 0xFFFFFFFF);
|
||||
HAL_Timer32_InterruptFlags_Clear(timer);
|
||||
|
||||
return HAL_OK;
|
||||
}
|
||||
|
||||
|
||||
void HAL_Timer32_State_Set(TIMER32_HandleTypeDef *timer, HAL_TIMER32_StateTypeDef state)
|
||||
{
|
||||
timer->State = state;
|
||||
@@ -199,7 +234,7 @@ HAL_StatusTypeDef HAL_Timer32_Channel_Init(TIMER32_CHANNEL_HandleTypeDef *timerC
|
||||
return HAL_ERROR;
|
||||
}
|
||||
|
||||
HAL_TIMER32_Channel_MspInit(timerChannel);
|
||||
// HAL_TIMER32_Channel_MspInit(timerChannel); // здесь инициализируются сразу все каналы выбранного таймера, а нам такого не надо
|
||||
|
||||
timerChannel->Instance = (TIMER32_CHANNEL_TypeDef *)&(timerChannel->TimerInstance->CHANNELS[timerChannel->ChannelIndex]);
|
||||
|
||||
@@ -220,6 +255,8 @@ HAL_StatusTypeDef HAL_Timer32_Channel_DeInit(TIMER32_CHANNEL_HandleTypeDef *time
|
||||
return HAL_ERROR;
|
||||
}
|
||||
|
||||
timerChannel->Instance = (TIMER32_CHANNEL_TypeDef *)&(timerChannel->TimerInstance->CHANNELS[timerChannel->ChannelIndex]);
|
||||
|
||||
HAL_Timer32_Channel_Disable(timerChannel);
|
||||
HAL_Timer32_Channel_CaptureEdge_Set(timerChannel, 0);
|
||||
HAL_Timer32_Channel_ICR_Clear(timerChannel);
|
||||
|
||||
@@ -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;
|
||||
|
||||
File renamed without changes.
@@ -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
|
||||
|
||||
Reference in new issue
Block a user