STM32开发踩大坑(技术总监出马救场)

代码中线进行spi初始化,再进行st7789的初始化。在st7789的初始化中,把spi初始化的配置信息pb15和pb13覆盖了,故数据传输不过去。当时st7789是直接拿样例代码过来用的,模拟spi通讯能用,所以当时debug查代码的时候就没往这边想(可以说压根没往这边看)

spi初始化

void SPI2_Init(void){ //SPI2初始化
	SPI_InitTypeDef  SPI_InitStructure;
	GPIO_InitTypeDef  GPIO_InitStructure;

	// 使能相关时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = SPI2_MOSI | SPI2_SCK;	//SPI2的MOSI(PB15)和SCLK(PB13)为复用推免输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(SPI2PORT,&GPIO_InitStructure);

	SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;//双线输入输出全双工模式
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置为SPI的主机模式(SCK主动产生时钟)
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//SPI数据大小:发送8位帧数据结构
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//空闲状态时SCK的状态,High为高电平,Low为低电平
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//时钟相位,1表示在SCK的奇数沿边采样,2表示偶数沿边采样
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS由软件控件片选
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;//时钟的预分频值(0~256)
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //MSB高位在前
	SPI_InitStructure.SPI_CRCPolynomial = 7;
	SPI_Init(SPI2,&SPI_InitStructure); //初始化SPI2的配置项
	SPI_Cmd(SPI2,ENABLE); //使能SPI2  
}

ST7789初始化

/**
 *	功能:ST7789的端口初始化
 *	详细说明:初始化了ST7789的SPI和一些其他IO
 *  注意:背光的IO口不知道是哪个,没有连接,故在此函数没有对该IO口使能
 */
void ST7789_GPIO_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructureA;
	GPIO_InitTypeDef  GPIO_InitStructureB;
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 																					// 使能B端口时钟
	// 错误示例
	// GPIO_InitStructureB.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;	 		
    // 正确示例
	GPIO_InitStructureB.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_14;
	// 选择PIN引脚
 	GPIO_InitStructureB.GPIO_Mode = GPIO_Mode_Out_PP; 		 																					// 推挽输出
	GPIO_InitStructureB.GPIO_Speed = GPIO_Speed_50MHz;																							// 速度50MHz
 	GPIO_Init(GPIOB, &GPIO_InitStructureB);	  																											// 初始化GPIOB
	
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 																					// 使能A端口时钟
	GPIO_InitStructureA.GPIO_Pin = GPIO_Pin_0;	 																										// 选择PIN引脚
 	GPIO_InitStructureA.GPIO_Mode = GPIO_Mode_Out_PP; 		 																					// 推挽输出
	GPIO_InitStructureA.GPIO_Speed = GPIO_Speed_50MHz;																							// 速度50MHz
 	GPIO_Init(GPIOA, &GPIO_InitStructureA);	  																											// 初始化GPIOB																																// PIN脚全部置为高电平
}

错误反思

gpio的初始化放在一个文件(各个模块的初始化尽量分文件),不要太散,一个好的编程习惯能省不少事

posted @ 2024-07-11 09:21  小兜兜me  阅读(7)  评论(0编辑  收藏  举报