硬汉嵌入式论坛

 找回密码
 立即注册
查看: 296|回复: 2
收起左侧

[有问必答] 求教ST7789_SendByteQuick函数移植到F4,F1系列上的问题

[复制链接]

1

主题

0

回帖

3

积分

新手上路

积分
3
发表于 2023-11-27 19:15:36 | 显示全部楼层 |阅读模式
本帖最后由 jzc5201 于 2023-11-27 19:19 编辑

@eric2013 从H7-Tool上移植了TFT的显示屏程序到stm32F4或者F1上跑不起来,怀疑是ST7789_SendByteQuick(uint8_t data)这个函数移植有问题,麻烦帮忙看看,感谢!!

H7-Tool上的:

/* 优化代码,快速操作 */
static void ST7789_SendByteQuick(uint8_t data)
{
#if 1   /* 硬件模式 */
        SPI5->CFG1 = SPI_BAUDRATEPRESCALER_8 | 7;
        SPI5->CR2 = 1;
        SPI5->CR1 = SPI_CR1_SSI;                                                       /* 仅当 SSM 位置 1 时,此位才有效。此位的值将作用到外设 SS 输入上,并忽略 SS 引脚的 I/O 值。 */
        SPI5->CR1 = SPI_CR1_SPE | SPI_CR1_SSI;                                 /* SPI_CR1_SPE 1:使能串行外设。 */
        SPI5->CR1 = SPI_CR1_SPE | SPI_CR1_SSI | SPI_CR1_CSTART;     /* SPI_CR1_CSTART 0:主传输处于空闲状态, 1:主传输正在进行,或通过自动挂起被临时挂起 */


       
        /* 等待TXP具有足够的可用位置来容纳1个数据包  0:TxFIFO 中没有足够的空间来放置下一个数据包, 1:TxFIFO 具有足够的可用位置来容纳 1 个数据包 */
        while ((SPI5->SR & SPI_FLAG_TXE) == 0);
        *((__IO uint8_t *)&SPI5->TXDR) = data;         /* 要发送的数据放入寄存器 */


       
        /* 等待发送完成 */
        /* TxFIFO 发送完成 0:当前数据事务仍在进行中、TxFIFO 中存在数据或者正在进行最后一个帧发送(包括CRC)。1:最后一个 TxFIFO 或 CRC 帧发送已完成*/
        while ((SPI5->SR & SPI_SR_TXC) == 0);


       
        /* SPI_IFCR_EOTC:向该位写入 1 可将 SPI2S_SR 寄存器的 EOT 标志清零 ,EOT: 0:传输正在进行或未启动,1:传输完成 */
        /* SPI_IFCR_TXTFC:向该位写入 1 可将 SPI2S_SR 寄存器的 TXTF 标志清零 TXTF:0:TxFIFO 上传正在进行或者未启动,1:TxFIFO 上传已完成 */


        SPI5->IFCR = SPI_IFCR_EOTC | SPI_IFCR_TXTFC;      /* EOT写1,传输完成,TXTF写1,TxFIFO 上传已完成 */
       
        SPI5->CR1 &= ~(SPI_CR1_SPE);                               /* SPI_CR1_SPE 0:失能串行外设。 */


移植到F4或者F1上的:


/* 优化代码,快速操作 */
static void ILI9341_SendByteQuick(uint8_t data)
{
#if 1   /* 硬件模式 */
        SPI3->CR1 = SPI_BAUDRATEPRESCALER_8 | 7;
        SPI3->CR1 = SPI_CR1_SSI;
        SPI3->CR2 = 1;
        SPI3->CR1 = SPI_CR1_SPE | SPI_CR1_SSI;
        SPI3->CR1 = SPI_CR1_SPE | SPI_CR1_SSI;
        SPI3->CR2 = SPI_CR2_TXDMAEN;

        while ((SPI3->SR & SPI_FLAG_TXE) == 0);

        *((__IO uint8_t *)&SPI3->DR) = data;

        while ((SPI3->SR & SPI_FLAG_TXE) == 0);

//        SPI3->IFCR = SPI_IFCR_EOTC | SPI_IFCR_TXTFC;

        SPI3->CR1 &= ~(SPI_CR1_SPE);

H7和F4,F1的寄存器有些区别,不知道移植的对不对?,求硬汉哥指导

回复

使用道具 举报

39

主题

196

回帖

323

积分

高级会员

积分
323
发表于 2023-11-28 13:09:10 | 显示全部楼层
用逻辑分析仪看看发的对不对。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2023-11-28 13:27:42 | 显示全部楼层
H7的SPI寄存器太多,与F1和F4有较大区别,F1或者F4的寄存器可以看这个

加快SPI连续读写速度的配置方式
https://www.armbbs.cn/forum.php?mod=viewthread&tid=91095
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 07:17 , Processed in 0.159921 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表