ST7701芯片820*320屏幕移植stemwin

2023-10-27

简要说明

如题,公司最近更换820*320屏幕,移植stemwin,使用3线spi通讯+16RGB,这屏幕工作流程为:首先通过3线spi发送初始化指令,之后通过16bitRGB发送像素点。
移植过程参考了安富莱、野火、https://www.nxpic.org.cn/module/forum/thread-622198-1-1.html

移植过程

首先对屏幕进行初始化,使用模拟3线SPI方式,因为为9bit方式,首位代表命令。
手册上的通讯时序如下:
在这里插入图片描述
但实际上这时序是个坑,实际上的时序如下:
在这里插入图片描述
SCL在空闲状态为高电平,然后在第一个上升沿采样,也是就CPOL=1、CPHA=1。
初始化代码如下:最主要就是要把SCL拉高。

void SPI3_GPIO_Config(void)
{		
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd ( SDI_GPIO_CLK|
	                         SCL_GPIO_CLK|
	                         CS_GPIO_CLK|
	                         RES_GPIO_CLK, ENABLE); 															   
	GPIO_InitStructure.GPIO_Pin = SDI_PIN;	
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;   
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;  //SDA有上拉电阻
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; 
	GPIO_Init(SDI_GPIO_PORT, &GPIO_InitStructure);	
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;														   
	GPIO_InitStructure.GPIO_Pin = SCL_PIN;	
    GPIO_Init(SCL_GPIO_PORT, &GPIO_InitStructure);															   
	GPIO_InitStructure.GPIO_Pin = CS_PIN;	
    GPIO_Init(CS_GPIO_PORT, &GPIO_InitStructure);	
	GPIO_InitStructure.GPIO_Pin = RES_PIN;	
    GPIO_Init(RES_GPIO_PORT, &GPIO_InitStructure);			
	SET_LSCE_HIGH;
	SET_LSCK_LOW;
	SET_LSCK_HIGH;
}

时序部分参考https://www.nxpic.org.cn/module/forum/thread-622198-1-1.html

static void St7701_Write_Byte(unsigned short temp)
{
	unsigned char i;
	SET_LSCE_LOW;
//	GPIO_PortClear(GPIO, 4U, 1<<0U);
	for(i=0;i<9;i++)
	{
		SET_LSCK_LOW;
//		ST7701_SCL(0);
		if(temp&0x0100)
//			ST7701_SDA(1);
			SET_LSDA_HIGH;
		else
//			ST7701_SDA(0);
			SET_LSDA_LOW;
		UDELAY(5);
		SET_LSCK_HIGH;
//		ST7701_SCL(1);
		UDELAY(5);
		temp = temp<<1;
	}
	SET_LSCE_HIGH;
//	GPIO_PortSet(GPIO, 4U, 1<<0U);
}

static void St7701_WriteCommand(uint8_t c)
{
	unsigned short temp = 0x00;
	temp = temp | c;
	St7701_Write_Byte(temp);
	UDELAY(100);
}

static void St7701_WriteData(uint8_t c)
{
	unsigned short temp = 0x100;
	temp = temp | c;
	St7701_Write_Byte(temp);
	UDELAY(100);
}


#define W_C(x)    St7701_WriteCommand(x)
#define W_D(x)    St7701_WriteData(x)



