指定SRAM2

This commit is contained in:
许晟昊 2025-01-22 09:28:56 +08:00
parent 7bd9f1376a
commit 344eeb0ee4
19 changed files with 2604 additions and 2462 deletions

View File

@ -103,6 +103,8 @@ int main(void)
MX_USART1_UART_Init();
MX_SPI3_Init();
/* USER CODE BEGIN 2 */
my_mem_init(SRAMIN); // Initialize internal memory pool 1
my_mem_init(SRAMEX); // Initialize external memory pool 2
board_init();
app_init();
/* USER CODE END 2 */
@ -143,7 +145,7 @@ void SystemClock_Config(void)
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
@ -159,8 +161,7 @@ void SystemClock_Config(void)
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
@ -189,7 +190,8 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
/* USER CODE BEGIN Callback 0 */
/* USER CODE END Callback 0 */
if (htim->Instance == TIM6) {
if (htim->Instance == TIM6)
{
HAL_IncTick();
}
/* USER CODE BEGIN Callback 1 */

15
MDK-ARM/.gitignore vendored Normal file
View File

@ -0,0 +1,15 @@
# dot files
/.vscode/launch.json
/.settings
/.eide/log
/.eide.usr.ctx.json
# project out
/build
/bin
/obj
/out
# eide template
*.ept
*.eide-template

View File

@ -1297,8 +1297,8 @@
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\system\lib\lcd\lcd_154.c</PathWithFileName>
<FilenameWithoutPath>lcd_154.c</FilenameWithoutPath>
<PathWithFileName>..\User\system\lib\lcd\lcds.c</PathWithFileName>
<FilenameWithoutPath>lcds.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
@ -1309,8 +1309,8 @@
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\system\lib\lcd\lcds.c</PathWithFileName>
<FilenameWithoutPath>lcds.c</FilenameWithoutPath>
<PathWithFileName>..\User\system\lib\lcd\lcd_font.c</PathWithFileName>
<FilenameWithoutPath>lcd_font.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
@ -1321,8 +1321,8 @@
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\system\lib\lcd\lcd_font.c</PathWithFileName>
<FilenameWithoutPath>lcd_font.c</FilenameWithoutPath>
<PathWithFileName>..\User\system\lib\lcd\lcd_tft_154.c</PathWithFileName>
<FilenameWithoutPath>lcd_tft_154.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>

View File

@ -2792,11 +2792,6 @@
<Group>
<GroupName>User/system/lib/lcd</GroupName>
<Files>
<File>
<FileName>lcd_154.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\system\lib\lcd\lcd_154.c</FilePath>
</File>
<File>
<FileName>lcds.c</FileName>
<FileType>1</FileType>
@ -2807,6 +2802,11 @@
<FileType>1</FileType>
<FilePath>..\User\system\lib\lcd\lcd_font.c</FilePath>
</File>
<File>
<FileName>lcd_tft_154.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\system\lib\lcd\lcd_tft_154.c</FilePath>
</File>
</Files>
</Group>
<Group>

File diff suppressed because it is too large Load Diff

BIN
Public/IO复用说明.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
Public/stm32f407勘误.pdf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -8,7 +8,9 @@ void business_task(void *pvParameters)
for (;;)
{
rtc_update();
lcd_rtc_test();
led_toggle(LED_USER);
vTaskDelay(1000);
}
}

View File

