我一直在通过我的 Gameboy 模拟器运行Blaargs CPU 测试,并且op r,r测试显示我的 ADC 指令无法正常工作,但 ADD 可以正常工作。我的理解是,两者之间的唯一区别是在加法之前将现有的进位标志添加到第二个操作数。因此,我的 ADC 代码如下:
void Emu::add8To8Carry(BYTE &a, BYTE b) //4 cycles - 1 byte
{
if((Flags >> FLAG_CARRY) & 1)
b++;
FLAGCLEAR_N;
halfCarryAdd8_8(a, b); //generates H flag based on addition
carryAdd8_8(a, b); //generates C flag appropriately
a+=b;
if(a == 0)
FLAGSET_Z;
else
FLAGCLEAR_Z;
}
Run Code Online (Sandbox Code Playgroud)
我将以下内容输入到测试 ROM 中:
06 FE 3E 01 88
Run Code Online (Sandbox Code Playgroud)
当进位标志被设置时,A 的值为0 (Flags = B0),当进位标志未设置时,A 的值为FF (Flags = 00)。据我的理解,这应该是这样的。然而,它仍然未能通过测试。
根据我的研究,我相信标志受到与 ADD 相同的影响。从字面上看,我的代码与工作 ADD …
我一直试图移植一些我的AVR代码来驱动一个简单的SPI LCD到ARM作为一个学习练习(我对ARM一般都很新).为此,我只需要在主模式下使用SPI.
我查看了器件的数据表(STM32F103C8),发现我需要的SPI1引脚,SCK和MOSI分别映射为PA5和PA7的替代功能,以及其他外设(第29页).我的理解是,为了在这些引脚上使用SPI功能,我需要确保禁止映射到同一引脚的任何其他内容.但是,在查看外设时钟控制寄存器的默认值时,看起来其他功能已被禁用.
我查看了参考手册中的SPI部分,包括第25.3.3节- 在主模式下配置SPI.首先,我在APB2ENR中启用SPI1主时钟,然后按照本节中的步骤将SPI1配置为我的需要.我还更改了PA5/7的设置,将其模式设置为"Alternate Function Output push-pull"(9.1.4).最后,我通过设置CR1_SPE来启用SPI1.
从我的阅读中,我曾想过,如上所述配置SPI后,通过将值加载到SPI1数据寄存器中,数据将被移出.但是,写入数据后,SPI状态寄存器中的TXE标志永远不会置位,表示我写入的数据只是坐在那里.
在这一点上,我假设还有一些我无法正确配置的东西.例如,我不能100%确定如何处理PA5/7引脚.我试图从数据表中了解我能做什么,但我没有得到任何结论.在它工作之前还有什么需要做的吗?