freertos_f407/User/board/board.c

291 lines
8.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "board.h"
#include "bsp.h"
#include "main.h"
#include "rtc.h"
#include "spi.h"
board_t board;
void led_open(led_e led)
{
switch (led)
{
case LED_USER:
GPIO_SET(LED_USER_GPIO_Port, LED_USER_Pin);
break;
default:
break;
}
}
void led_close(led_e led)
{
switch (led)
{
case LED_USER:
GPIO_RESET(LED_USER_GPIO_Port, LED_USER_Pin);
break;
default:
break;
}
}
void led_toggle(led_e led)
{
switch (led)
{
case LED_USER:
GPIO_TOGGLE(LED_USER_GPIO_Port, LED_USER_Pin);
break;
default:
break;
}
}
/**
* @brief RTC写入后备区域SRAM
* @param bkrx : 后备区寄存器编号,范围:0~31
* @param data : 要写入的数据,32位长度
* @retval 无
*/
void rtc_write_bkr(uint32_t bkrx, uint32_t data)
{
HAL_PWR_EnableBkUpAccess(); /* 取消备份区写保护 */
HAL_RTCEx_BKUPWrite(&hrtc, bkrx, data);
}
/**
* @brief RTC读取后备区域SRAM
* @param bkrx : 后备区寄存器编号,范围:0~31
* @retval 读取到的值
*/
static uint32_t rtc_read_bkr(uint32_t bkrx)
{
uint32_t temp = 0;
temp = RTC_BASE + 0x50 + bkrx * 4;
return (*(uint32_t *)temp); /* 返回读取到的值 */
}
BOOL rtc_set_time(rtc_time_t time, uint8_t ampm)
{
RTC_TimeTypeDef rtc_time;
rtc_time.Hours = time.hour;
rtc_time.Minutes = time.minute;
rtc_time.Seconds = time.second;
rtc_time.TimeFormat = ampm;
rtc_time.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
rtc_time.StoreOperation = RTC_STOREOPERATION_RESET;
return HAL_RTC_SetTime(&hrtc, &rtc_time, RTC_FORMAT_BIN) == HAL_OK;
}
BOOL rtc_set_date(rtc_date_t date)
{
RTC_DateTypeDef rtc_date;
rtc_date.Month = date.month;
rtc_date.Date = date.day;
rtc_date.Year = date.year;
rtc_date.WeekDay = date.weekday;
return HAL_RTC_SetDate(&hrtc, &rtc_date, RTC_FORMAT_BIN) == HAL_OK;
}
void rtc_update(void)
{
RTC_DateTypeDef rtc_date;
RTC_TimeTypeDef rtc_time;
HAL_RTC_GetTime(&hrtc, &rtc_time, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &rtc_date, RTC_FORMAT_BIN);
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.day = rtc_date.Date;
board.rtc_date.year = rtc_date.Year;
}
BOOL rtc_init(void)
{
uint16_t bkpflag = 0;
/* 检查是不是第一次配置时钟 */
bkpflag = rtc_read_bkr(RTC_BKP_DR0); /* 读取BKP0的值 */
if ((bkpflag != 0x5050) && (bkpflag != 0x5051)) /* 之前未初始化过, 重新配置 */
{
rtc_date_t date;
rtc_time_t time;
date.year = 25;
date.month = 1;
date.day = 1;
date.weekday = get_weekday(date.year, date.month, date.day);
time.hour = 0;
time.minute = 0;
time.second = 0;
rtc_set_time(time, RTC_HOURFORMAT12_AM); /* 设置时间, 根据实际时间修改 */
rtc_set_date(date); /* 设置日期 */
rtc_write_bkr(RTC_BKP_DR0, 0x5051); /* 写入标记位 */
}
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); // 设置画笔颜色
uint8_t hight_offset = 70;
board.lcd->driver.set_color(board.lcd, LIGHT_BLUE); // 设置画笔颜色
board.lcd->driver.display_text(board.lcd, 13, hight_offset, "STM32 RTC测试");
board.lcd->driver.set_color(board.lcd, LIGHT_YELLOW); // 设置画笔颜色
board.lcd->driver.display_text(board.lcd, 13, hight_offset + board.lcd->info.hz_font->height, "屏幕分辨率:240*240");
board.lcd->driver.set_color(board.lcd, LIGHT_RED); // 设置画笔颜色
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, hight_offset + board.lcd->info.hz_font->height * 2, buf);
}
// 清屏测试
void lcd_test_clear(void)
{
uint8_t i = 0; // 计数变量
board.lcd->driver.set_hz_font(board.lcd, &ch_font_24); // 设置汉字字体
board.lcd->driver.set_color(board.lcd, LCD_BLACK); // 设置画笔颜色
for (i = 0; i < 8; i++)
{
switch (i) // 切换背景色
{
case 0:
board.lcd->driver.full_fill(board.lcd, LIGHT_RED);
break;
case 1:
board.lcd->driver.full_fill(board.lcd, LIGHT_GREEN);
break;
case 2:
board.lcd->driver.full_fill(board.lcd, LIGHT_BLUE);
break;
case 3:
board.lcd->driver.full_fill(board.lcd, LIGHT_YELLOW);
break;
case 4:
board.lcd->driver.full_fill(board.lcd, LIGHT_CYAN);
break;
case 5:
board.lcd->driver.full_fill(board.lcd, LIGHT_GREY);
break;
case 6:
board.lcd->driver.full_fill(board.lcd, LIGHT_MAGENTA);
break;
case 7:
board.lcd->driver.full_fill(board.lcd, LCD_WHITE);
break;
default:
break;
}
board.lcd->driver.clear(board.lcd); // 清屏
board.lcd->driver.display_text(board.lcd, 13, 70, "STM32 刷屏测试");
board.lcd->driver.display_text(board.lcd, 13, 106, "屏幕分辨率:240*240");
board.lcd->driver.display_text(board.lcd, 13, 142, "控制器:ST7789");
HAL_Delay(1000); // 延时
}
}
// 文本测试
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;
gpios.cs = gpio_create(LCD_CS_GPIO_Port, LCD_CS_Pin);
gpios.dc = gpio_create(LCD_DC_GPIO_Port, LCD_DC_Pin);
// 初始化LCD相关的SPI
lcd_info_t info = {
.spi = spi_create(SPI_TYPE_LCD, gpios, 0), // 创建SPI总线
.dir = Direction_V, // 设置显示方向为横向
.width = COL_DOT_MAX_240, // 设置LCD最大宽度为400列
.height = LIN_DOT_MAX_240, // 设置LCD最大高度为240行
.retransmission_count = 3, // 设置重传次数为3次
.disp = NULL,
};
info.spi->interface.hardware_enable(info.spi, &hspi3);
board.lcd = lcd_create(info);
DBG_ASSERT(board.lcd != NULL __DBG_LINE);
board.lcd->info.spi->gpios.dc->set(*board.lcd->info.spi->gpios.dc); // DC引脚拉高默认处于写数据状态
board.lcd->info.spi->gpios.cs->set(*board.lcd->info.spi->gpios.cs); // 拉高片选,禁止通信
LCD_BACKLIGHT_OFF; // 先关闭背光,初始化完成之后再打开
board.lcd->driver.init(board.lcd);
LCD_BACKLIGHT_ON;
// lcd_test_clear();
// lcd_test_text();
}
/**
* @brief 初始化显示板
*
*/
void board_init(void)
{
lcd_init();
rtc_init();
sd_init();
// sd_fatfs_test();
}