@ -97,14 +97,14 @@ void rtc_update(void)
HAL_RTC_GetTime(&hrtc, &rtc_time, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &rtc_date, RTC_FORMAT_BIN);
board.rtc_time.Hours = rtc_time.Hours;
board.rtc_time.Minutes = rtc_time.Minutes;
board.rtc_time.Seconds = rtc_time.Seconds;
board.rtc_time.hour = rtc_time.Hours;
board.rtc_time.minute = rtc_time.Minutes;
board.rtc_time.second = rtc_time.Seconds;
board.rtc_date.WeekDay = rtc_date.WeekDay;
board.rtc_date.Month = rtc_date.Month;
board.rtc_date.Date = rtc_date.Date;
board.rtc_date.Year = rtc_date.Year;
board.rtc_date.weekday = rtc_date.WeekDay;
board.rtc_date.month = rtc_date.Month;
board.rtc_date.day = rtc_date.Date;
board.rtc_date.year = rtc_date.Year;
}
BOOL rtc_init(void)
@ -135,6 +135,21 @@ BOOL rtc_init(void)
return TRUE;
}
void lcd_rtc_test(void)
{
char buf[128] = {0}; // 缓冲区
board.lcd->driver.set_hz_font(board.lcd, &ch_font_24); // 设置汉字字体
board.lcd->driver.full_fill(board.lcd, LCD_BLACK); // 设置背景色
board.lcd->driver.set_color(board.lcd, LCD_WHITE); // 设置画笔颜色
board.lcd->driver.display_text(board.lcd, 13, 70, "STM32 RTC测试");
board.lcd->driver.display_text(board.lcd, 13, 106, "屏幕分辨率:240*240");
board.lcd->driver.set_asscii_font(board.lcd, &ascii_font_20);
sprintf(buf, "%d-%02d-%02d %02d:%02d:%02d", 2000 + board.rtc_date.year, board.rtc_date.month, board.rtc_date.day, board.rtc_time.hour, board.rtc_time.minute, board.rtc_time.second);
board.lcd->driver.display_text(board.lcd, 13, 142, buf);
}
// 清屏测试
void lcd_test_clear(void)
{
@ -181,6 +196,57 @@ void lcd_test_clear(void)
}
}
// 文本测试
void lcd_test_text(void)
{
board.lcd->driver.clear(board.lcd); // 清屏
board.lcd->driver.full_fill(board.lcd, LCD_BLACK);
board.lcd->driver.set_color(board.lcd, LCD_WHITE);
board.lcd->driver.set_asscii_font(board.lcd, &ascii_font_32);
board.lcd->driver.display_text(board.lcd, 0, 0, "!#$'()*+,-.0123");
board.lcd->driver.set_asscii_font(board.lcd, &ascii_font_24);
board.lcd->driver.display_text(board.lcd, 0, 32, "!#$'()*+,-.012345678");
board.lcd->driver.set_asscii_font(board.lcd, &ascii_font_20);
board.lcd->driver.display_text(board.lcd, 0, 56, "!#$'()*+,-.0123456789:;<");
board.lcd->driver.set_asscii_font(board.lcd, &ascii_font_16);
board.lcd->driver.display_text(board.lcd, 0, 76, "!#$'()*+,-.0123456789:;<=>?@AB");
board.lcd->driver.set_asscii_font(board.lcd, &ascii_font_12);
board.lcd->driver.display_text(board.lcd, 0, 92, "!#$'()*+,-.0123456789:;<=>?@ABCDEFGHIJKL");
board.lcd->driver.set_color(board.lcd, LCD_CYAN);
board.lcd->driver.set_asscii_font(board.lcd, &ascii_font_12);
board.lcd->driver.display_text(board.lcd, 0, 104, "!#&'()*+,-.0123456789:;<=>?@ABCDEFGHIJKL");
board.lcd->driver.set_asscii_font(board.lcd, &ascii_font_16);
board.lcd->driver.display_text(board.lcd, 0, 116, "!#&'()*+,-.0123456789:;<=>?@AB");
board.lcd->driver.set_asscii_font(board.lcd, &ascii_font_20);
board.lcd->driver.display_text(board.lcd, 0, 132, "!#&'()*+,-.0123456789:;<");
board.lcd->driver.set_asscii_font(board.lcd, &ascii_font_24);
board.lcd->driver.display_text(board.lcd, 0, 152, "!#&'()*+,-.012345678");
board.lcd->driver.set_asscii_font(board.lcd, &ascii_font_32);
board.lcd->driver.display_text(board.lcd, 0, 176, "!#&'()*+,-.0123");
}
// 变量测试,包括整数和小数
void lcd_test_var(void)
{
}
// 颜色测试
void lcd_test_color(void)
{
}
// 2D图形绘制
void lcd_test_2d(void)
{
}
// 图片显示
void lcd_test_image(void)
{
}
void lcd_init(void)
{
spi_gpio_group_t gpios;
@ -188,7 +254,6 @@ void lcd_init(void)
gpios.dc = gpio_create(LCD_DC_GPIO_Port, LCD_DC_Pin);
// 初始化LCD相关的SPI
lcd_info_t info = {
.type = LCD_154, // ÉèÖÃLCDÀàÐÍΪST7525
.spi = spi_create(SPI_TYPE_LCD, gpios, 0), // 创建SPI总线
.dir = Direction_V, // 设置显示方向为横向
.width = COL_DOT_MAX_240, // 设置LCD最大宽度为400列
@ -206,7 +271,8 @@ void lcd_init(void)
board.lcd->driver.init(board.lcd);
LCD_BACKLIGHT_ON;
lcd_test_clear();
// lcd_test_clear();
// lcd_test_text();
}
/**

View File

@ -30,8 +30,8 @@ typedef enum
typedef struct
{
uint16_t adc_raw[ADC1_MAX];
RTC_DateTypeDef rtc_date;
RTC_TimeTypeDef rtc_time;
rtc_date_t rtc_date;
rtc_time_t rtc_time;
lcd_t *lcd;
} board_t;
@ -45,5 +45,5 @@ void led_toggle(led_e led);
void rtc_update(void);
BOOL rtc_set_time(rtc_time_t time, uint8_t ampm);
BOOL rtc_set_date(rtc_date_t date);
void lcd_rtc_test(void);
#endif

View File

@ -15,12 +15,12 @@
// mem1内存参数设定.mem1完全处于内部SRAM里面.(设置内部SARM的内存池和内存表的参数)
#define MEM1_BLOCK_SIZE 8 // 一个内存块大小为32字节
#define MEM1_MAX_SIZE 8 * 1024 // 最大管理内存 1K (我们这个内存管理系统的内部SRAM可控制的内存大小)
#define MEM1_MAX_SIZE 32 * 1024 // 最大管理内存 1K (我们这个内存管理系统的内部SRAM可控制的内存大小)
#define MEM1_ALLOC_TABLE_SIZE MEM1_MAX_SIZE / MEM1_BLOCK_SIZE // 内存表大小(有多少块内存块)
// mem2内存参数设定.mem2的内存池处于外部SRAM里面
#define MEM2_BLOCK_SIZE 8 // 一个内存块大小为32字节
#define MEM2_MAX_SIZE 0 * 1024 // 因为精英版没有外扩内存,故这里设置一个最小值
#define MEM2_MAX_SIZE 16 * 1024 // 因为精英版没有外扩内存,故这里设置一个最小值
#define MEM2_ALLOC_TABLE_SIZE MEM2_MAX_SIZE / MEM2_BLOCK_SIZE // 内存表大小
// 内存管理控制器结构体

View File

@ -1,4 +1,4 @@
#include "lcd_154.h"
#include "lcd_tft_154.h"
#define FILL_ZERO 0 // 填充0
#define FILL_SPACE 1 // 填充空格
@ -8,7 +8,7 @@
// 因此开辟一片缓冲区,先将需要显示的数据写进缓冲区,最后再批量写入显存。
// 用户可以根据实际情况去修改此处缓冲区的大小,
// 例如用户需要显示32*32的汉字时需要的大小为 32*32*2 = 2048 字节每个像素点占2字节
static uint16_t pri[1024]; // 显示缓存
static uint16_t *pri; // 显示缓存
// 等待通讯完成
static void _wait_finish(spi_t *lcd_spi)
@ -331,6 +331,8 @@ static void _clear(lcd_t *lcd)
static int32_t _init(lcd_t *lcd)
{
HAL_Delay(10);
pri = (uint16_t *)osel_mem_alloc2(1024 * sizeof(lcd));
lcd->info.pri = (void *)pri;
lcd->info.spi->gpios.cs->reset(*lcd->info.spi->gpios.cs);
_write_command(lcd->info.spi, 0x36); // 显存访问控制 指令,用于设置访问显存的方式
_write_data_8bit(lcd->info.spi, 0x00); // 配置成 从上到下、从左到右RGB像素格式
@ -424,28 +426,17 @@ static int32_t _init(lcd_t *lcd)
return 0;
}
void lcd_154_init(lcd_driver_t *driver)
void lcd_tft_154_init(lcd_driver_t *driver)
{
DBG_ASSERT(driver != NULL __DBG_LINE);
driver->init = _init; // 已实现
// driver->set_point = _set_point; // 已实现
// driver->get_point = _get_point; // 已实现
// driver->color_fill = _color_fill; // 已实现
// driver->onoff = _onoff; // 已实现
driver->set_dir = _set_dir; // 已实现
driver->set_color = _set_color; // 已实现
driver->set_address = _set_address; // 已实现
driver->set_asscii_font = _set_asscii_font; // 已实现
driver->set_hz_font = _set_hz_font; // 已实现
driver->display_text = _display_text; // 已实现
// driver->get_dir = _get_dir; // 已实现
// driver->flush = _flush; // 已实现
// driver->flush_clear = _flush_clear; // 已实现
driver->clear = _clear; // 已实现
// driver->set_clear_flag = _set_clear_flag; // 已实现
// driver->get_clear_flag = _get_clear_flag; // 已实现
driver->full_fill = _full_fill; // 已实现
// driver->copy_template = _copy_template; // 已实现
// driver->clear_ram = _clear_ram; // 已实现
}

View File

@ -3,6 +3,6 @@
// 彩色液晶屏驱动-基于1.54寸240x240分辨率
#include "lcds.h"
extern void lcd_154_init(lcd_driver_t *driver);
extern void lcd_tft_154_init(lcd_driver_t *driver);
#endif // __LCD_154_H

View File

@ -9,7 +9,7 @@
#include "lcds.h"
#include "lcd_st7525.h"
#include "lcd_sharp.h"
#include "lcd_154.h"
#include "lcd_tft_154.h"
#include <string.h>
#define BACK_COLOR WHITE
@ -28,7 +28,7 @@ lcd_t *lcd_create(lcd_info_t info)
DBG_ASSERT(handle != NULL __DBG_LINE);
osel_memcpy((uint8_t *)&handle->info, (uint8_t *)&info, sizeof(lcd_info_t));
handle->driver.idel = TRUE;
switch (info.type)
switch (LCD_MODE)
{
case LCD_ST7525:
// lcd_st7525_init(&handle->driver);
@ -36,8 +36,8 @@ lcd_t *lcd_create(lcd_info_t info)
case LCD_SHARP:
// lcd_sharp_init(&handle->driver);
break;
case LCD_154:
lcd_154_init(&handle->driver);
case LCD_TFT_154:
lcd_tft_154_init(&handle->driver);
break;
default:
lcd_free(handle);

View File

@ -39,7 +39,11 @@
#include "spis.h"
#include "lcd_font.h"
#define USE_UCGUI (1) // 0不使用1:使用uc-gui
#define LCD_ST7525 0
#define LCD_SHARP 1
#define LCD_TFT_154 2
#define LCD_MODE LCD_TFT_154
// 列点阵数
#define COL_DOT_MAX_128 128
@ -50,11 +54,10 @@
#define LIN_DOT_MAX_64 64
#define LIN_DOT_MAX_240 240
#if 0
#if LCD_MODE == LCD_SHARP
#define USE_UCGUI (1) // 0不使用1:使用uc-gui
#define H_LCD 0 // 竖屏
#define W_LCD 1 // 横屏
// 画笔颜色
/*
@ -85,10 +88,25 @@
#define LGRAY 0XC618 // 浅灰色(PANNEL),窗体背景色
#define LGRAYBLUE 0XA651 // 浅灰蓝色(中间层颜色)
#define LBBLUE 0X2B12 // 浅棕蓝色(选择条目的反色)
#if !USE_UCGUI
// 对齐方式
#define GUI_TA_LEFT BIT1 // 左对齐
#define GUI_TA_HCENTER BIT2 // 居中对齐
#define GUI_TA_RIGHT BIT3 // 右对齐
#define GUI_TA_NORMOL BIT4 // 不对齐
// 显示模式
#define GUI_TEXTMODE_NORMAL BIT0 // 正常
#define GUI_TEXTMODE_REVERSE BIT1 // 反显
#define GUI_TEXTMODE_UNDERLINE BIT2 // 下线
#define GUI_TEXTMODE_XOR BIT3 //
#else
#include "GUI.h"
#define GUI_TA_NORMOL BIT4 // 不对齐
#endif
#elif LCD_MODE == LCD_TFT_154
// 显示方向参数
#define Direction_H 0 // LCD横屏显示
#define Direction_H_Flip 1 // LCD横屏显示,上下翻转
#define Direction_V 2 // LCD竖屏显示
@ -125,29 +143,9 @@
#define DARK_MAGENTA 0x800080 // 暗紫红色
#define DARK_YELLOW 0x808000 // 暗黄色
#define DARK_GREY 0x404040 // 暗灰色
#if !USE_UCGUI
// 对齐方式
#define GUI_TA_LEFT BIT1 // 左对齐
#define GUI_TA_HCENTER BIT2 // 居中对齐
#define GUI_TA_RIGHT BIT3 // 右对齐
#define GUI_TA_NORMOL BIT4 // 不对齐
// 显示模式
#define GUI_TEXTMODE_NORMAL BIT0 // 正常
#define GUI_TEXTMODE_REVERSE BIT1 // 反显
#define GUI_TEXTMODE_UNDERLINE BIT2 // 下线
#define GUI_TEXTMODE_XOR BIT3 //
#else
#include "GUI.h"
#define GUI_TA_NORMOL BIT4 // 不对齐
#endif
typedef enum
{
LCD_ST7525,
LCD_SHARP,
LCD_154,
} lcd_type_e;
typedef struct LCDS lcd_t;
typedef enum
{
@ -156,11 +154,8 @@ typedef enum
TEMPLATE_COPY_CLEAR, // 清空pri_template
} template_copy_type_e; // 0,拷贝pri_template到pri1拷贝pri到pri_template; 其余清空
typedef struct LCDS lcd_t;
typedef struct
{
lcd_type_e type;
spi_t *spi;
gpio_t *disp;

View File

@ -47,7 +47,7 @@ sizeof(B) = 8(内存空间大小8个字节)
// 内存池(32字节对齐)
// 可控制的内存大小
__attribute__((aligned(32))) uint8_t mem1base[MEM1_MAX_SIZE]; // 内部SRAM内存池
__attribute__((aligned(32))) uint8_t mem2base[MEM2_MAX_SIZE] __attribute__((section(".sram2")));
__attribute__((aligned(32))) uint8_t mem2base[MEM2_MAX_SIZE] __attribute__((at(0x2001C000UL)));
// __attribute__((aligned(32))) uint8_t mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000))); // 外部SRAM内存池
// 内存管理表
// 可控制的内存控制块个数(每个内存块大小为32字节)