void LCD_SPI_Init(void)
{ 
	uint8_t id1, id2, id3;
	SPI3_GPIO_Config();
	SET_LRES_HIGH;
	mdelay(1);
	SET_LRES_LOW;
	mdelay(100);
	SET_LRES_HIGH;
	mdelay(200);
	//id1 = SPI_St7701s_ReadByte(0xDA);
	//id2 = SPI_St7701s_ReadByte(0xDB);
	//id3 = SPI_St7701s_ReadByte(0xDC);
#if 1
	W_C (0x11);
	mdelay(20); //Delayms 20ms	

	W_C (0xFF);     
	W_D (0x77);   
	W_D (0x01);   
	W_D (0x00);   
	W_D (0x00);   
	W_D (0x13);   

	W_C (0xEF);     
	W_D (0x08);   

	W_C (0xFF);     
	W_D (0x77);   
	W_D (0x01);   
	W_D (0x00);   
	W_D (0x00);   
	W_D (0x10);   

	W_C (0xC0);    //设置显示行为820 
	W_D (0xE5);   
	W_D (0x02);   

	W_C (0xC1);     //设置VBP=12,VFP=10
	W_D (0x0C);   
	W_D (0x0A);   

	W_C (0xC2);     //反转选择性和帧率控制
	W_D (0x07);    //7Column
	W_D (0x0F);     //PCLK=512+(0X0F*16)=752

	W_C (0xC3);     //RGB控制
	W_D (0x02);     //RGB DE mode--VSYNC信号极性(LOW)--HSYNC信号极性(LOW)--DP = “1” The data is input on the negative edge of DOTCLK--|||||||EP = 0 The data DB23-0 is written when ENABLE = “1”. Disable data write operation when ENABLE = “0”
//HBP--0x10  VBP=0x08(猜测为HFP)
	W_C (0xCC);     
	W_D (0x10);   

	 
	W_C(0xCd);
	W_D(0x08); 

	W_C (0xB0);     
	W_D (0x00);   
	W_D (0x08);   
	W_D (0x51);   
	W_D (0x0D);   
	W_D (0xCE);   
	W_D (0x06);   
	W_D (0x00);   
	W_D (0x08);   
	W_D (0x08);   
	W_D (0x1D);   
	W_D (0x02);   
	W_D (0xD0);   
	W_D (0x0F);   
	W_D (0x6F);   
	W_D (0x36);   
	W_D (0x3F);   

	W_C (0xB1);     
	W_D (0x00);   
	W_D (0x10);   
	W_D (0x4F);   
	W_D (0x0C);   
	W_D (0x11);   
	W_D (0x05);   
	W_D (0x00);   
	W_D (0x07);   
	W_D (0x07);   
	W_D (0x1F);   
	W_D (0x05);   
	W_D (0xD3);   
	W_D (0x11);   
	W_D (0x6E);   
	W_D (0x34);   
	W_D (0x3F);   

	W_C (0xFF);     
	W_D (0x77);   
	W_D (0x01);   
	W_D (0x00);   
	W_D (0x00);   
	W_D (0x11);   

	W_C (0xB0);     
	W_D (0x4D);   

	W_C (0xB1);     
	W_D (0x1C);   

	W_C (0xB2);     
	W_D (0x87);   

	W_C (0xB3);     
	W_D (0x80);   

	W_C (0xB5);     
	W_D (0x47);   

	W_C (0xB7);     
	W_D (0x85);   

	W_C (0xB8);     
	W_D (0x21);   

	W_C (0xB9);     
	W_D (0x10);   

	W_C (0xC1);     
	W_D (0x78);   

	W_C (0xC2);     
	W_D (0x78);   

	W_C (0xD0);     
	W_D (0x88);   

	UDELAY(100);    //---------------------------------------            

	W_C (0xE0);     
	W_D (0x80);   
	W_D (0x00);   
	W_D (0x02);   

	W_C (0xE1);     
	W_D (0x04);   
	W_D (0xA0);   
	W_D (0x00);   
	W_D (0x00);   
	W_D (0x05);   
	W_D (0xA0);   
	W_D (0x00);   
	W_D (0x00);   
	W_D (0x00);   
	W_D (0x60);   
	W_D (0x60);   

	W_C (0xE2);     
	W_D (0x30);   
	W_D (0x30);   
	W_D (0x60);   
	W_D (0x60);   
	W_D (0x3C);   
	W_D (0xA0);   
	W_D (0x00);   
	W_D (0x00);   
	W_D (0x3D);   
	W_D (0xA0);   
	W_D (0x00);   
	W_D (0x00);   
	W_D (0x00);   

	W_C (0xE3);     
	W_D (0x00);   
	W_D (0x00);   
	W_D (0x33);   
	W_D (0x33);   

	W_C (0xE4);     
	W_D (0x44);   
	W_D (0x44);   

	W_C (0xE5);     
	W_D (0x06);   
	W_D (0x3E);   
	W_D (0xA0);   
	W_D (0xA0);   
	W_D (0x08);   
	W_D (0x40);   
	W_D (0xA0);   
	W_D (0xA0);   
	W_D (0x0A);   
	W_D (0x42);   
	W_D (0xA0);   
	W_D (0xA0);   
	W_D (0x0C);   
	W_D (0x44);   
	W_D (0xA0);   
	W_D (0xA0);   

	W_C (0xE6);     
	W_D (0x00);   
	W_D (0x00);   
	W_D (0x33);   
	W_D (0x33);   

	W_C (0xE7);     
	W_D (0x44);   
	W_D (0x44);   

	W_C (0xE8);     
	W_D (0x07);   
	W_D (0x3F);   
	W_D (0xA0);   
	W_D (0xA0);   
	W_D (0x09);   
	W_D (0x41);   
	W_D (0xA0);   
	W_D (0xA0);   
	W_D (0x0B);   
	W_D (0x43);   
	W_D (0xA0);   
	W_D (0xA0);   
	W_D (0x0D);   
	W_D (0x45);   
	W_D (0xA0);   
	W_D (0xA0);   

	W_C (0xEB);     
	W_D (0x00);   
	W_D (0x01);   
	W_D (0x4E);   
	W_D (0x4E);   
	W_D (0xEE);   
	W_D (0x44);   
	W_D (0x00);   

	W_C (0xED);     
	W_D (0xFF);   
	W_D (0xFF);   
	W_D (0x04);   
	W_D (0x56);   
	W_D (0x72);   
	W_D (0xFF);   
	W_D (0xFF);   
	W_D (0xFF);   
	W_D (0xFF);   
	W_D (0xFF);   
	W_D (0xFF);   
	W_D (0x27);   
	W_D (0x65);   
	W_D (0x40);   
	W_D (0xFF);   
	W_D (0xFF);   

	W_C (0xEF);     
	W_D (0x10);   
	W_D (0x0D);   
	W_D (0x04);   
	W_D (0x08);   
	W_D (0x3F);   
	W_D (0x1F);   

	W_C (0xFF);     
	W_D (0x77);   
	W_D (0x01);   
	W_D (0x00);   
	W_D (0x00);   
	W_D (0x13);   

	W_C (0xE8);     
	W_D (0x00);   
	W_D (0x0E);   

	W_C (0xFF);     
	W_D (0x77);   
	W_D (0x01);   
	W_D (0x00);   
	W_D (0x00);   
	W_D (0x00);   

	W_C (0x11);     

	UDELAY(100);   //----------------------------             

	W_C (0xFF);     
	W_D (0x77);   
	W_D (0x01);   
	W_D (0x00);   
	W_D (0x00);   
	W_D (0x13);   

	W_C (0xE8);     
	W_D (0x00);   
	W_D (0x0C);   

	UDELAY(10 );    //-------------------------------            

	W_C (0xE8);     
	W_D (0x00);   
	W_D (0x00);   

	W_C (0xFF);     
	W_D (0x77);   
	W_D (0x01);   
	W_D (0x00);   
	W_D (0x00);   
	W_D (0x00);   

	W_C(0x36);
	W_D(0x00); //0x00
	W_C(0x3A);
	W_D(0x50);
	W_C(0x11);

	/*
	W_C (0xFF);
	W_D (0x77);
	W_D (0x01);
	W_D (0x00);
	W_D (0x00);
	W_D (0x12);
	W_C (0xD1);
	W_D (0x81);
	W_D (0x08);
	W_D (0x03);
	W_D (0x20);
	W_D (0x08);
	W_D (0x01);
	W_D (0xA0);
	W_D (0x01);
	W_D (0xE0);
	W_D (0xA0);
	W_D (0x01);
	W_D (0xE0);
	W_D (0x03);
	W_D (0x20);
	W_C (0xD2);
	W_D (0x08);
	*/
	UDELAY(100);
	W_C(0x29);
	Delay1ms(20);
#else
#endif
}


初始化过程注意SCL空闲电平就成,其他没啥好说的。
之后就是LCD的初始化,一把抄,改一下VBP、HBP、HFP、VFP这几个参数

void LCD_Init(void)
{
 LTDC_InitTypeDef       LTDC_InitStruct;

 /* Enable the LTDC Clock */
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC, ENABLE);

 /* Enable the DMA2D Clock */
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2D, ENABLE);

 /* Configure the LCD Control pins */
 LCD_GPIO_Config();

 /* Configure the FMC Parallel interface : SDRAM is used as Frame Buffer for LCD */
 

 /* LTDC Configuration *********************************************************/
 /* Polarity configuration */
 /* Initialize the horizontal synchronization polarity as active low */
 LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL;
 /* Initialize the vertical synchronization polarity as active low */
 LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL;
 /* Initialize the data enable polarity as active low */
 LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL;
 //LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AH;
 /* Initialize the pixel clock polarity as input pixel clock */
 LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IPC;

 /* Configure R,G,B component values for LCD background color */
 LTDC_InitStruct.LTDC_BackgroundRedValue = 0;
 LTDC_InitStruct.LTDC_BackgroundGreenValue = 0;
 LTDC_InitStruct.LTDC_BackgroundBlueValue = 0;

	/* 配置 PLLSAI 分频器,它的输出作为像素同步时钟CLK*/
  /* PLLSAI_VCO 输入时钟 = HSE_VALUE/PLL_M = 1 Mhz */
  /* PLLSAI_VCO 输出时钟 = PLLSAI_VCO输入 * PLLSAI_N = 384 Mhz */
  /* PLLLCDCLK = PLLSAI_VCO 输出/PLLSAI_R = 384/6  Mhz */
  /* LTDC 时钟频率 = PLLLCDCLK / DIV = 384/4/4 = 24 Mhz */
	/* LTDC时钟太高会导花屏,若对刷屏速度要求不高,降低时钟频率可减少花屏现象*/
	/* 以下函数三个参数分别为:PLLSAIN,PLLSAIQ,PLLSAIR,其中PLLSAIQ与LTDC无关*/
 RCC_PLLSAIConfig(384, 7, 4);
 	/*以下函数的参数为DIV值*/
 RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);

 /* Enable PLLSAI Clock */
 RCC_PLLSAICmd(ENABLE);
 /* Wait for PLLSAI activation */
 while(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET)
 {
 }

  /* 时间参数配置 */  
 /* 配置行同步信号宽度(HSW-1) */
 LTDC_InitStruct.LTDC_HorizontalSync =HSW-1;
 /* 配置垂直同步信号宽度(VSW-1) */
 LTDC_InitStruct.LTDC_VerticalSync = VSW-1;
 /* 配置(HSW+HBP-1) */
 LTDC_InitStruct.LTDC_AccumulatedHBP =HSW+HBP-1;
 /* 配置(VSW+VBP-1) */
 LTDC_InitStruct.LTDC_AccumulatedVBP = VSW+VBP-1;
 /* 配置(HSW+HBP+有效像素宽度-1) */
 LTDC_InitStruct.LTDC_AccumulatedActiveW = HSW+HBP+LCD_PIXEL_WIDTH-1;
 /* 配置(VSW+VBP+有效像素高度-1) */
 LTDC_InitStruct.LTDC_AccumulatedActiveH = VSW+VBP+LCD_PIXEL_HEIGHT-1;
 /* 配置总宽度(HSW+HBP+有效像素宽度+HFP-1) */
 LTDC_InitStruct.LTDC_TotalWidth =HSW+ HBP+LCD_PIXEL_WIDTH  + HFP-1; 
 /* 配置总高度(VSW+VBP+有效像素高度+VFP-1) */
 LTDC_InitStruct.LTDC_TotalHeigh =VSW+ VBP+LCD_PIXEL_HEIGHT  + VFP-1;

 LTDC_Init(&LTDC_InitStruct);
}

这一步要注意的就是X轴和Y轴,这个st7701,短轴是X轴,长轴是Y轴。

/* LCD Size (Width and Height) */
#define  LCD_PIXEL_WIDTH       ((uint16_t)320)  //X轴
#define  LCD_PIXEL_HEIGHT      ((uint16_t)820)  //Y轴

之后就是emwin的移植了,参考安富莱的裸机移植代码。
基本上都差不多,修改的地方如下:

/* 
  1. 显示屏的物理分辨率,驱动已经做了显示屏自适应,支持4.3寸,5寸和7寸屏
     这里填写自适应显示屏中的最大分辨率。
*/
#define XSIZE_PHYS       320  //320
#define YSIZE_PHYS       820

uint16_t g_LcdHeight = YSIZE_PHYS;			/* 显示屏分辨率-高度 */
uint16_t g_LcdWidth = XSIZE_PHYS;			/* 显示屏分辨率-宽度 */

/* 
   4. 重定义图层数,对于STM32F429/439,用户可以选择一个图层或者两个图层,不支持三图层 
      (1). 设置GUI_NUM_LAYERS = 1时,即仅使用图层1时,默认触摸值是发送给图层1的。
	  (2). 设置GUI_NUM_LAYERS = 2时,即图层1和图层2都已经使能,此时图层2是顶层,
	       用户需要根据自己的使用情况设置如下两个地方。
		   a. 在bsp_touch.c文件中的函数TOUCH_InitHard里面设置参数State.Layer = 1,1就表示
		      给图层2发送触摸值。
		   b. 调用GUI_Init函数后,调用函数GUI_SelectLayer(1), 设置当前操作的是图层2。
*/
#undef  GUI_NUM_LAYERS
#define GUI_NUM_LAYERS    1

/* 7. 配置图层1的颜色模式和分辨率大小 */
#define COLOR_MODE_0      _CM_RGB565
#define XSIZE_0           XSIZE_PHYS
#define YSIZE_0           YSIZE_PHYS

/* 8. 配置图层2的的颜色模式和分辨率大小 */
#define COLOR_MODE_1      _CM_RGB565
#define XSIZE_1           XSIZE_PHYS
#define YSIZE_1           YSIZE_PHYS

之后在初始化图层中:

/*
*********************************************************************************************************
*	函 数 名: _LCD_InitController
*	功能说明: LCD初始化
*	形    参: LayerIndex  选择图层0或者1
*	返 回 值: 无
*********************************************************************************************************
*/
static void _LCD_InitController(int LayerIndex) 
{
.......
    LTDC_Layer_InitStruct.LTDC_HorizontalStart = HBP + HSW;;
	LTDC_Layer_InitStruct.LTDC_HorizontalStop = HSW+HBP+LCD_PIXEL_WIDTH-1;
	LTDC_Layer_InitStruct.LTDC_VerticalStart = VBP + VSW; 
	LTDC_Layer_InitStruct.LTDC_VerticalStop = VSW+VBP+LCD_PIXEL_HEIGHT-1;
}

之后再测试一下:

/*
*********************************************************************************************************
*	函 数 名: MainTask
*	功能说明: GUI主函数
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
uint64_t i=0;
void MainTask(void) 
{
	
	GUI_TIMER_HANDLE hTimer;

	GUI_Init();
//	
	/*
	 关于多缓冲和窗口内存设备的设置说明
	   1. 使能多缓冲是调用的如下函数,用户要在LCDConf_Lin_Template.c文件中配置了多缓冲,调用此函数才有效:
		  WM_MULTIBUF_Enable(1);
	   2. 窗口使能使用内存设备是调用函数:WM_SetCreateFlags(WM_CF_MEMDEV);
	   3. 如果emWin的配置多缓冲和窗口内存设备都支持,二选一即可,且务必优先选择使用多缓冲,实际使用
		  STM32F429BIT6 + 32位SDRAM + RGB565/RGB888平台测试,多缓冲可以有效的降低窗口移动或者滑动时的撕裂
		  感,并有效的提高流畅性,通过使能窗口使用内存设备是做不到的。
	   4. 所有emWin例子默认是开启三缓冲。
	*/
	//GUI_SetOrientation(0);
	WM_MULTIBUF_Enable(1);
	
	//LCD_SetDirection(2);
	//i = GUI_SetOrientation(GUI_SWAP_XY);
	GUI_SetOrientation(GUI_SWAP_XY | GUI_MIRROR_Y);
	/*
       触摸校准函数默认是注释掉的,电阻屏需要校准,电容屏无需校准。如果用户需要校准电阻屏的话,执行
	   此函数即可,会将触摸校准参数保存到EEPROM里面,以后系统上电会自动从EEPROM里面加载。
	*/
    //TOUCH_Calibration();
		
	GUI_SetBkColor(0x000064c8); 
	GUI_Clear();
	GUI_Delay(2000);
	//GUI_SetBkColor(GUI_GRAY);
	GUI_Clear();
	GUI_Delay(2000);
	GUI_SetColor(GUI_BLACK);
	GUI_SetTextMode(GUI_TM_NORMAL);
	GUI_SetFont(GUI_FONT_32B_ASCII);
	GUI_DispStringHCenterAt("GUI_TM_NORMAL" , 160, 10);	
	GUI_Delay(1000);
	hWin = Createtestwindows();
	WM_EnableMemdev(hWin);
	while(1) 
	{
		i++;
		//GUI_Delay(100);
		GUI_Exec();
		WINDOW_SetBkColor(hWin, 0x00FF0000);
		GUI_Exec();
		sys_timer_usDelay(1000000);
		WINDOW_SetBkColor(hWin, GUI_BLACK);
		GUI_Exec();
		sys_timer_usDelay(1000000);
	}
}

其中main.c如下

/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)
{
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
	
	sys_timer_init();
	sys_timer_usDelay(1000);
	SDRAM_Init();
	//PhotomoveSdram();
	/* LED 端口初始化 */
	LED_GPIO_Config();	 
  //SDRAM_Init();
  /*初始化液晶屏*/
	LCD_SPI_Init();
  
    LCD_Init();
    //LCD_LayerInit();
    //LTDC_Cmd(ENABLE);
	
    while(1)
	{
		MainTask();
	}  

}

卡壳的地方有:
1、spi初始化哪儿,SCL的空闲时钟。
2、emwin移植之后图像显示有问题,颜色显示不正确,后面通过测试RGB才发现,这个屏用的RGB565,线序与RGB888相比为:

RGB888    RGB565
   R0-------无
   R1-------无
   R2-------无
   R3-------R0
   R4-------R1
   R5-------R2
   R6-------R3
   R7-------R4
   
   G0-------无
   G1-------无
   G2-------G0
   G3-------G1
   G4-------G2
   G5-------G3
   G6-------G4
   G7-------G5
   
   B0-------无
   B1-------无
   B2-------无
   B3-------B0
   B4-------B1
   B5-------B2
   B6-------B3
   B7-------B4

3、测试中调用 IMAGE_SetDTA() 函数总是跑飞,调整一下堆栈大小: Stack_Size EQU 0x00001000
4、显示亮色图片对比鲜明的像素点不正常,不知道原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ST7701芯片820*320屏幕移植stemwin 的相关文章

  • 初始化 ST-Link 设备时出错 - 无法连接到设备

    我目前正在使用 ST Link 调试器对我的 STM32F3 Discovery 板进行编程 我使用的IDE是Atollic TrueStudio 5 5 2 现在我面临一个非常奇怪的问题 那就是我不断收到消息 初始化 ST Link 设备
  • 在地址“0xXXXXXX”处中断,没有可用的调试信息,或在程序代码之外

    配置 使用 Nucleo L476RG 使用 GNU ARM Eclipse 我从 STM32CubeMX 生成了一个极简代码 我已经在我的板载 ST Link 中刷新了 J link 驱动程序 一直在尝试为我的代码运行调试器 但我的程序计
  • 在没有 IDE 的情况下如何使用 CMSIS?

    我正在使用 STM32F103C8T6 并想使用 CMSIS 这本质上只是寄存器定义 没有代码 让我的生活更轻松 同时仍保持在较低水平 问题是我不知道如何安装该库以便在命令行上使用 Makefile 使用 所有文档似乎都与特定于供应商的 I
  • 如何让printf在STM32F103上工作?

    我是 STM32F103 世界的新手 我有一个STM32F103的演示代码 我正在使用arm none eabi来编译它 我尝试了在谷歌上可以找到的内容 但到目前为止没有任何效果 我已经花了三天时间来解决这个问题 任何人都可以给我一个运行良
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

    资料编号 138 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 LED灯 蜂鸣器 电位器 制作一个基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真 2 通过DHT1
  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

    我问这个问题是因为可以在这里找到类似问题的答案 通过应用程序跳转到 STM32 中的引导加载程序 即从用户闪存在引导模式下使用引导 0 和引导 1 引脚 用户 JF002 JF002回答 当我想跳转到引导加载程序时 我在其中一个备份寄存器中
  • STM32F103

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • HAL 锁定和解锁函数如何使用以及为什么?

    我试图理解另一位程序员编写的代码 它使用了I C http en wikipedia org wiki I C2 B2C通信以将数据写入 STM32 微控制器的 EEPROM 一般来说 我理解他的代码是如何工作的 但我不明白他为什么使用HA
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能

随机推荐