我一直试图让
STM32wb nucleo 与 st7789 lcd 一起工作,但只观察到奇怪的行为。我已经使用
此处找到的代码成功地让它与 stm32f103c8t6 一起工作。当 stm32f103 上的 CPOL=0 时,屏幕不工作,但在 stm32wb 上,当 CPOL=0 时,屏幕将启动并且可以成功向其发送命令。但是,当我尝试发送帧时,什么也没有发生。我还检查了 DC 引脚是否正常工作。我对 CPOL=0 时观察到的奇怪行为感到困惑,除此之外,这是我在使用 stm32wb 时观察到的唯一事情。
这是两个项目之间唯一更改的代码:
原始GPIOInit代码(stm32f103):
- void st7789_GPIOInit(void) {
- // Enable GPIOA and SPI1 clock
- RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_SPI1EN;
- // Enable DMA1 channel
- //RCC->AHBENR |= RCC_AHBENR_DMA1EN;
- // Enable SPI
- ST7789_SPI->SR = 0;
- // Reverse polarity?
- ST7789_SPI->CR1 =
- SPI_CR1_SSM |
- SPI_CR1_SSI |
- SPI_CR1_MSTR |
- SPI_CR1_CPOL |
- SPI_CR1_BIDIMODE |
- SPI_CR1_BIDIOE;
- ST7789_SPI->CR1 |= SPI_CR1_SPE;
- // DC and RST signals
- // Maximum output speed
- ST7789_DC_PORT->CRH |= GPIO_CRH_MODE8;
- ST7789_RST_PORT->CRH |= GPIO_CRH_MODE9;
- // Output push pull
- ST7789_DC_PORT->CRH &= ~(GPIO_CRH_CNF8);
- ST7789_RST_PORT->CRH &= ~(GPIO_CRH_CNF9);
- // SPI pins
- // Maximum output speed on PA5/PA7
- GPIOA->CRL |= GPIO_CRL_MODE5;
- GPIOA->CRL |= GPIO_CRL_MODE7;
- // Alternate mode on PA5/PA7
- GPIOA->CRL = (GPIOA->CRL & ~(GPIO_CRL_CNF5)) | (GPIO_CRL_CNF5_1);
- GPIOA->CRL = (GPIOA->CRL & ~(GPIO_CRL_CNF7)) | (GPIO_CRL_CNF7_1);
- }
移植代码(stm32wb):
- void st7789_GPIOInit(void) {
- //setup the clocks
- RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN;
- RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
- //configure PA1 and PA7 as alternate function
- GPIOA->MODER &= ~(GPIO_MODER_MODE1 | GPIO_MODER_MODE7);
- GPIOA->MODER |= (GPIO_MODER_MODE1_1 | GPIO_MODER_MODE7_1);
- //configure PA1 and PA7 to spi mode
- GPIOA->AFR[0] &= ~(GPIO_AFRL_AFSEL1) | (GPIO_AFRL_AFSEL7);
- GPIOA->AFR[0] |= (5U << GPIO_AFRL_AFSEL1_Pos) | (5U << GPIO_AFRL_AFSEL7_Pos);
- //configure data/command pin as output
- ST7789_DC_PORT->MODER &= ~(GPIO_MODER_MODE8);
- ST7789_DC_PORT->MODER |= GPIO_MODER_MODE8_0;
- //configure reset pin as output
- ST7789_RST_PORT->MODER &= ~(GPIO_MODER_MODE9);
- ST7789_RST_PORT->MODER |= GPIO_MODER_MODE9_0;
- //configure spi
- SPI1->CR1 |= SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_MSTR | SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE;
- //SPI1->CR1 |= SPI_CR1_CPOL;
- SPI1->CR1 |= SPI_CR1_SPE;
- }
其他很酷的代码:
- void st7789_StartCommand(void) {
- st7789_WaitNanosecs(10); // D/CX setup time
- ST7789_DC_PORT->ODR &= ~ST7789_DC_PIN;
- }
- void st7789_StartData(void) {
- st7789_WaitNanosecs(10); // D/CX setup time
- ST7789_DC_PORT->ODR |= ST7789_DC_PIN;
- }
- void st7789_WriteSpi(uint8_t data) {
- for (int32_t i = 0; i<10000; i++) {
- if (ST7789_SPI->SR & SPI_SR_TXE) break;
- }
- ST7789_SPI->DR = data;
- while (ST7789_SPI->SR & SPI_SR_BSY);
- }
两个 MCU 的时钟频率均为 64 MHz,我尝试了不同的 SPI 波特率但没有成功。为了在调试时更加简单,这两个项目都不使用 DMA。
请告诉我是否需要提供更多信息。
谢谢你。