commit
6c3ade40cf
25 changed files with 1792 additions and 0 deletions
-
BINdoc/ADC通道映射.png
-
BINdoc/定时器映射表.png
-
45logger.c
-
49logger.h
-
35mutex.cpp
-
31mutex.hpp
-
9sdk.cpp
-
10sdk.hpp
-
15stm32/critical.c
-
3stm32/critical.h
-
54stm32/gins.c
-
79stm32/gins.h
-
52stm32/marco.h
-
395stm32/pin.c
-
125stm32/pin.h
-
123stm32/stm32.hpp
-
51stm32/stm32irq.c
-
76stm32/tim.c
-
4stm32/tim.h
-
25ticket.cpp
-
8ticket.hpp
-
375zgpio.cpp
-
100zgpio.hpp
-
116zusdelay.cpp
-
12zusdelay.hpp
After Width: 1180 | Height: 969 | Size: 295 KiB |
After Width: 1203 | Height: 855 | Size: 212 KiB |
@ -0,0 +1,45 @@ |
|||
#include "logger.h" |
|||
|
|||
#include <stdarg.h> |
|||
#include <stdio.h> |
|||
#include <stdlib.h> |
|||
#include <string.h> |
|||
static UART_HandleTypeDef* m_huart; |
|||
bool g_enable_log = true; |
|||
/********************************************************************* |
|||
* @fn _write |
|||
* |
|||
* @brief Support Printf Function |
|||
* |
|||
* @param *buf - UART send Data. |
|||
* size - Data length |
|||
* |
|||
* @return size: Data length |
|||
*/ |
|||
__attribute__((used)) int _write(int fd, char* buf, int size) { |
|||
int i; |
|||
|
|||
for (i = 0; i < size; i++) { |
|||
uint8_t c = *buf++; |
|||
if (m_huart != NULL) HAL_UART_Transmit(m_huart, &c, 1, 100); |
|||
} |
|||
|
|||
return size; |
|||
} |
|||
|
|||
void zlog_init(UART_HandleTypeDef* huart) { m_huart = huart; } |
|||
void zlog_enable(bool enable) { g_enable_log = enable; } |
|||
void zlog(const char* fmt, ...) { |
|||
if (g_enable_log) { |
|||
va_list args; |
|||
va_start(args, fmt); |
|||
vprintf(fmt, args); |
|||
va_end(args); |
|||
} |
|||
} |
|||
|
|||
void zlog_raw(const char* info) { |
|||
if (g_enable_log) { |
|||
printf(info); |
|||
} |
|||
} |
@ -0,0 +1,49 @@ |
|||
#pragma once |
|||
#include <stdbool.h> |
|||
#include <stdio.h> |
|||
|
|||
#include "cmsis_os.h" |
|||
#include "main.h" |
|||
extern bool g_enable_log; |
|||
#define ZLOG_RELEASE(TAG, fmt, ...) \ |
|||
if (g_enable_log) { \ |
|||
zlog(TAG "" fmt "\n", ##__VA_ARGS__); \ |
|||
} |
|||
#define ZLOGI(TAG, fmt, ...) \ |
|||
if (g_enable_log) { \ |
|||
zlog("%08lu INFO [%-8s] " fmt "\n", HAL_GetTick(), TAG, ##__VA_ARGS__); \ |
|||
} |
|||
#define ZLOGD(TAG, fmt, ...) \ |
|||
if (g_enable_log) { \ |
|||
zlog("%08lu DEBU [%-8s] " fmt "\n", HAL_GetTick(), TAG, ##__VA_ARGS__); \ |
|||
} |
|||
#define ZLOGE(TAG, fmt, ...) \ |
|||
if (g_enable_log) { \ |
|||
zlog("%08lu ERRO [%-8s] " fmt "\n", HAL_GetTick(), TAG, ##__VA_ARGS__); \ |
|||
} |
|||
|
|||
#define ZLOGW(TAG, fmt, ...) \ |
|||
if (g_enable_log) { \ |
|||
zlog("%08lu WARN [%-8s] " fmt "\n", HAL_GetTick(), TAG, ##__VA_ARGS__); \ |
|||
} |
|||
|
|||
#define ZASSERT(cond) \ |
|||
if (!(cond)) { \ |
|||
while (1) { \ |
|||
zlog("ASSERT: %s [%s:%d]\n", #cond, __FILE__, __LINE__); \ |
|||
osDelay(1000); \ |
|||
} \ |
|||
} |
|||
|
|||
#define ZASSERT_INFO(cond, info) \ |
|||
if (!(cond)) { \ |
|||
while (1) { \ |
|||
zlog("ASSERT: %s [%s:%d] %s\n", #cond, __FILE__, __LINE__, info); \ |
|||
osDelay(1000); \ |
|||
} \ |
|||
} |
|||
|
|||
void zlog(const char* fmt, ...); |
|||
void zlog_raw(const char* info); |
|||
void zlog_init(UART_HandleTypeDef* huart); |
|||
void zlog_enable(bool enable); |
@ -0,0 +1,35 @@ |
|||
#include "mutex.hpp"
|
|||
#define TAG "zmutex"
|
|||
|
|||
using namespace iflytop; |
|||
|
|||
/*******************************************************************************
|
|||
* zmutex * |
|||
*******************************************************************************/ |
|||
zmutex::zmutex() {} |
|||
zmutex::~zmutex() { |
|||
vSemaphoreDelete(recursiveMutex); |
|||
} |
|||
|
|||
void zmutex::init() { |
|||
recursiveMutex = xSemaphoreCreateRecursiveMutex(); |
|||
} |
|||
|
|||
bool zmutex::isInit() { |
|||
return recursiveMutex != NULL; |
|||
} |
|||
|
|||
void zmutex::lock() { |
|||
xSemaphoreTakeRecursive(recursiveMutex, portMAX_DELAY); |
|||
} |
|||
void zmutex::unlock() { |
|||
xSemaphoreGiveRecursive(recursiveMutex); |
|||
} |
|||
|
|||
/*******************************************************************************
|
|||
* zlock_guard * |
|||
*******************************************************************************/ |
|||
zlock_guard::zlock_guard(zmutex& mutex) : m_mutex(mutex) { |
|||
m_mutex.lock(); |
|||
} |
|||
zlock_guard::~zlock_guard() { m_mutex.unlock(); } |
@ -0,0 +1,31 @@ |
|||
#pragma once
|
|||
extern "C" { |
|||
#include "cmsis_os.h"
|
|||
} |
|||
namespace iflytop { |
|||
using namespace std; |
|||
|
|||
class zmutex { |
|||
public: |
|||
SemaphoreHandle_t recursiveMutex; |
|||
|
|||
public: |
|||
zmutex(); |
|||
~zmutex(); |
|||
|
|||
void init(); |
|||
bool isInit(); |
|||
|
|||
void lock(); |
|||
void unlock(); |
|||
}; |
|||
|
|||
class zlock_guard { |
|||
zmutex& m_mutex; |
|||
|
|||
public: |
|||
zlock_guard(zmutex& mutex); |
|||
~zlock_guard(); |
|||
}; |
|||
|
|||
} // namespace iflytop
|
@ -0,0 +1,9 @@ |
|||
#include "sdk.hpp"
|
|||
|
|||
#include "project_configs.h"
|
|||
|
|||
|
|||
void sdkinit() { |
|||
zlog_init(&PC_DEBUG_UART); |
|||
zusdelay_init(&PC_SYS_DELAY_US_TIMER); |
|||
} |
@ -0,0 +1,10 @@ |
|||
#pragma once
|
|||
extern "C" { |
|||
#include "logger.h"
|
|||
} |
|||
#include "zgpio.hpp"
|
|||
#include "zusdelay.hpp"
|
|||
#include "stm32/stm32.hpp"
|
|||
#include "mutex.hpp"
|
|||
#include "ticket.hpp"
|
|||
void sdkinit(); |
@ -0,0 +1,15 @@ |
|||
#include "main.h" |
|||
static uint8_t g_port_exit_critical_count; |
|||
|
|||
void chip_critical_enter(void) { |
|||
if (g_port_exit_critical_count == 0) { |
|||
__disable_irq(); |
|||
} |
|||
g_port_exit_critical_count++; |
|||
} |
|||
void chip_critical_exit(void) { |
|||
g_port_exit_critical_count--; |
|||
if (g_port_exit_critical_count == 0) { |
|||
__enable_irq(); |
|||
} |
|||
} |
@ -0,0 +1,3 @@ |
|||
#pragma once |
|||
void stm32_critical_enter(void); |
|||
void stm32_critical_exit(void); |
@ -0,0 +1,54 @@ |
|||
#include "gins.h" |
|||
|
|||
#include "main.h" |
|||
|
|||
DEFINE_GLOBAL(CAN_HandleTypeDef, hcan1); |
|||
|
|||
DEFINE_GLOBAL(TIM_HandleTypeDef, htim1); |
|||
DEFINE_GLOBAL(TIM_HandleTypeDef, htim2); |
|||
DEFINE_GLOBAL(TIM_HandleTypeDef, htim6); |
|||
DEFINE_GLOBAL(TIM_HandleTypeDef, htim7); |
|||
|
|||
DEFINE_GLOBAL(I2C_HandleTypeDef, hi2c1); |
|||
|
|||
DEFINE_GLOBAL(UART_HandleTypeDef, huart1); |
|||
DEFINE_GLOBAL(UART_HandleTypeDef, huart2); |
|||
DEFINE_GLOBAL(UART_HandleTypeDef, huart3); |
|||
DEFINE_GLOBAL(UART_HandleTypeDef, huart4); |
|||
|
|||
DEFINE_GLOBAL(DMA_HandleTypeDef, hdma1_stream1); |
|||
DEFINE_GLOBAL(DMA_HandleTypeDef, hdma1_stream2); |
|||
DEFINE_GLOBAL(DMA_HandleTypeDef, hdma1_stream3); |
|||
DEFINE_GLOBAL(DMA_HandleTypeDef, hdma1_stream5); |
|||
DEFINE_GLOBAL(DMA_HandleTypeDef, hdma1_stream6); |
|||
DEFINE_GLOBAL(DMA_HandleTypeDef, hdma2_stream1); |
|||
DEFINE_GLOBAL(DMA_HandleTypeDef, hdma2_stream2); // used by common board |
|||
DEFINE_GLOBAL(DMA_HandleTypeDef, hdma2_stream3); |
|||
DEFINE_GLOBAL(DMA_HandleTypeDef, hdma2_stream7); |
|||
DEFINE_GLOBAL(DMA_HandleTypeDef, hdma3_stream1); |
|||
DEFINE_GLOBAL(DMA_HandleTypeDef, hdma3_stream2); |
|||
DEFINE_GLOBAL(DMA_HandleTypeDef, hdma3_stream3); |
|||
DEFINE_GLOBAL(DMA_HandleTypeDef, hdma4_stream1); |
|||
DEFINE_GLOBAL(DMA_HandleTypeDef, hdma4_stream2); |
|||
DEFINE_GLOBAL(DMA_HandleTypeDef, hdma4_stream3); |
|||
|
|||
DEFINE_GLOBAL(SPI_HandleTypeDef, hspi1); |
|||
DEFINE_GLOBAL(SPI_HandleTypeDef, hspi2); |
|||
DEFINE_GLOBAL(SPI_HandleTypeDef, hspi3); |
|||
|
|||
DEFINE_GLOBAL(ADC_HandleTypeDef, hadc1); |
|||
|
|||
|
|||
|
|||
|
|||
/*********************************************************************************************************************** |
|||
* PTR * |
|||
***********************************************************************************************************************/ |
|||
DEFINE_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart1_rx); |
|||
DEFINE_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart1_tx); |
|||
DEFINE_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart2_rx); |
|||
DEFINE_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart2_tx); |
|||
DEFINE_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart3_rx); |
|||
DEFINE_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart3_tx); |
|||
DEFINE_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart4_rx); |
|||
DEFINE_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart4_tx); |
@ -0,0 +1,79 @@ |
|||
#pragma once |
|||
|
|||
#include <stdbool.h> |
|||
|
|||
#include "main.h" |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
|
|||
#define EXTERN_GLOBAL(type, name) \ |
|||
extern type name; \ |
|||
extern bool name##_enable; |
|||
|
|||
#define EXTERN_GLOBAL_PTR(type, name) extern type* name; |
|||
|
|||
#define DEFINE_GLOBAL(type, name) \ |
|||
type name; \ |
|||
bool name##_enable; |
|||
|
|||
#define DEFINE_GLOBAL_PTR(type, name) type* name; |
|||
|
|||
/*********************************************************************************************************************** |
|||
* GLOBAL * |
|||
***********************************************************************************************************************/ |
|||
|
|||
EXTERN_GLOBAL(CAN_HandleTypeDef, hcan1); |
|||
|
|||
EXTERN_GLOBAL(TIM_HandleTypeDef, htim1); |
|||
EXTERN_GLOBAL(TIM_HandleTypeDef, htim2); |
|||
EXTERN_GLOBAL(TIM_HandleTypeDef, htim6); |
|||
EXTERN_GLOBAL(TIM_HandleTypeDef, htim7); |
|||
|
|||
EXTERN_GLOBAL(I2C_HandleTypeDef, hi2c1); |
|||
|
|||
EXTERN_GLOBAL(UART_HandleTypeDef, huart1); |
|||
EXTERN_GLOBAL(UART_HandleTypeDef, huart2); |
|||
EXTERN_GLOBAL(UART_HandleTypeDef, huart3); |
|||
EXTERN_GLOBAL(UART_HandleTypeDef, huart4); |
|||
|
|||
EXTERN_GLOBAL(DMA_HandleTypeDef, hdma1_stream1); |
|||
EXTERN_GLOBAL(DMA_HandleTypeDef, hdma1_stream2); |
|||
EXTERN_GLOBAL(DMA_HandleTypeDef, hdma1_stream3); |
|||
EXTERN_GLOBAL(DMA_HandleTypeDef, hdma1_stream5); |
|||
EXTERN_GLOBAL(DMA_HandleTypeDef, hdma1_stream6); |
|||
EXTERN_GLOBAL(DMA_HandleTypeDef, hdma2_stream1); |
|||
EXTERN_GLOBAL(DMA_HandleTypeDef, hdma2_stream2); // used by common board |
|||
EXTERN_GLOBAL(DMA_HandleTypeDef, hdma2_stream3); |
|||
EXTERN_GLOBAL(DMA_HandleTypeDef, hdma2_stream7); |
|||
EXTERN_GLOBAL(DMA_HandleTypeDef, hdma3_stream1); |
|||
EXTERN_GLOBAL(DMA_HandleTypeDef, hdma3_stream2); |
|||
EXTERN_GLOBAL(DMA_HandleTypeDef, hdma3_stream3); |
|||
EXTERN_GLOBAL(DMA_HandleTypeDef, hdma4_stream1); |
|||
EXTERN_GLOBAL(DMA_HandleTypeDef, hdma4_stream2); |
|||
EXTERN_GLOBAL(DMA_HandleTypeDef, hdma4_stream3); |
|||
|
|||
EXTERN_GLOBAL(SPI_HandleTypeDef, hspi1); |
|||
EXTERN_GLOBAL(SPI_HandleTypeDef, hspi2); |
|||
EXTERN_GLOBAL(SPI_HandleTypeDef, hspi3); |
|||
|
|||
EXTERN_GLOBAL(ADC_HandleTypeDef, hadc1); |
|||
|
|||
|
|||
/*********************************************************************************************************************** |
|||
* PTR * |
|||
***********************************************************************************************************************/ |
|||
|
|||
EXTERN_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart1_rx); |
|||
EXTERN_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart1_tx); |
|||
EXTERN_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart2_rx); |
|||
EXTERN_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart2_tx); |
|||
EXTERN_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart3_rx); |
|||
EXTERN_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart3_tx); |
|||
EXTERN_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart4_rx); |
|||
EXTERN_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart4_tx); |
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
@ -0,0 +1,52 @@ |
|||
#pragma once |
|||
#ifndef ZARRAY_SIZE |
|||
#define ZARRAY_SIZE(x) ((int32_t)(sizeof(x) / sizeof(x[0]))) |
|||
#endif |
|||
#define ZMAX(a, b) ((a) > (b) ? (a) : (b)) |
|||
#define ZMIN(a, b) ((a) < (b) ? (a) : (b)) |
|||
|
|||
#ifndef INT8_MIN |
|||
#define INT8_MIN (-128) |
|||
#endif |
|||
#ifndef INT16_MIN |
|||
#define INT16_MIN (-32768) |
|||
#endif |
|||
#ifndef INT32_MIN |
|||
#define INT32_MIN (-2147483647 - 1) |
|||
#endif |
|||
#ifndef INT64_MIN |
|||
#define INT64_MIN (-9223372036854775807LL - 1) |
|||
#endif |
|||
|
|||
#ifndef INT8_MAX |
|||
#define INT8_MAX 127 |
|||
#endif |
|||
#ifndef INT16_MAX |
|||
#define INT16_MAX 32767 |
|||
#endif |
|||
#ifndef INT32_MAX |
|||
#define INT32_MAX 2147483647 |
|||
#endif |
|||
#ifndef INT64_MAX |
|||
#define INT64_MAX 9223372036854775807LL |
|||
#endif |
|||
|
|||
#ifndef UINT8_MAX |
|||
#define UINT8_MAX 255 |
|||
#endif |
|||
#ifndef UINT16_MAX |
|||
#define UINT16_MAX 65535 |
|||
#endif |
|||
#ifndef UINT32_MAX |
|||
#define UINT32_MAX 0xffffffffU /* 4294967295U */ |
|||
#endif |
|||
#ifndef UINT64_MAX |
|||
#define UINT64_MAX 0xffffffffffffffffULL /* 18446744073709551615ULL */ |
|||
#endif |
|||
|
|||
#define EARLY_ASSERT(x) \ |
|||
while (!(x)) { \ |
|||
; \ |
|||
} |
|||
|
|||
// |
@ -0,0 +1,395 @@ |
|||
#include "pin.h" |
|||
const char* stm32pin2name(Pin_t pin) { |
|||
switch (pin) { |
|||
case PinNull: |
|||
return "PinNull"; |
|||
case PA0: |
|||
return "PA0"; |
|||
case PA1: |
|||
return "PA1"; |
|||
case PA2: |
|||
return "PA2"; |
|||
case PA3: |
|||
return "PA3"; |
|||
case PA4: |
|||
return "PA4"; |
|||
case PA5: |
|||
return "PA5"; |
|||
case PA6: |
|||
return "PA6"; |
|||
case PA7: |
|||
return "PA7"; |
|||
case PA8: |
|||
return "PA8"; |
|||
case PA9: |
|||
return "PA9"; |
|||
case PA10: |
|||
return "PA10"; |
|||
case PA11: |
|||
return "PA11"; |
|||
case PA12: |
|||
return "PA12"; |
|||
case PA13: |
|||
return "PA13"; |
|||
case PA14: |
|||
return "PA14"; |
|||
case PA15: |
|||
return "PA15"; |
|||
case PB0: |
|||
return "PB0"; |
|||
case PB1: |
|||
return "PB1"; |
|||
case PB2: |
|||
return "PB2"; |
|||
case PB3: |
|||
return "PB3"; |
|||
case PB4: |
|||
return "PB4"; |
|||
case PB5: |
|||
return "PB5"; |
|||
case PB6: |
|||
return "PB6"; |
|||
case PB7: |
|||
return "PB7"; |
|||
case PB8: |
|||
return "PB8"; |
|||
case PB9: |
|||
return "PB9"; |
|||
case PB10: |
|||
return "PB10"; |
|||
case PB11: |
|||
return "PB11"; |
|||
case PB12: |
|||
return "PB12"; |
|||
case PB13: |
|||
return "PB13"; |
|||
case PB14: |
|||
return "PB14"; |
|||
case PB15: |
|||
return "PB15"; |
|||
case PC0: |
|||
return "PC0"; |
|||
case PC1: |
|||
return "PC1"; |
|||
case PC2: |
|||
return "PC2"; |
|||
case PC3: |
|||
return "PC3"; |
|||
case PC4: |
|||
return "PC4"; |
|||
case PC5: |
|||
return "PC5"; |
|||
case PC6: |
|||
return "PC6"; |
|||
case PC7: |
|||
return "PC7"; |
|||
case PC8: |
|||
return "PC8"; |
|||
case PC9: |
|||
return "PC9"; |
|||
case PC10: |
|||
return "PC10"; |
|||
case PC11: |
|||
return "PC11"; |
|||
case PC12: |
|||
return "PC12"; |
|||
case PC13: |
|||
return "PC13"; |
|||
case PC14: |
|||
return "PC14"; |
|||
case PC15: |
|||
return "PC15"; |
|||
case PD0: |
|||
return "PD0"; |
|||
case PD1: |
|||
return "PD1"; |
|||
case PD2: |
|||
return "PD2"; |
|||
case PD3: |
|||
return "PD3"; |
|||
case PD4: |
|||
return "PD4"; |
|||
case PD5: |
|||
return "PD5"; |
|||
case PD6: |
|||
return "PD6"; |
|||
case PD7: |
|||
return "PD7"; |
|||
case PD8: |
|||
return "PD8"; |
|||
case PD9: |
|||
return "PD9"; |
|||
case PD10: |
|||
return "PD10"; |
|||
case PD11: |
|||
return "PD11"; |
|||
case PD12: |
|||
return "PD12"; |
|||
case PD13: |
|||
return "PD13"; |
|||
case PD14: |
|||
return "PD14"; |
|||
case PD15: |
|||
return "PD15"; |
|||
case PE0: |
|||
return "PE0"; |
|||
case PE1: |
|||
return "PE1"; |
|||
case PE2: |
|||
return "PE2"; |
|||
case PE3: |
|||
return "PE3"; |
|||
case PE4: |
|||
return "PE4"; |
|||
case PE5: |
|||
return "PE5"; |
|||
case PE6: |
|||
return "PE6"; |
|||
case PE7: |
|||
return "PE7"; |
|||
case PE8: |
|||
return "PE8"; |
|||
case PE9: |
|||
return "PE9"; |
|||
case PE10: |
|||
return "PE10"; |
|||
case PE11: |
|||
return "PE11"; |
|||
case PE12: |
|||
return "PE12"; |
|||
case PE13: |
|||
return "PE13"; |
|||
case PE14: |
|||
return "PE14"; |
|||
case PE15: |
|||
return "PE15"; |
|||
case PF0: |
|||
return "PF0"; |
|||
case PF1: |
|||
return "PF1"; |
|||
case PF2: |
|||
return "PF2"; |
|||
case PF3: |
|||
return "PF3"; |
|||
case PF4: |
|||
return "PF4"; |
|||
case PF5: |
|||
return "PF5"; |
|||
case PF6: |
|||
return "PF6"; |
|||
case PF7: |
|||
return "PF7"; |
|||
case PF8: |
|||
return "PF8"; |
|||
case PF9: |
|||
return "PF9"; |
|||
case PF10: |
|||
return "PF10"; |
|||
case PF11: |
|||
return "PF11"; |
|||
case PF12: |
|||
return "PF12"; |
|||
case PF13: |
|||
return "PF13"; |
|||
case PF14: |
|||
return "PF14"; |
|||
case PF15: |
|||
return "PF15"; |
|||
case PG0: |
|||
return "PG0"; |
|||
case PG1: |
|||
return "PG1"; |
|||
case PG2: |
|||
return "PG2"; |
|||
case PG3: |
|||
return "PG3"; |
|||
case PG4: |
|||
return "PG4"; |
|||
case PG5: |
|||
return "PG5"; |
|||
case PG6: |
|||
return "PG6"; |
|||
case PG7: |
|||
return "PG7"; |
|||
case PG8: |
|||
return "PG8"; |
|||
case PG9: |
|||
return "PG9"; |
|||
case PG10: |
|||
return "PG10"; |
|||
case PG11: |
|||
return "PG11"; |
|||
case PG12: |
|||
return "PG12"; |
|||
case PG13: |
|||
return "PG13"; |
|||
case PG14: |
|||
return "PG14"; |
|||
case PG15: |
|||
return "PG15"; |
|||
default: |
|||
break; |
|||
} |
|||
return "UNKNOWN_PIN"; |
|||
}; |
|||
|
|||
GPIO_TypeDef* stm32_get_gpio_group(Pin_t pin) { |
|||
int port = pin >> 4; |
|||
|
|||
switch (port) { |
|||
case (PA0 >> 4): |
|||
#ifdef GPIOA |
|||
return GPIOA; |
|||
#endif |
|||
break; |
|||
case (PB0 >> 4): |
|||
#ifdef GPIOB |
|||
return GPIOB; |
|||
#endif |
|||
break; |
|||
case (PC0 >> 4): |
|||
#ifdef GPIOC |
|||
return GPIOC; |
|||
#endif |
|||
break; |
|||
case (PD0 >> 4): |
|||
#ifdef GPIOD |
|||
return GPIOD; |
|||
#endif |
|||
break; |
|||
|
|||
case (PE0 >> 4): |
|||
#ifdef GPIOE |
|||
return GPIOE; |
|||
#endif |
|||
break; |
|||
case (PF0 >> 4): |
|||
#ifdef GPIOF |
|||
return GPIOF; |
|||
#endif |
|||
break; |
|||
case (PG0 >> 4): |
|||
#ifdef GPIOG |
|||
return GPIOG; |
|||
#endif |
|||
break; |
|||
default: |
|||
break; |
|||
} |
|||
return NULL; |
|||
} |
|||
const char* stm32_gpio_group_get_name(GPIO_TypeDef* gpio_group) { |
|||
if (gpio_group == GPIOA) { |
|||
return "GPIOA"; |
|||
} |
|||
if (gpio_group == GPIOB) { |
|||
return "GPIOB"; |
|||
} |
|||
if (gpio_group == GPIOC) { |
|||
return "GPIOC"; |
|||
} |
|||
if (gpio_group == GPIOD) { |
|||
return "GPIOD"; |
|||
} |
|||
if (gpio_group == GPIOE) { |
|||
return "GPIOE"; |
|||
} |
|||
if (gpio_group == GPIOF) { |
|||
return "GPIOF"; |
|||
} |
|||
if (gpio_group == GPIOG) { |
|||
return "GPIOG"; |
|||
} |
|||
return "unknown gpio group"; |
|||
} |
|||
uint16_t stm32_get_pinoff(Pin_t pin) { |
|||
uint16_t pinoff = pin & 0x0F; |
|||
switch (pinoff) { |
|||
case 0: |
|||
return GPIO_PIN_0; |
|||
case 1: |
|||
return GPIO_PIN_1; |
|||
case 2: |
|||
return GPIO_PIN_2; |
|||
case 3: |
|||
return GPIO_PIN_3; |
|||
case 4: |
|||
return GPIO_PIN_4; |
|||
case 5: |
|||
return GPIO_PIN_5; |
|||
case 6: |
|||
return GPIO_PIN_6; |
|||
case 7: |
|||
return GPIO_PIN_7; |
|||
case 8: |
|||
return GPIO_PIN_8; |
|||
case 9: |
|||
return GPIO_PIN_9; |
|||
case 10: |
|||
return GPIO_PIN_10; |
|||
case 11: |
|||
return GPIO_PIN_11; |
|||
case 12: |
|||
return GPIO_PIN_12; |
|||
case 13: |
|||
return GPIO_PIN_13; |
|||
case 14: |
|||
return GPIO_PIN_14; |
|||
case 15: |
|||
return GPIO_PIN_15; |
|||
default: |
|||
break; |
|||
}; |
|||
return 0; |
|||
} |
|||
const char* stm32_pinoff_get_name(uint16_t pinoff) { |
|||
if (pinoff == GPIO_PIN_0) { |
|||
return "0"; |
|||
} |
|||
if (pinoff == GPIO_PIN_1) { |
|||
return "1"; |
|||
} |
|||
if (pinoff == GPIO_PIN_2) { |
|||
return "2"; |
|||
} |
|||
if (pinoff == GPIO_PIN_3) { |
|||
return "3"; |
|||
} |
|||
if (pinoff == GPIO_PIN_4) { |
|||
return "4"; |
|||
} |
|||
if (pinoff == GPIO_PIN_5) { |
|||
return "5"; |
|||
} |
|||
if (pinoff == GPIO_PIN_6) { |
|||
return "6"; |
|||
} |
|||
if (pinoff == GPIO_PIN_7) { |
|||
return "7"; |
|||
} |
|||
if (pinoff == GPIO_PIN_8) { |
|||
return "8"; |
|||
} |
|||
if (pinoff == GPIO_PIN_9) { |
|||
return "9"; |
|||
} |
|||
if (pinoff == GPIO_PIN_10) { |
|||
return "10"; |
|||
} |
|||
if (pinoff == GPIO_PIN_11) { |
|||
return "11"; |
|||
} |
|||
if (pinoff == GPIO_PIN_12) { |
|||
return "12"; |
|||
} |
|||
if (pinoff == GPIO_PIN_13) { |
|||
return "13"; |
|||
} |
|||
if (pinoff == GPIO_PIN_14) { |
|||
return "14"; |
|||
} |
|||
if (pinoff == GPIO_PIN_15) { |
|||
return "15"; |
|||
} |
|||
return "unknown pinoff"; |
|||
} |
@ -0,0 +1,125 @@ |
|||
#pragma once |
|||
#include "main.h" |
|||
|
|||
typedef enum { |
|||
PinNull = 0, |
|||
PA0 = 0x10, |
|||
PA1, |
|||
PA2, |
|||
PA3, |
|||
PA4, |
|||
PA5, |
|||
PA6, |
|||
PA7, |
|||
PA8, |
|||
PA9, |
|||
PA10, |
|||
PA11, |
|||
PA12, |
|||
PA13, |
|||
PA14, |
|||
PA15, |
|||
PB0 = 0x20, |
|||
PB1, |
|||
PB2, |
|||
PB3, |
|||
PB4, |
|||
PB5, |
|||
PB6, |
|||
PB7, |
|||
PB8, |
|||
PB9, |
|||
PB10, |
|||
PB11, |
|||
PB12, |
|||
PB13, |
|||
PB14, |
|||
PB15, |
|||
PC0 = 0x30, |
|||
PC1, |
|||
PC2, |
|||
PC3, |
|||
PC4, |
|||
PC5, |
|||
PC6, |
|||
PC7, |
|||
PC8, |
|||
PC9, |
|||
PC10, |
|||
PC11, |
|||
PC12, |
|||
PC13, |
|||
PC14, |
|||
PC15, |
|||
PD0 = 0x40, |
|||
PD1, |
|||
PD2, |
|||
PD3, |
|||
PD4, |
|||
PD5, |
|||
PD6, |
|||
PD7, |
|||
PD8, |
|||
PD9, |
|||
PD10, |
|||
PD11, |
|||
PD12, |
|||
PD13, |
|||
PD14, |
|||
PD15, |
|||
PE0 = 0x50, |
|||
PE1, |
|||
PE2, |
|||
PE3, |
|||
PE4, |
|||
PE5, |
|||
PE6, |
|||
PE7, |
|||
PE8, |
|||
PE9, |
|||
PE10, |
|||
PE11, |
|||
PE12, |
|||
PE13, |
|||
PE14, |
|||
PE15, |
|||
PF0 = 0x60, |
|||
PF1, |
|||
PF2, |
|||
PF3, |
|||
PF4, |
|||
PF5, |
|||
PF6, |
|||
PF7, |
|||
PF8, |
|||
PF9, |
|||
PF10, |
|||
PF11, |
|||
PF12, |
|||
PF13, |
|||
PF14, |
|||
PF15, |
|||
PG0 = 0x70, |
|||
PG1, |
|||
PG2, |
|||
PG3, |
|||
PG4, |
|||
PG5, |
|||
PG6, |
|||
PG7, |
|||
PG8, |
|||
PG9, |
|||
PG10, |
|||
PG11, |
|||
PG12, |
|||
PG13, |
|||
PG14, |
|||
PG15, |
|||
} Pin_t; |
|||
|
|||
const char* stm32pin2name(Pin_t pin); |
|||
|
|||
GPIO_TypeDef* stm32_get_gpio_group(Pin_t pin); |
|||
const char* stm32_gpio_group_get_name(GPIO_TypeDef* gpio_group); |
|||
uint16_t stm32_get_pinoff(Pin_t pin); |
|||
const char* stm32_pinoff_get_name(uint16_t pinoff); |
@ -0,0 +1,123 @@ |
|||
#pragma once
|
|||
extern "C" { |
|||
#include "main.h"
|
|||
|
|||
#ifdef __STM32F4xx_HAL_H
|
|||
#include "stm32f4xx.h"
|
|||
#endif
|
|||
|
|||
#ifdef HAL_CRYP_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_ADC_MODULE_ENABLED
|
|||
#include "adc.h"
|
|||
#endif
|
|||
#ifdef HAL_CAN_MODULE_ENABLED
|
|||
#include "can.h"
|
|||
#endif
|
|||
#ifdef HAL_CRC_MODULE_ENABLED
|
|||
#include "crc.h"
|
|||
#endif
|
|||
#ifdef HAL_CAN_LEGACY_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_DAC_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_DCMI_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_DMA2D_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_ETH_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_NAND_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_NOR_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_PCCARD_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_SRAM_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_SDRAM_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_HASH_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_I2C_MODULE_ENABLED
|
|||
#include "i2c.h"
|
|||
#endif
|
|||
#ifdef HAL_I2S_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_IWDG_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_LTDC_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_RNG_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_RTC_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_SAI_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_SD_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_MMC_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_SPI_MODULE_ENABLED
|
|||
#include "spi.h"
|
|||
#endif
|
|||
#ifdef HAL_TIM_MODULE_ENABLED
|
|||
#include "tim.h"
|
|||
#endif
|
|||
#ifdef HAL_UART_MODULE_ENABLED
|
|||
#include "usart.h"
|
|||
#endif
|
|||
#ifdef HAL_USART_MODULE_ENABLED
|
|||
#include "usart.h"
|
|||
#endif
|
|||
#ifdef HAL_IRDA_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_SMARTCARD_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_SMBUS_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_WWDG_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_PCD_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_HCD_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_DSI_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_QSPI_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_QSPI_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_CEC_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_FMPI2C_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_FMPSMBUS_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_SPDIFRX_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_DFSDM_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_LPTIM_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_GPIO_MODULE_ENABLED
|
|||
#include "gpio.h"
|
|||
#endif
|
|||
#ifdef HAL_EXTI_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_DMA_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_RCC_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_FLASH_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_PWR_MODULE_ENABLED
|
|||
#endif
|
|||
#ifdef HAL_CORTEX_MODULE_ENABLED
|
|||
#endif
|
|||
#include "marco.h"
|
|||
#include "pin.h"
|
|||
#include "tim.h"
|
|||
#include "critical.h"
|
|||
#include "gins.h"
|
|||
} |
@ -0,0 +1,51 @@ |
|||
#include "gins.h" |
|||
#include "stm32f4xx_it.h" |
|||
|
|||
void DebugMon_Handler(void) {} |
|||
/*********************************************************************************************************************** |
|||
* IRQ * |
|||
***********************************************************************************************************************/ |
|||
|
|||
void DMA1_Stream1_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma1_stream1); } |
|||
void DMA2_Stream2_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma2_stream2); } |
|||
void DMA1_Stream3_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma1_stream3); } |
|||
void DMA2_Stream7_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma2_stream7); } |
|||
void DMA1_Stream5_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma1_stream5); } |
|||
void DMA1_Stream6_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma1_stream6); } |
|||
|
|||
void CAN1_TX_IRQHandler(void) { |
|||
if (hcan1_enable) HAL_CAN_IRQHandler(&hcan1); |
|||
} |
|||
void CAN1_RX0_IRQHandler(void) { |
|||
if (hcan1_enable) HAL_CAN_IRQHandler(&hcan1); |
|||
} |
|||
void CAN1_RX1_IRQHandler(void) { |
|||
if (hcan1_enable) HAL_CAN_IRQHandler(&hcan1); |
|||
} |
|||
void CAN1_SCE_IRQHandler(void) { |
|||
if (hcan1_enable) HAL_CAN_IRQHandler(&hcan1); |
|||
} |
|||
// 定时器 |
|||
|
|||
extern TIM_HandleTypeDef htim11; |
|||
|
|||
void TIM1_TRG_COM_TIM11_IRQHandler(void) { |
|||
HAL_TIM_IRQHandler(&htim11); |
|||
if (htim1_enable) HAL_TIM_IRQHandler(&htim1); |
|||
} |
|||
|
|||
void TIM6_DAC_IRQHandler(void) { |
|||
if (htim6_enable) HAL_TIM_IRQHandler(&htim6); |
|||
} |
|||
void TIM7_IRQHandler(void) { |
|||
if (htim7_enable) HAL_TIM_IRQHandler(&htim7); |
|||
} |
|||
// 串口 |
|||
void USART1_IRQHandler(void) { HAL_UART_IRQHandler(&huart1); } |
|||
void USART2_IRQHandler(void) { HAL_UART_IRQHandler(&huart2); } |
|||
void USART3_IRQHandler(void) { HAL_UART_IRQHandler(&huart3); } |
|||
void UART4_IRQHandler(void) { HAL_UART_IRQHandler(&huart4); } |
|||
|
|||
/*********************************************************************************************************************** |
|||
* EXT * |
|||
***********************************************************************************************************************/ |
@ -0,0 +1,76 @@ |
|||
#include "tim.h" |
|||
|
|||
const char* tim_get_name(TIM_TypeDef* tim) { |
|||
#ifdef TIM1 |
|||
if (tim == TIM1) { |
|||
return "TIM1"; |
|||
} |
|||
#endif |
|||
#ifdef TIM2 |
|||
if (tim == TIM2) { |
|||
return "TIM2"; |
|||
} |
|||
#endif |
|||
#ifdef TIM3 |
|||
if (tim == TIM3) { |
|||
return "TIM3"; |
|||
} |
|||
#endif |
|||
#ifdef TIM4 |
|||
if (tim == TIM4) { |
|||
return "TIM4"; |
|||
} |
|||
#endif |
|||
#ifdef TIM5 |
|||
if (tim == TIM5) { |
|||
return "TIM5"; |
|||
} |
|||
#endif |
|||
#ifdef TIM6 |
|||
if (tim == TIM6) { |
|||
return "TIM6"; |
|||
} |
|||
#endif |
|||
#ifdef TIM7 |
|||
if (tim == TIM7) { |
|||
return "TIM7"; |
|||
} |
|||
#endif |
|||
#ifdef TIM8 |
|||
if (tim == TIM8) { |
|||
return "TIM8"; |
|||
} |
|||
#endif |
|||
#ifdef TIM9 |
|||
if (tim == TIM9) { |
|||
return "TIM9"; |
|||
} |
|||
#endif |
|||
#ifdef TIM10 |
|||
if (tim == TIM10) { |
|||
return "TIM10"; |
|||
} |
|||
#endif |
|||
#ifdef TIM11 |
|||
if (tim == TIM11) { |
|||
return "TIM11"; |
|||
} |
|||
#endif |
|||
#ifdef TIM12 |
|||
if (tim == TIM12) { |
|||
return "TIM12"; |
|||
} |
|||
#endif |
|||
#ifdef TIM13 |
|||
if (tim == TIM13) { |
|||
return "TIM13"; |
|||
} |
|||
#endif |
|||
#ifdef TIM14 |
|||
if (tim == TIM14) { |
|||
return "TIM14"; |
|||
} |
|||
#endif |
|||
|
|||
return "unknowntim"; |
|||
} |
@ -0,0 +1,4 @@ |
|||
#pragma once |
|||
#include "main.h" |
|||
|
|||
const char* tim_get_name(TIM_TypeDef* tim); |
@ -0,0 +1,25 @@ |
|||
#include "ticket.hpp"
|
|||
#include "main.h"
|
|||
|
|||
extern "C" { |
|||
uint32_t zos_get_tick(void) { |
|||
// #ifdef PC_IFLYTOP_ENABLE_OS
|
|||
// return osKernelSysTick();
|
|||
// #else
|
|||
return HAL_GetTick(); |
|||
// #endif
|
|||
} |
|||
uint32_t zos_haspassedms2(uint32_t lastticket, uint32_t nowticket) { |
|||
if (nowticket >= lastticket) { |
|||
return nowticket - lastticket; |
|||
} |
|||
return UINT32_MAX - lastticket + nowticket; |
|||
} |
|||
uint32_t zos_haspassedms(uint32_t ticket) { |
|||
uint32_t nowticket = zos_get_tick(); |
|||
if (nowticket >= ticket) { |
|||
return nowticket - ticket; |
|||
} |
|||
return UINT32_MAX - ticket + nowticket; |
|||
} |
|||
} |
@ -0,0 +1,8 @@ |
|||
#pragma once
|
|||
#include <stdint.h>
|
|||
|
|||
extern "C" { |
|||
uint32_t zos_get_tick(void); |
|||
uint32_t zos_haspassedms(uint32_t ticket); |
|||
uint32_t zos_haspassedms2(uint32_t lastticket, uint32_t nowticket); |
|||
} |
@ -0,0 +1,375 @@ |
|||
|
|||
#include "zgpio.hpp"
|
|||
extern "C" { |
|||
#include "logger.h"
|
|||
} |
|||
#define TAG "GPIO"
|
|||
#define PC_IRQ_PREEMPTPRIORITY_DEFAULT 5
|
|||
|
|||
namespace iflytop { |
|||
/*******************************************************************************
|
|||
* LISTENER * |
|||
*******************************************************************************/ |
|||
|
|||
static ZGPIO *s_irqGPIO[20]; |
|||
int s_irqGPIO_num = 0; |
|||
|
|||
extern "C" { |
|||
/**
|
|||
* @brief This function handles EXTI line3 interrupt. |
|||
*/ |
|||
void EXTI0_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); } |
|||
void EXTI1_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1); } |
|||
void EXTI2_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2); } |
|||
void EXTI3_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3); } |
|||
void EXTI4_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4); } |
|||
void EXTI9_5_IRQHandler(void) { |
|||
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5); |
|||
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_6); |
|||
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7); |
|||
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8); |
|||
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_9); |
|||
} |
|||
void EXTI15_10_IRQHandler(void) { |
|||
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10); |
|||
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11); |
|||
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12); |
|||
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13); |
|||
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14); |
|||
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15); |
|||
} |
|||
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { |
|||
for (int i = 0; i < s_irqGPIO_num; i++) { |
|||
s_irqGPIO[i]->tryTriggerIRQ(GPIO_Pin); |
|||
} |
|||
} |
|||
} |
|||
|
|||
void ZGPIO::regListener(onirq_t listener) { m_onirq = listener; } |
|||
|
|||
/*******************************************************************************
|
|||
* GPIOIMPL * |
|||
*******************************************************************************/ |
|||
|
|||
/*******************************************************************************
|
|||
* BASE_FUNC * |
|||
*******************************************************************************/ |
|||
bool ZGPIO::enableClock() { |
|||
#ifdef GPIOA
|
|||
if (m_gpio == GPIOA) { |
|||
__HAL_RCC_GPIOA_CLK_ENABLE(); |
|||
return true; |
|||
} |
|||
#endif
|
|||
#ifdef GPIOB
|
|||
if (m_gpio == GPIOB) { |
|||
__HAL_RCC_GPIOB_CLK_ENABLE(); |
|||
return true; |
|||
} |
|||
#endif
|
|||
#ifdef GPIOC
|
|||
if (m_gpio == GPIOC) { |
|||
__HAL_RCC_GPIOC_CLK_ENABLE(); |
|||
return true; |
|||
} |
|||
#endif
|
|||
#ifdef GPIOD
|
|||
if (m_gpio == GPIOD) { |
|||
__HAL_RCC_GPIOD_CLK_ENABLE(); |
|||
return true; |
|||
} |
|||
#endif
|
|||
#ifdef GPIOE
|
|||
if (m_gpio == GPIOE) { |
|||
__HAL_RCC_GPIOE_CLK_ENABLE(); |
|||
return true; |
|||
} |
|||
#endif
|
|||
#ifdef GPIOF
|
|||
if (m_gpio == GPIOF) { |
|||
__HAL_RCC_GPIOF_CLK_ENABLE(); |
|||
return true; |
|||
} |
|||
#endif
|
|||
#ifdef GPIOG
|
|||
if (m_gpio == GPIOG) { |
|||
__HAL_RCC_GPIOG_CLK_ENABLE(); |
|||
return true; |
|||
} |
|||
#endif
|
|||
#ifdef GPIOH
|
|||
if (m_gpio == GPIOH) { |
|||
__HAL_RCC_GPIOH_CLK_ENABLE(); |
|||
return true; |
|||
} |
|||
#endif
|
|||
#ifdef GPIOI
|
|||
if (m_gpio == GPIOI) { |
|||
__HAL_RCC_GPIOI_CLK_ENABLE(); |
|||
return true; |
|||
} |
|||
#endif
|
|||
#ifdef GPIOJ
|
|||
if (m_gpio == GPIOJ) { |
|||
__HAL_RCC_GPIOJ_CLK_ENABLE(); |
|||
return true; |
|||
} |
|||
#endif
|
|||
#ifdef GPIOK
|
|||
if (m_gpio == GPIOK) { |
|||
__HAL_RCC_GPIOK_CLK_ENABLE(); |
|||
return true; |
|||
} |
|||
#endif
|
|||
return false; |
|||
} |
|||
|
|||
void regIRQGPIO(ZGPIO *gpio) { |
|||
for (int i = 0; i < s_irqGPIO_num; i++) { |
|||
if (s_irqGPIO[i] == gpio) { |
|||
return; |
|||
} |
|||
} |
|||
|
|||
EARLY_ASSERT((s_irqGPIO_num + 1) < (int)ZARRAY_SIZE(s_irqGPIO)); |
|||
s_irqGPIO[s_irqGPIO_num] = gpio; |
|||
s_irqGPIO_num++; |
|||
} |
|||
|
|||
bool ZGPIO::isMirror() { return m_mirror; } |
|||
void ZGPIO::initAsInput(Pin_t pin, GPIOMode_t mode, GPIOIrqType_t irqtype, bool mirror) { |
|||
if (pin == PinNull) return; |
|||
|
|||
m_mirror = mirror; |
|||
m_mode = mode; |
|||
m_irqtype = irqtype; |
|||
m_gpiotype = kType_Input; |
|||
|
|||
m_pin = pin; |
|||
m_gpio = stm32_get_gpio_group(pin); |
|||
m_pinoff = stm32_get_pinoff(pin); |
|||
|
|||
uint32_t pulluptype = 0; |
|||
if (mode == kMode_nopull) { |
|||
pulluptype = GPIO_NOPULL; |
|||
} else if (mode == kMode_pullup) { |
|||
pulluptype = GPIO_PULLUP; |
|||
} else if (mode == kMode_pulldown) { |
|||
pulluptype = GPIO_PULLDOWN; |
|||
} |
|||
|
|||
enableClock(); |
|||
GPIO_InitTypeDef m_GPIO_InitStruct = {0}; |
|||
if (m_irqtype == kIRQ_noIrq) { |
|||
m_GPIO_InitStruct.Pin = m_pinoff; |
|||
m_GPIO_InitStruct.Mode = GPIO_MODE_INPUT; |
|||
m_GPIO_InitStruct.Pull = pulluptype; |
|||
m_GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; |
|||
} else if (m_irqtype == kIRQ_risingIrq) { |
|||
m_GPIO_InitStruct.Pin = m_pinoff; |
|||
m_GPIO_InitStruct.Mode = m_mirror ? GPIO_MODE_IT_FALLING : GPIO_MODE_IT_RISING; |
|||
m_GPIO_InitStruct.Pull = pulluptype; |
|||
m_GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; |
|||
} else if (m_irqtype == kIRQ_fallingIrq) { |
|||
m_GPIO_InitStruct.Pin = m_pinoff; |
|||
m_GPIO_InitStruct.Mode = !m_mirror ? GPIO_MODE_IT_FALLING : GPIO_MODE_IT_RISING; |
|||
m_GPIO_InitStruct.Pull = pulluptype; |
|||
m_GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; |
|||
} else if (m_irqtype == kIRQ_risingAndFallingIrq) { |
|||
m_GPIO_InitStruct.Pin = m_pinoff; |
|||
m_GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; |
|||
m_GPIO_InitStruct.Pull = pulluptype; |
|||
m_GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; |
|||
} |
|||
|
|||
HAL_GPIO_Init(m_gpio, &m_GPIO_InitStruct); |
|||
if (m_irqtype != kIRQ_noIrq) { |
|||
regIRQGPIO(this); |
|||
lastLevel = getState(); |
|||
HAL_NVIC_SetPriority(getEXTIIRQn(), PC_IRQ_PREEMPTPRIORITY_DEFAULT, 0); |
|||
HAL_NVIC_EnableIRQ(getEXTIIRQn()); |
|||
} |
|||
|
|||
m_initflag = true; |
|||
return; |
|||
} |
|||
void ZGPIO::initAsOutput(Pin_t pin, GPIOMode_t mode, bool mirror, bool initLevel) { |
|||
if (pin == PinNull) return; |
|||
|
|||
m_mirror = mirror; |
|||
m_mode = mode; |
|||
m_irqtype = kIRQ_noIrq; |
|||
m_gpiotype = kType_Output; |
|||
m_pin = pin; |
|||
m_gpio = stm32_get_gpio_group(pin); |
|||
m_pinoff = stm32_get_pinoff(pin); |
|||
|
|||
enableClock(); |
|||
|
|||
GPIO_InitTypeDef m_GPIO_InitStruct = {0}; |
|||
initLevel = m_mirror ? !initLevel : initLevel; |
|||
GPIO_PinState pinState = initLevel ? GPIO_PIN_SET : GPIO_PIN_RESET; |
|||
|
|||
HAL_GPIO_WritePin(m_gpio, m_pinoff, pinState); |
|||
if (m_mode == kMode_nopull) { |
|||
m_GPIO_InitStruct.Pin = m_pinoff; |
|||
m_GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; |
|||
m_GPIO_InitStruct.Pull = GPIO_NOPULL; |
|||
m_GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; |
|||
} else if (m_mode == kMode_pullup) { |
|||
m_GPIO_InitStruct.Pin = m_pinoff; |
|||
m_GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; |
|||
m_GPIO_InitStruct.Pull = GPIO_PULLUP; |
|||
m_GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; |
|||
} else if (m_mode == kMode_pulldown) { |
|||
m_GPIO_InitStruct.Pin = m_pinoff; |
|||
m_GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; |
|||
m_GPIO_InitStruct.Pull = GPIO_PULLDOWN; |
|||
m_GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; |
|||
} else if (m_mode == kMode_od) { |
|||
m_GPIO_InitStruct.Pin = m_pinoff; |
|||
m_GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; |
|||
m_GPIO_InitStruct.Pull = 0; |
|||
m_GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; |
|||
} |
|||
HAL_GPIO_Init(m_gpio, &m_GPIO_InitStruct); |
|||
m_initflag = true; |
|||
|
|||
return; |
|||
} |
|||
bool ZGPIO::isItRisingEXITGPIO() { return m_irqtype == kIRQ_risingIrq; } |
|||
bool ZGPIO::isItFallingEXITGPIO() { return m_irqtype == kIRQ_fallingIrq; } |
|||
bool ZGPIO::isItRisingAndItFallingEXITGPIO() { return m_irqtype == kIRQ_risingAndFallingIrq; } |
|||
|
|||
/*******************************************************************************
|
|||
* EXT FUNC * |
|||
*******************************************************************************/ |
|||
|
|||
/**
|
|||
* @brief 判断当前是否是这个引脚产生的中断 |
|||
* |
|||
* @param checkloop |
|||
* @param GPIO_Pin |
|||
* @return true |
|||
* @return false |
|||
* |
|||
* 由于STM32的GPIO中断线是共用的,所以需要根据GPIO的即时状态判断是否是这个引脚产生的中?? |
|||
* |
|||
* 判断逻辑??: |
|||
* 先判断所有中断模式是 GPIO_MODE_IT_RISING ?? GPIO_MODE_IT_FALLING 的引脚,采样当前电平判断是否是这个引脚产生的中断 |
|||
* 再判断中断模式是 GPIO_MODE_IT_RISING_FALLING 的引脚,直接返回true |
|||
*/ |
|||
bool ZGPIO::tryTriggerIRQ(uint16_t GPIO_Pin) { |
|||
bool ret = false; |
|||
bool nostate = false; |
|||
if (GPIO_Pin != m_pinoff) return false; |
|||
if (!(isItRisingEXITGPIO() || isItFallingEXITGPIO() || isItRisingAndItFallingEXITGPIO())) { |
|||
return false; |
|||
} |
|||
|
|||
nostate = getState(); |
|||
|
|||
if (isItRisingEXITGPIO()) { |
|||
if (nostate) { |
|||
ret = true; |
|||
if (m_onirq) { |
|||
m_onirq(this, kRisingIrqEvent); |
|||
} |
|||
} |
|||
} else if (isItFallingEXITGPIO()) { |
|||
if (!nostate) { |
|||
ret = true; |
|||
if (m_onirq) { |
|||
m_onirq(this, kFallingIrqEvent); |
|||
} |
|||
} |
|||
} else { |
|||
if (lastLevel != nostate) { |
|||
ret = true; |
|||
if (m_onirq) { |
|||
if (lastLevel) |
|||
m_onirq(this, kRisingIrqEvent); |
|||
else |
|||
m_onirq(this, kFallingIrqEvent); |
|||
} |
|||
} |
|||
} |
|||
|
|||
lastLevel = nostate; |
|||
return ret; |
|||
} |
|||
|
|||
void ZGPIO::toggleState() { HAL_GPIO_TogglePin(m_gpio, m_pinoff); } |
|||
uint32_t ZGPIO::getStateUint32() { |
|||
if (getState()) |
|||
return 1; |
|||
else |
|||
return 0; |
|||
} |
|||
|
|||
bool ZGPIO::getState() { |
|||
if (m_pin == PinNull) return false; |
|||
bool ret = false; |
|||
if (HAL_GPIO_ReadPin(m_gpio, m_pinoff) == GPIO_PIN_SET) { |
|||
ret = true; |
|||
} else { |
|||
ret = false; |
|||
} |
|||
if (m_mirror) ret = !ret; |
|||
return ret; |
|||
} |
|||
bool ZGPIO::setState(bool state) { |
|||
if (m_pin == PinNull) return true; |
|||
|
|||
if (m_mirror) state = !state; |
|||
|
|||
if (m_log_when_setstate) { |
|||
ZLOGI(TAG, "%s%s set %d", stm32_gpio_group_get_name(m_gpio), stm32_pinoff_get_name(m_pinoff), state); |
|||
} |
|||
if (state) { |
|||
HAL_GPIO_WritePin(m_gpio, m_pinoff, GPIO_PIN_SET); |
|||
} else { |
|||
HAL_GPIO_WritePin(m_gpio, m_pinoff, GPIO_PIN_RESET); |
|||
} |
|||
return true; |
|||
} |
|||
IRQn_Type ZGPIO::getEXTIIRQn() { |
|||
switch (m_pinoff) { |
|||
case GPIO_PIN_0: |
|||
return EXTI0_IRQn; |
|||
case GPIO_PIN_1: |
|||
return EXTI1_IRQn; |
|||
case GPIO_PIN_2: |
|||
return EXTI2_IRQn; |
|||
case GPIO_PIN_3: |
|||
return EXTI3_IRQn; |
|||
case GPIO_PIN_4: |
|||
return EXTI4_IRQn; |
|||
case GPIO_PIN_5: |
|||
case GPIO_PIN_6: |
|||
case GPIO_PIN_7: |
|||
case GPIO_PIN_8: |
|||
case GPIO_PIN_9: |
|||
return EXTI9_5_IRQn; |
|||
case GPIO_PIN_10: |
|||
case GPIO_PIN_11: |
|||
case GPIO_PIN_12: |
|||
case GPIO_PIN_13: |
|||
case GPIO_PIN_14: |
|||
case GPIO_PIN_15: |
|||
return EXTI15_10_IRQn; |
|||
default: |
|||
ZASSERT(0); |
|||
} |
|||
return EXTI0_IRQn; |
|||
} |
|||
/**
|
|||
* @brief 初始化GPIO为中断模?? |
|||
* |
|||
* @param pull GPIO_NOPULL, GPIO_PULLUP, GPIO_PULLDOWN |
|||
* @param mode GPIO_MODE_IT_RISING, GPIO_MODE_IT_FALLING, GPIO_MODE_IT_RISING_FALLING |
|||
* @return true |
|||
* @return false |
|||
*/ |
|||
|
|||
} // namespace iflytop
|
@ -0,0 +1,100 @@ |
|||
#pragma once
|
|||
#include <functional>
|
|||
#include "stm32/stm32.hpp"
|
|||
namespace iflytop { |
|||
using namespace std; |
|||
|
|||
#define STM32_GPIO_LISTENER_NUM 10
|
|||
class ZGPIO { |
|||
public: |
|||
typedef enum { |
|||
kRisingIrqEvent, |
|||
kFallingIrqEvent, |
|||
} IrqTypeEvent_t; |
|||
|
|||
typedef enum { |
|||
kMode_nopull, //
|
|||
kMode_pullup, //
|
|||
kMode_pulldown, //
|
|||
kMode_od, //
|
|||
} GPIOMode_t; |
|||
|
|||
typedef enum { kType_AIN, kType_Input, kType_Output } GPIOType_t; |
|||
|
|||
typedef enum { |
|||
kIRQ_noIrq, |
|||
kIRQ_risingIrq, |
|||
kIRQ_fallingIrq, |
|||
kIRQ_risingAndFallingIrq, |
|||
} GPIOIrqType_t; |
|||
|
|||
typedef function<void(ZGPIO *GPIO_Pin, IrqTypeEvent_t irqevent)> onirq_t; |
|||
|
|||
typedef struct { |
|||
Pin_t pin; |
|||
GPIOMode_t mode; |
|||
GPIOIrqType_t irqtype; |
|||
bool mirror; |
|||
} InputGpioCfg_t; |
|||
|
|||
typedef struct { |
|||
Pin_t pin; |
|||
GPIOMode_t mode; |
|||
bool mirror; |
|||
bool initLevel; |
|||
bool log_when_setstate; |
|||
} OutputGpioCfg_t; |
|||
|
|||
private: |
|||
Pin_t m_pin = PinNull; |
|||
GPIO_TypeDef *m_gpio; |
|||
uint16_t m_pinoff; |
|||
GPIOType_t m_gpiotype; |
|||
GPIOMode_t m_mode; |
|||
GPIOIrqType_t m_irqtype; |
|||
bool m_mirror; |
|||
bool lastLevel; |
|||
bool m_log_when_setstate = false; |
|||
|
|||
onirq_t m_onirq; |
|||
bool m_initflag; |
|||
|
|||
public: |
|||
ZGPIO(){}; |
|||
|
|||
void initAsInput(Pin_t pin, GPIOMode_t mode, GPIOIrqType_t irqtype, bool mirror); |
|||
void initAsOutput(Pin_t pin, GPIOMode_t mode, bool mirror, bool initLevel); |
|||
void initAsOutput(OutputGpioCfg_t *outputcfg) { |
|||
m_log_when_setstate = outputcfg->log_when_setstate; |
|||
initAsOutput(outputcfg->pin, outputcfg->mode, outputcfg->mirror, outputcfg->initLevel); |
|||
} |
|||
void initAsInput(InputGpioCfg_t *inputcfg) { initAsInput(inputcfg->pin, inputcfg->mode, inputcfg->irqtype, inputcfg->mirror); } |
|||
void enableTrace(bool enable) { m_log_when_setstate = enable; } |
|||
void regListener(onirq_t listener); |
|||
|
|||
bool isMirror(); |
|||
bool isItRisingEXITGPIO(); |
|||
bool isItFallingEXITGPIO(); |
|||
bool isItRisingAndItFallingEXITGPIO(); |
|||
|
|||
bool getState(); |
|||
uint32_t getStateUint32(); |
|||
bool setState(bool state); |
|||
void toggleState(); |
|||
|
|||
bool isNull() { return m_pin == PinNull; } |
|||
|
|||
Pin_t getPin() { return m_pin; } |
|||
|
|||
IRQn_Type getEXTIIRQn(); |
|||
GPIO_TypeDef *getHalPinPort() { return m_gpio; } |
|||
uint16_t getHalPin() { return m_pinoff; } |
|||
|
|||
bool tryTriggerIRQ(uint16_t GPIO_Pin); |
|||
|
|||
bool isInit() { return m_initflag; } |
|||
|
|||
private: |
|||
bool enableClock(); |
|||
}; |
|||
} // namespace iflytop
|
@ -0,0 +1,116 @@ |
|||
#include "zusdelay.hpp"
|
|||
extern "C" { |
|||
|
|||
static TIM_HandleTypeDef* m_usdleaytim; |
|||
|
|||
static HAL_StatusTypeDef _HAL_TIM_Base_Start(TIM_HandleTypeDef* htim) __attribute__((optimize("O2"))); |
|||
static HAL_StatusTypeDef _HAL_TIM_Base_Stop(TIM_HandleTypeDef* htim) __attribute__((optimize("O2"))); |
|||
|
|||
static HAL_StatusTypeDef _HAL_TIM_Base_Start(TIM_HandleTypeDef* htim) { |
|||
uint32_t tmpsmcr; |
|||
/* Check the TIM state */ |
|||
if (htim->State != HAL_TIM_STATE_READY) { |
|||
return HAL_ERROR; |
|||
} |
|||
htim->State = HAL_TIM_STATE_BUSY; |
|||
if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) { |
|||
tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; |
|||
if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) { |
|||
__HAL_TIM_ENABLE(htim); |
|||
} |
|||
} else { |
|||
__HAL_TIM_ENABLE(htim); |
|||
} |
|||
return HAL_OK; |
|||
} |
|||
|
|||
static HAL_StatusTypeDef _HAL_TIM_Base_Stop(TIM_HandleTypeDef* htim) { |
|||
/* Disable the Peripheral */ |
|||
__HAL_TIM_DISABLE(htim); |
|||
/* Set the TIM state */ |
|||
htim->State = HAL_TIM_STATE_READY; |
|||
/* Return function status */ |
|||
return HAL_OK; |
|||
} |
|||
|
|||
static uint32_t chip_get_timer_clock_sorce_freq(TIM_HandleTypeDef* tim) { |
|||
uint32_t timClkFreq = 0; |
|||
#if 0
|
|||
uint32_t pclk1Freq = HAL_RCC_GetPCLK1Freq(); |
|||
uint32_t pclk2Freq = HAL_RCC_GetPCLK2Freq(); |
|||
uint32_t sysClkFreq = HAL_RCC_GetSysClockFreq(); |
|||
#endif
|
|||
|
|||
uint32_t pFLatency; |
|||
RCC_ClkInitTypeDef clkconfig; |
|||
HAL_RCC_GetClockConfig(&clkconfig, &pFLatency); |
|||
bool isAPB2 = false; |
|||
|
|||
#ifdef TIM1
|
|||
if (tim->Instance == TIM1) isAPB2 = true; |
|||
#endif
|
|||
#ifdef TIM8
|
|||
if (tim->Instance == TIM8) isAPB2 = true; |
|||
#endif
|
|||
#ifdef TIM9
|
|||
if (tim->Instance == TIM9) isAPB2 = true; |
|||
#endif
|
|||
#ifdef TIM10
|
|||
if (tim->Instance == TIM10) isAPB2 = true; |
|||
#endif
|
|||
#ifdef TIM11
|
|||
if (tim->Instance == TIM11) isAPB2 = true; |
|||
#endif
|
|||
if (isAPB2) { |
|||
if (clkconfig.APB2CLKDivider == RCC_HCLK_DIV1) { |
|||
timClkFreq = HAL_RCC_GetPCLK2Freq(); |
|||
} else { |
|||
timClkFreq = 2 * HAL_RCC_GetPCLK2Freq(); |
|||
} |
|||
} else { |
|||
if (clkconfig.APB1CLKDivider == RCC_HCLK_DIV1) { |
|||
timClkFreq = HAL_RCC_GetPCLK1Freq(); |
|||
} else { |
|||
timClkFreq = 2 * HAL_RCC_GetPCLK1Freq(); |
|||
} |
|||
} |
|||
return timClkFreq; |
|||
} |
|||
|
|||
uint32_t zusdelay_init(TIM_HandleTypeDef* tim) { |
|||
m_usdleaytim = tim; |
|||
|
|||
uint32_t freq = chip_get_timer_clock_sorce_freq(tim); |
|||
uint32_t prescaler = freq / 1000000 - 1; // 1us
|
|||
uint32_t autoreload = 65535; |
|||
|
|||
HAL_TIM_Base_DeInit(tim); |
|||
|
|||
tim->Init.Prescaler = prescaler; |
|||
tim->Init.CounterMode = TIM_COUNTERMODE_UP; |
|||
tim->Init.Period = autoreload; |
|||
tim->Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; |
|||
HAL_TIM_Base_Init(tim); |
|||
|
|||
return 0; |
|||
} |
|||
static inline void __zchip_clock_early_delayus(uint32_t n) { |
|||
volatile uint32_t counter = 0; |
|||
__HAL_TIM_SET_COUNTER(m_usdleaytim, 0); |
|||
_HAL_TIM_Base_Start(m_usdleaytim); |
|||
while (counter < n) { |
|||
counter = __HAL_TIM_GET_COUNTER(m_usdleaytim); |
|||
} |
|||
_HAL_TIM_Base_Stop(m_usdleaytim); |
|||
} |
|||
void zusdelay_early_delayus(uint32_t _us) { |
|||
uint32_t us = _us % 1000; |
|||
uint32_t ms = _us / 1000; |
|||
if (us > 0) { |
|||
__zchip_clock_early_delayus(us); |
|||
} |
|||
for (uint32_t i = 0; i < ms; i++) { |
|||
__zchip_clock_early_delayus(1000); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,12 @@ |
|||
#pragma once
|
|||
#include <stdint.h>
|
|||
|
|||
#include "main.h"
|
|||
|
|||
extern "C" { |
|||
// 微秒延迟定时器,注意该延时定时器需要按照以下文档进行配置
|
|||
// http://192.168.1.3:3000/zwikipedia/iflytop_wikipedia/src/branch/master/doc/stm32cubemx_us_timer.md
|
|||
|
|||
uint32_t zusdelay_init(TIM_HandleTypeDef* tim); |
|||
void zusdelay_early_delayus(uint32_t us); |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue