增加文件系统
This commit is contained in:
@@ -50,9 +50,15 @@ void MX_DMA_Init(void)
|
||||
/* DMA1_Stream4_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA1_Stream4_IRQn, 7, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA1_Stream4_IRQn);
|
||||
/* DMA2_Stream0_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 7, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);
|
||||
/* DMA2_Stream2_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 9, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
|
||||
/* DMA2_Stream3_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 7, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);
|
||||
/* DMA2_Stream7_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 9, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);
|
||||
|
||||
184
Src/freertos.c
184
Src/freertos.c
@@ -25,9 +25,14 @@
|
||||
|
||||
/* Private includes ----------------------------------------------------------*/
|
||||
/* USER CODE BEGIN Includes */
|
||||
#include <string.h>
|
||||
#include "net_task.h"
|
||||
#include "ch395f.h"
|
||||
#include "dbg_log.h"
|
||||
#include "net_socket.h"
|
||||
#include "usart.h"
|
||||
#include "ff.h"
|
||||
#include "flashdb.h"
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
@@ -38,6 +43,29 @@
|
||||
/* Private define ------------------------------------------------------------*/
|
||||
/* USER CODE BEGIN PD */
|
||||
|
||||
/* 存储测试统计 */
|
||||
typedef struct {
|
||||
uint16_t total;
|
||||
uint16_t passed;
|
||||
uint16_t failed;
|
||||
} storage_test_stats_t;
|
||||
|
||||
#define STORAGE_TEST_CHECK(cond, fmt, ...) do { \
|
||||
g_storage_stats.total++; \
|
||||
if (cond) { \
|
||||
g_storage_stats.passed++; \
|
||||
DBG_INFO(" [PASS] " fmt, ##__VA_ARGS__); \
|
||||
} else { \
|
||||
g_storage_stats.failed++; \
|
||||
DBG_ERROR(" [FAIL] " fmt, ##__VA_ARGS__); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define STORAGE_TEST_REPORT(name) do { \
|
||||
DBG_INFO("=== %s: %d/%d PASSED (failed=%d) ===", \
|
||||
name, g_storage_stats.passed, g_storage_stats.total, g_storage_stats.failed); \
|
||||
} while (0)
|
||||
|
||||
/* USER CODE END PD */
|
||||
|
||||
/* Private macro -------------------------------------------------------------*/
|
||||
@@ -47,7 +75,9 @@
|
||||
|
||||
/* Private variables ---------------------------------------------------------*/
|
||||
/* USER CODE BEGIN Variables */
|
||||
|
||||
static struct fdb_kvdb s_kvdb;
|
||||
static storage_test_stats_t g_storage_stats;
|
||||
static uint8_t s_perf_buf[4096];
|
||||
/* USER CODE END Variables */
|
||||
/* Definitions for defaultTask */
|
||||
osThreadId_t defaultTaskHandle;
|
||||
@@ -60,9 +90,14 @@ const osThreadAttr_t defaultTask_attributes = {
|
||||
osThreadId_t netTaskHandle;
|
||||
const osThreadAttr_t netTask_attributes = {
|
||||
.name = "netTask",
|
||||
.stack_size = 1024 * 8,
|
||||
.stack_size = 1024 * 4,
|
||||
.priority = (osPriority_t) osPriorityNormal,
|
||||
};
|
||||
/* Definitions for netMsgQueue */
|
||||
osMessageQueueId_t netMsgQueueHandle;
|
||||
const osMessageQueueAttr_t netMsgQueue_attributes = {
|
||||
.name = "netMsgQueue"
|
||||
};
|
||||
|
||||
/* Private function prototypes -----------------------------------------------*/
|
||||
/* USER CODE BEGIN FunctionPrototypes */
|
||||
@@ -96,6 +131,10 @@ void MX_FREERTOS_Init(void) {
|
||||
/* start timers, add new ones, ... */
|
||||
/* USER CODE END RTOS_TIMERS */
|
||||
|
||||
/* Create the queue(s) */
|
||||
/* creation of netMsgQueue */
|
||||
netMsgQueueHandle = osMessageQueueNew (8, sizeof(net_msg_t), &netMsgQueue_attributes);
|
||||
|
||||
/* USER CODE BEGIN RTOS_QUEUES */
|
||||
/* add queues, ... */
|
||||
/* USER CODE END RTOS_QUEUES */
|
||||
@@ -127,20 +166,147 @@ void MX_FREERTOS_Init(void) {
|
||||
void StartDefaultTask(void *argument)
|
||||
{
|
||||
/* USER CODE BEGIN StartDefaultTask */
|
||||
/* Infinite loop */
|
||||
for(;;)
|
||||
|
||||
static FATFS fs;
|
||||
static FIL fil;
|
||||
static uint8_t work[FF_MAX_SS];
|
||||
char read_buf[64];
|
||||
const char *test_str = "Hello FatFS + dhara FTL!";
|
||||
fdb_err_t fdb_ret;
|
||||
|
||||
memset(&g_storage_stats, 0, sizeof(g_storage_stats));
|
||||
|
||||
/* ==================== FTL + FatFS 文件系统测试 ==================== */
|
||||
|
||||
DBG_INFO("=== Storage Test: FTL + FatFS ===");
|
||||
|
||||
FRESULT res = f_mount(&fs, "", 1);
|
||||
if (res == FR_NO_FILESYSTEM) {
|
||||
MKFS_PARM opts = {FM_FAT32, 0, 0, 0, 0};
|
||||
res = f_mkfs("", &opts, work, sizeof(work));
|
||||
STORAGE_TEST_CHECK(res == FR_OK, "f_mkfs");
|
||||
res = f_mount(&fs, "", 1);
|
||||
}
|
||||
STORAGE_TEST_CHECK(res == FR_OK, "f_mount");
|
||||
|
||||
if (res == FR_OK) {
|
||||
UINT bw, br;
|
||||
|
||||
res = f_open(&fil, "test.txt", FA_CREATE_ALWAYS | FA_WRITE);
|
||||
STORAGE_TEST_CHECK(res == FR_OK, "f_open(write)");
|
||||
if (res == FR_OK) {
|
||||
f_write(&fil, test_str, strlen(test_str), &bw);
|
||||
STORAGE_TEST_CHECK(bw == strlen(test_str), "f_write (%u bytes)", bw);
|
||||
f_close(&fil);
|
||||
|
||||
res = f_open(&fil, "test.txt", FA_READ);
|
||||
STORAGE_TEST_CHECK(res == FR_OK, "f_open(read)");
|
||||
if (res == FR_OK) {
|
||||
f_read(&fil, read_buf, sizeof(read_buf) - 1, &br);
|
||||
f_close(&fil);
|
||||
read_buf[br] = '\0';
|
||||
STORAGE_TEST_CHECK(br == strlen(test_str) && memcmp(test_str, read_buf, br) == 0,
|
||||
"data verify \"%s\"", read_buf);
|
||||
}
|
||||
}
|
||||
f_unlink("test.txt");
|
||||
}
|
||||
|
||||
/* ==================== FlashDB KVDB 测试 ==================== */
|
||||
|
||||
DBG_INFO("=== Storage Test: FlashDB KVDB ===");
|
||||
|
||||
fdb_ret = fdb_kvdb_init(&s_kvdb, "kvdb1", "fdb_kvdb1", NULL, NULL);
|
||||
STORAGE_TEST_CHECK(fdb_ret == FDB_NO_ERR, "fdb_kvdb_init");
|
||||
|
||||
if (fdb_ret == FDB_NO_ERR) {
|
||||
fdb_ret = fdb_kv_set(&s_kvdb, "hello", "FlashDB KVDB!");
|
||||
STORAGE_TEST_CHECK(fdb_ret == FDB_NO_ERR, "fdb_kv_set(hello)");
|
||||
|
||||
char *val = fdb_kv_get(&s_kvdb, "hello");
|
||||
STORAGE_TEST_CHECK(val != NULL && strcmp(val, "FlashDB KVDB!") == 0,
|
||||
"fdb_kv_get(hello) -> \"%s\"", val ? val : "NULL");
|
||||
|
||||
uint32_t blob_data = 0xDEADBEEF;
|
||||
struct fdb_blob blob;
|
||||
fdb_blob_make(&blob, &blob_data, sizeof(blob_data));
|
||||
fdb_ret = fdb_kv_set_blob(&s_kvdb, "counter", &blob);
|
||||
STORAGE_TEST_CHECK(fdb_ret == FDB_NO_ERR, "fdb_kv_set_blob(counter)");
|
||||
|
||||
uint32_t read_data = 0;
|
||||
struct fdb_blob read_blob;
|
||||
fdb_blob_make(&read_blob, &read_data, sizeof(read_data));
|
||||
size_t len = fdb_kv_get_blob(&s_kvdb, "counter", &read_blob);
|
||||
STORAGE_TEST_CHECK(len == sizeof(read_data) && read_data == 0xDEADBEEF,
|
||||
"fdb_kv_get_blob(counter) -> 0x%08lX", (unsigned long)read_data);
|
||||
|
||||
fdb_kv_del(&s_kvdb, "hello");
|
||||
fdb_kv_del(&s_kvdb, "counter");
|
||||
}
|
||||
|
||||
/* ==================== FTL + FatFS 性能测试 ==================== */
|
||||
|
||||
DBG_INFO("=== Storage Test: Performance ===");
|
||||
|
||||
{
|
||||
osDelay(1);
|
||||
FIL pfile;
|
||||
UINT pw, pr;
|
||||
uint32_t t0, tw, tr;
|
||||
uint32_t i;
|
||||
uint32_t total_kb = 128;
|
||||
uint32_t chunk = sizeof(s_perf_buf);
|
||||
uint32_t count = (total_kb * 1024) / chunk;
|
||||
|
||||
memset(s_perf_buf, 0xA5, sizeof(s_perf_buf));
|
||||
|
||||
/* 写入 */
|
||||
t0 = HAL_GetTick();
|
||||
if (f_open(&pfile, "perf.dat", FA_CREATE_ALWAYS | FA_WRITE) == FR_OK) {
|
||||
for (i = 0; i < count; i++) {
|
||||
f_write(&pfile, s_perf_buf, chunk, &pw);
|
||||
}
|
||||
f_close(&pfile);
|
||||
}
|
||||
tw = HAL_GetTick() - t0;
|
||||
|
||||
/* 读取 */
|
||||
t0 = HAL_GetTick();
|
||||
if (f_open(&pfile, "perf.dat", FA_READ) == FR_OK) {
|
||||
for (i = 0; i < count; i++) {
|
||||
f_read(&pfile, s_perf_buf, chunk, &pr);
|
||||
}
|
||||
f_close(&pfile);
|
||||
}
|
||||
tr = HAL_GetTick() - t0;
|
||||
|
||||
f_unlink("perf.dat");
|
||||
|
||||
if (tw > 0) {
|
||||
DBG_INFO(" Write: %lu KB in %lu ms = %lu KB/s",
|
||||
total_kb, tw, (total_kb * 1000) / tw);
|
||||
}
|
||||
if (tr > 0) {
|
||||
DBG_INFO(" Read: %lu KB in %lu ms = %lu KB/s",
|
||||
total_kb, tr, (total_kb * 1000) / tr);
|
||||
}
|
||||
}
|
||||
|
||||
/* ==================== 汇总报告 ==================== */
|
||||
|
||||
STORAGE_TEST_REPORT("Storage Tests");
|
||||
|
||||
for (;;) {
|
||||
osDelay(1000);
|
||||
}
|
||||
/* USER CODE END StartDefaultTask */
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN Header_StartNetTask */
|
||||
/**
|
||||
* @brief Function implementing the netTask thread.
|
||||
* @param argument: Not used
|
||||
* @retval None
|
||||
*/
|
||||
* @brief Function implementing the netTask thread.
|
||||
* @param argument: Not used
|
||||
* @retval None
|
||||
*/
|
||||
/* USER CODE END Header_StartNetTask */
|
||||
void StartNetTask(void *argument)
|
||||
{
|
||||
|
||||
15
Src/gpio.c
15
Src/gpio.c
@@ -128,12 +128,12 @@ void MX_GPIO_Init(void)
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||
HAL_GPIO_Init(CH395_SCS_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pin : ST_DIR4_Pin */
|
||||
GPIO_InitStruct.Pin = ST_DIR4_Pin;
|
||||
/*Configure GPIO pins : ST_DIR4_Pin TP_RD_Pin TP_CONVST_Pin */
|
||||
GPIO_InitStruct.Pin = ST_DIR4_Pin|TP_RD_Pin|TP_CONVST_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
HAL_GPIO_Init(ST_DIR4_GPIO_Port, &GPIO_InitStruct);
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
||||
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pin : TP_FRSTDATA_Pin */
|
||||
GPIO_InitStruct.Pin = TP_FRSTDATA_Pin;
|
||||
@@ -141,13 +141,6 @@ void MX_GPIO_Init(void)
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
HAL_GPIO_Init(TP_FRSTDATA_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pins : TP_RD_Pin TP_CONVST_Pin */
|
||||
GPIO_InitStruct.Pin = TP_RD_Pin|TP_CONVST_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
||||
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pin : TP_BUSY_Pin */
|
||||
GPIO_InitStruct.Pin = TP_BUSY_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
|
||||
|
||||
36
Src/main.c
36
Src/main.c
@@ -37,6 +37,8 @@
|
||||
#include "net_socket.h"
|
||||
#include "net_select.h"
|
||||
#include "ch395f_test.h"
|
||||
#include "app_main.h"
|
||||
#include "sys_clock.h"
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
@@ -118,6 +120,21 @@ int main(void)
|
||||
/* USER CODE BEGIN 2 */
|
||||
HAL_Delay(100);
|
||||
|
||||
/*
|
||||
* 时间子系统初始化(尽早完成,后续所有日志带时间戳)
|
||||
* sd2506_init() 从 RTC 读取初始时间
|
||||
* sys_clock_init() 将 RTC 时间转为 Unix epoch,建立墙钟基准
|
||||
*/
|
||||
app_main_init();
|
||||
sd2506_init();
|
||||
sys_clock_init();
|
||||
|
||||
/* RS-485 初始化(UART5 + PD0 方向控制) */
|
||||
rs485_init(&g_rs485, &huart5, ST_DIR4_GPIO_Port, ST_DIR4_Pin);
|
||||
DBG_INFO("RS485 init: OK (UART5, DE=PD0)");
|
||||
|
||||
/* 启动第一次 RS-485 接收 */
|
||||
rs485_receive_start(&g_rs485, g_rs485_rx_buf, RS485_RX_BUF_SIZE);
|
||||
/* BSD Socket API 初始化(包含 CH395F 复位/配置/协议栈初始化/多连接模式) */
|
||||
DBG_INFO("net init: %s",
|
||||
(net_init("192.168.1.100", "255.255.255.0", "192.168.1.1") == 0) ? "OK" : "FAIL");
|
||||
@@ -155,12 +172,8 @@ int main(void)
|
||||
DBG_INFO("ADC init: %s",
|
||||
(tp_ret == TPAFE5160_OK) ? "OK" : "TIMEOUT");
|
||||
|
||||
/* SD2506 RTC 初始化测试 */
|
||||
int sd_ret = sd2506_init();
|
||||
DBG_INFO("SD2506 init: %s",
|
||||
(sd_ret == SD2506_OK) ? "OK" : "I2C ERROR");
|
||||
|
||||
if (sd_ret == SD2506_OK) {
|
||||
/* SD2506 RTC 诊断信息 */
|
||||
{
|
||||
/* 读取 ID */
|
||||
uint8_t sd_id[8];
|
||||
sd2506_get_id(sd_id);
|
||||
@@ -188,13 +201,6 @@ int main(void)
|
||||
sd_vbat / 1000, (sd_vbat % 1000) / 10);
|
||||
}
|
||||
|
||||
/* RS-485 初始化(UART5 + PD0 方向控制) */
|
||||
rs485_init(&g_rs485, &huart5, ST_DIR4_GPIO_Port, ST_DIR4_Pin);
|
||||
DBG_INFO("RS485 init: OK (UART5, DE=PD0)");
|
||||
|
||||
/* 启动第一次 RS-485 接收 */
|
||||
rs485_receive_start(&g_rs485, g_rs485_rx_buf, RS485_RX_BUF_SIZE);
|
||||
|
||||
/* 创建 TCP Server Echo 测试 */
|
||||
{
|
||||
s_listen_sock = net_socket(NET_AF_INET, NET_SOCK_STREAM, 0);
|
||||
@@ -256,10 +262,8 @@ int main(void)
|
||||
/* USER CODE END WHILE */
|
||||
|
||||
/* USER CODE BEGIN 3 */
|
||||
/* 网络轮询已移到 FreeRTOS netTask 中 */
|
||||
;
|
||||
/* USER CODE END 3 */
|
||||
}
|
||||
/* USER CODE END 3 */
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
50
Src/spi.c
50
Src/spi.c
@@ -26,6 +26,8 @@
|
||||
|
||||
SPI_HandleTypeDef hspi1;
|
||||
SPI_HandleTypeDef hspi2;
|
||||
DMA_HandleTypeDef hdma_spi1_rx;
|
||||
DMA_HandleTypeDef hdma_spi1_tx;
|
||||
DMA_HandleTypeDef hdma_spi2_rx;
|
||||
DMA_HandleTypeDef hdma_spi2_tx;
|
||||
|
||||
@@ -47,7 +49,7 @@ void MX_SPI1_Init(void)
|
||||
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
|
||||
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
|
||||
hspi1.Init.NSS = SPI_NSS_SOFT;
|
||||
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
|
||||
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
|
||||
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
|
||||
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
|
||||
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
|
||||
@@ -119,6 +121,46 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
|
||||
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
|
||||
/* SPI1 DMA Init */
|
||||
/* SPI1_RX Init */
|
||||
hdma_spi1_rx.Instance = DMA2_Stream0;
|
||||
hdma_spi1_rx.Init.Channel = DMA_CHANNEL_3;
|
||||
hdma_spi1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
|
||||
hdma_spi1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||
hdma_spi1_rx.Init.MemInc = DMA_MINC_ENABLE;
|
||||
hdma_spi1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
||||
hdma_spi1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
||||
hdma_spi1_rx.Init.Mode = DMA_NORMAL;
|
||||
hdma_spi1_rx.Init.Priority = DMA_PRIORITY_LOW;
|
||||
hdma_spi1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
|
||||
if (HAL_DMA_Init(&hdma_spi1_rx) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
__HAL_LINKDMA(spiHandle,hdmarx,hdma_spi1_rx);
|
||||
|
||||
/* SPI1_TX Init */
|
||||
hdma_spi1_tx.Instance = DMA2_Stream3;
|
||||
hdma_spi1_tx.Init.Channel = DMA_CHANNEL_3;
|
||||
hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
|
||||
hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||
hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE;
|
||||
hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
||||
hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
||||
hdma_spi1_tx.Init.Mode = DMA_NORMAL;
|
||||
hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW;
|
||||
hdma_spi1_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
|
||||
if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
__HAL_LINKDMA(spiHandle,hdmatx,hdma_spi1_tx);
|
||||
|
||||
/* SPI1 interrupt Init */
|
||||
HAL_NVIC_SetPriority(SPI1_IRQn, 7, 0);
|
||||
HAL_NVIC_EnableIRQ(SPI1_IRQn);
|
||||
/* USER CODE BEGIN SPI1_MspInit 1 */
|
||||
|
||||
/* USER CODE END SPI1_MspInit 1 */
|
||||
@@ -215,6 +257,12 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle)
|
||||
*/
|
||||
HAL_GPIO_DeInit(GPIOB, GD_SCLK_Pin|GD_SO_Pin|GD_SI_Pin);
|
||||
|
||||
/* SPI1 DMA DeInit */
|
||||
HAL_DMA_DeInit(spiHandle->hdmarx);
|
||||
HAL_DMA_DeInit(spiHandle->hdmatx);
|
||||
|
||||
/* SPI1 interrupt Deinit */
|
||||
HAL_NVIC_DisableIRQ(SPI1_IRQn);
|
||||
/* USER CODE BEGIN SPI1_MspDeInit 1 */
|
||||
|
||||
/* USER CODE END SPI1_MspDeInit 1 */
|
||||
|
||||
@@ -55,8 +55,11 @@
|
||||
/* USER CODE END 0 */
|
||||
|
||||
/* External variables --------------------------------------------------------*/
|
||||
extern DMA_HandleTypeDef hdma_spi1_rx;
|
||||
extern DMA_HandleTypeDef hdma_spi1_tx;
|
||||
extern DMA_HandleTypeDef hdma_spi2_rx;
|
||||
extern DMA_HandleTypeDef hdma_spi2_tx;
|
||||
extern SPI_HandleTypeDef hspi1;
|
||||
extern SPI_HandleTypeDef hspi2;
|
||||
extern DMA_HandleTypeDef hdma_usart1_tx;
|
||||
extern DMA_HandleTypeDef hdma_usart1_rx;
|
||||
@@ -211,6 +214,20 @@ void EXTI9_5_IRQHandler(void)
|
||||
/* USER CODE END EXTI9_5_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles SPI1 global interrupt.
|
||||
*/
|
||||
void SPI1_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN SPI1_IRQn 0 */
|
||||
|
||||
/* USER CODE END SPI1_IRQn 0 */
|
||||
HAL_SPI_IRQHandler(&hspi1);
|
||||
/* USER CODE BEGIN SPI1_IRQn 1 */
|
||||
|
||||
/* USER CODE END SPI1_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles SPI2 global interrupt.
|
||||
*/
|
||||
@@ -309,6 +326,20 @@ void TIM7_IRQHandler(void)
|
||||
/* USER CODE END TIM7_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles DMA2 stream0 global interrupt.
|
||||
*/
|
||||
void DMA2_Stream0_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN DMA2_Stream0_IRQn 0 */
|
||||
|
||||
/* USER CODE END DMA2_Stream0_IRQn 0 */
|
||||
HAL_DMA_IRQHandler(&hdma_spi1_rx);
|
||||
/* USER CODE BEGIN DMA2_Stream0_IRQn 1 */
|
||||
|
||||
/* USER CODE END DMA2_Stream0_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles DMA2 stream2 global interrupt.
|
||||
*/
|
||||
@@ -323,6 +354,20 @@ void DMA2_Stream2_IRQHandler(void)
|
||||
/* USER CODE END DMA2_Stream2_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles DMA2 stream3 global interrupt.
|
||||
*/
|
||||
void DMA2_Stream3_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN DMA2_Stream3_IRQn 0 */
|
||||
|
||||
/* USER CODE END DMA2_Stream3_IRQn 0 */
|
||||
HAL_DMA_IRQHandler(&hdma_spi1_tx);
|
||||
/* USER CODE BEGIN DMA2_Stream3_IRQn 1 */
|
||||
|
||||
/* USER CODE END DMA2_Stream3_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles DMA2 stream7 global interrupt.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user