受论坛大佬启发
看大家用 f1c100 做街机做的挺爽,特别是受司徒大神启发,见原帖:https://whycan.com/t_6945.html
本人对蓝牙不了解,所以先决定做个有线的练练手也好。
原材料
材料1:Fundiuno joystick shield,请自行搜索,价格基本上几块钱。
材料2:STM32最小系统板,也请自行搜索
接线
joystick接线方法如下:
stm32接线方法:
//Funduino joystick 所用到的所有IO定义如下
/*
PA0 Y (模拟) 2路ADC
PA1 X (模拟)
PA2 A 6个按钮
PA3 B
PA4 C
PA5 D
PA6 E
PA7 F
PB0 K 1个按钮当Z轴
*/
#define BTN1_Pin GPIO_PIN_2
#define BTN1_GPIO_Port GPIOA
#define BTN2_Pin GPIO_PIN_3
#define BTN2_GPIO_Port GPIOA
#define BTN3_Pin GPIO_PIN_4
#define BTN3_GPIO_Port GPIOA
#define BTN4_Pin GPIO_PIN_5
#define BTN4_GPIO_Port GPIOA
#define BTN5_Pin GPIO_PIN_6
#define BTN5_GPIO_Port GPIOA
#define BTN6_Pin GPIO_PIN_7
#define BTN6_GPIO_Port GPIOA
//6个按钮定义完成
//K键=Z
#define BTNK_Pin GPIO_PIN_0
#define BTNK_GPIO_Port GPIOB
接线实物
joystick端:
stm32端:
程序源码
程序来源于github, 这是原版:https://github.com/vostrenkov/EazyJoy
Is there a user manual of f1c100,not f1c100s?
dont care about the postfix
if you need a user manual, you can download DKTool, the manual is include in the software.
DKTool : https://whycan.com/t_5733.html
板子
单片机:STM32F446
PSRAM: APS6404L (PageSize=1024Bytes)
硬件接线
PB2: QSPI_CLK 6
PC11: QSPI_NCS 1
PE7: QSPI_IO0 5
PE8: QSPI_IO1 2
PE9: QSPI_IO2 3
PE10: QSPI_IO3 7
软件环境
HAL库
问题:
1: 能通信上,但QPI模式只能工作在2线数据, 4线数据则数据不正确
2: 写入后立即读出同一地址的数据没问题;但往前读则读到的数据是最后写入的数据
猜测是Page的机制问题,如何跨页读取?
初始化代码:
int QSPI_PSRAM_Init(void)
{
QSPIHandle.Instance = QUADSPI;
QSPIHandle.Init.ClockPrescaler = 2;
QSPIHandle.Init.FifoThreshold = 4;
QSPIHandle.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_NONE;
QSPIHandle.Init.FlashSize = 22;//64Mbits=8Mbtye=2^23.size取22。
QSPIHandle.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_2_CYCLE;
QSPIHandle.Init.ClockMode = QSPI_CLOCK_MODE_0;
QSPIHandle.Init.FlashID = QSPI_FLASH_ID_2;
QSPIHandle.Init.DualFlash = QSPI_DUALFLASH_DISABLE; //禁止双闪存模式
if (HAL_QSPI_Init(&QSPIHandle) != HAL_OK)
{
return PSRAM_ERR_INIT;
}
QSPI_PSRAM_Resetenable(&QSPIHandle);
QSPI_PSRAM_Reset(&QSPIHandle);
HAL_Delay(1);
return PSRAM_OK;
}
void HAL_QSPI_MspInit(QSPI_HandleTypeDef* hqspi)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
//static DMA_HandleTypeDef hdma;
if(hqspi->Instance==QUADSPI)
{
/* USER CODE END QUADSPI_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_QSPI_CLK_ENABLE();
/* Reset the QuadSPI memory interface */
__HAL_RCC_QSPI_FORCE_RESET();
__HAL_RCC_QSPI_RELEASE_RESET();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
/* Enable DMA clock */
QSPI_DMA_CLK_ENABLE();
/**QUADSPI GPIO Configuration
PB2 ------> QUADSPI_CLK
PE7 ------> QUADSPI_BK2_IO0
PE8 ------> QUADSPI_BK2_IO1
PE9 ------> QUADSPI_BK2_IO2
PE10 ------> QUADSPI_BK2_IO3
PC11 ------> QUADSPI_BK2_NCS
*/
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF9_QSPI;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL; //GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF10_QSPI;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF9_QSPI;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/* USER CODE BEGIN QUADSPI_MspInit 1 */
/* USER CODE END QUADSPI_MspInit 1 */
HAL_NVIC_SetPriority(QUADSPI_IRQn, 0x0F, 0);
HAL_NVIC_EnableIRQ(QUADSPI_IRQn);
//中断使能
//__HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);
}
}
读写代码
int QSPI_PSRAM_ReadPage(QSPI_HandleTypeDef *hQspi,uint8_t *pData,uint32_t FirstAddr, uint32_t BufSize)
{
QSPI_Send_CMD(hQspi,PSRAM_CMD_READ_QUAD,FirstAddr,PSRAM_QPI_READ_DUMCYCLES,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_1_LINE,QSPI_ADDRESS_24_BITS,QSPI_DATA_2_LINES,BufSize);
return _Read(hQspi,pData);
}
int QSPI_PSRAM_WritePage(QSPI_HandleTypeDef *hQspi,uint8_t *pData,uint32_t FirstAddr, uint32_t BufSize)
{
QSPI_Send_CMD(hQspi,PSRAM_CMD_WRITE_QUAD,FirstAddr,PSRAM_QPI_WRITE_DUMCYCLES,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_1_LINE,QSPI_ADDRESS_24_BITS,QSPI_DATA_2_LINES,BufSize);
hQspi->Instance->DLR = BufSize-1;
return _Write(hQspi,pData);
}
测试代码:
这样读写是成功的:
for (i=0; i<8; i++)
{
memset(temp,i%0xff,1024);
r1 = QSPI_PSRAM_WritePage(&QSPIHandle,(uint8_t*)temp,i*1024,1024);
memset(temp, 0, 1024);
r1 = QSPI_PSRAM_ReadPage(&QSPIHandle,(uint8_t*)temp, i*1024, 1024);
//测试发现:写1块立即读该块,都是成功的!
if (temp[123]!=(i%0xff))
{
e++;
printf("err:%d times, i=%d -->",e, i); //只要不打这个就是好的
}
}
这样写,再读,读到的数据就总是最后写入的数据:
//写入:
for (i=0; i<8; i++)
{
memset(temp,i%0xff,1024);
QSPI_PSRAM_WritePage(&QSPIHandle,(uint8_t*)temp,i*1024,1024);
}
//读出:
for (i=0; i<8; i++)
{
memset(temp, 0, 1024);
QSPI_PSRAM_ReadPage(&QSPIHandle,(uint8_t*)temp, i*1024, 1024);
if (temp[30]!=(i%0xff))
{
printf("%4d: ",i*1024);
ShowBuffer(temp,32);
}
}
@楼上: 大把裸机例程。翻下之前的帖子。
这里有个可用的:
https://gitee.com/xuyao2020/F1C100s_with_Keil_RTX4_emWin5
是群里大神写的,你下载试试,我测过可用哦。
移植LVGL8
把 lvgl 8.3 移上去。能显示一帧,然后就不再显示。
对 lvgl 底层原理不甚了解,暂时未解决。
移植LVGL6
暂不知道如何解决ver8.x只显示一帧的问题
再移植一个6.x试试,仍然只显示一帧
我在这里打印出一个点,发现串口一直有收到,说明程序是没有死的
void UserEntryLoop(void)
{
for (;;) {
target_wdt_feed();
// 循环间隔
sys_delay(5);
lv_task_handler();
lcnt++;
if (lcnt>=100) {
printf(".");
lcnt = 0;
}
}
}
哪位知道为啥只绘一帧?
起因:
一直想找一块简单好用的ARM板子,只做显示和简单应用
有一天在某宝上搜各种派时,发现荔枝派这个好东西...
当时好想买来玩一玩,可惜不配大屏,自己点屏又没信心
进而搜到本网站,只是一直不敢下决心买来测试,只是默默的看各位大神的表演
好久以后:
早几天没事搜搜某鱼,发现有人卖这个:
于是问卖家是什么芯片的,卖家看了一下,回我说 F1C600
what how ? 这么简单就找到了?简直不敢相信
于是,果断下单买之。。。
研究阶段:
没几天就到货了,卖家诚不欺我。果然是F1C600
仔细对比了一下线路图和原理图,发现居然USB口已经预留出来了
焊上排针,做了一个USB座子。
按照之前帖子的方法,把MISO也引出来,方便随时能拉低。
USB是4根线,不接VCC没事的,实际就用3根:
拉低,再开机,usb马上找到!太好了!!
接着下载大神的裸奔程序:
重新开机:
修改记录:
大神的裸奔程序地址:
https://gitee.com/xuyao2020/F1C100s_with_Keil_RTX4_emWin5?_from=gitee_search
由于原来只支持800*480显示屏,目前这块板子配的是 1024*600 的,需要稍稍修改下代码。
代码不多,就几行:
第1处修改:位于:lcd_cfg.h
#define LCD_PANEL_XSIZE (1024)
#define LCD_PANEL_YSIZE (600)
#define LCD_PANEL_BITPP (16)
#define LCD_PANEL_BYTEPP (2)
第2处修改:位于:fb_f1c100s.c 第40行后面新增
#if (LCD_PANEL_XSIZE == 1024) && (LCD_PANEL_YSIZE == 600)
#define FB_LCD_XSIZE (LCD_PANEL_XSIZE)
#define FB_LCD_YSIZE (LCD_PANEL_YSIZE)
#define LCD_CTRL_BPP (LCD_PANEL_BITPP)
#define LCD_BYTE_PP (LCD_PANEL_BYTEPP)
#define PIXEL_CLOCK (33000000)
#endif
存在的问题:
跑emwin动画时速度有点卡,也许是没有开双缓冲。
fb时钟跑33M以上就黑屏了。
Red和Blue反了,暂时不知如何修改,若有哪位大神搞定受累回个帖子
运行的视频: