之前学习了如何使用LCD,记录一下,关于spi部分是从野火的资料中截取,也会加入我自己的备注,便于理解,代码部分在后面,请耐心看完。

一.SPI协议简介

SPI 协议是由摩托罗拉公司提出的通讯协议 (Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间,要求通讯速率较高的场合。

SPI通讯系统

SPI 通讯使用 3 条总线及片选线,3 条总线分别为 SCK、MOSI、MISO,片选线为 SS ,它们的作
用介绍如下:
(1) SS( Slave Select)
从设备选择信号线,常称为片选信号线,也称为 NSS、CS,以下用 NSS表示。当有多个 SPI 从设备与 SPI 主机相连时,设备的其它信号线 SCK、MOSI 及 MISO同时并联到相同的 SPI 总线上,即无论有多少个从设备,都共同只使用这 3 条总线;而每个从设备都有独立的这一条 NSS 信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。I2C 协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而 SPI 协议中没有设备地址,它使用 NSS 信号线来寻址,当主机要选择从设备时,把该从设备的 NSS 信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行 SPI 通讯。所以 SPI 通讯以 NSS 线置低电平为开始信号,以NSS 线被拉高作为结束信号。在LCD中,片选线有很多名称,CS,SS,NSS都是指片选)

(2) SCK (Serial Clock):
时钟信号线,用于通讯数据同步。它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如 STM32 的 SPI 时钟频率最大为 fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备。
(3) MOSI (Master Output,Slave Input):
主设备输出/从设备输入引脚。主机的数据从这条信号线
输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。
(与IIC相比,这个就是信号线,由主机向从机发送数据,即SDA)
(4) MISO(Master Input,,Slave Output):
主设备输入/从设备输出引脚。主机从这条信线读入数据,
从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。
(从机向主机发送数据,使用触摸屏时需要这根线)。

SPI时序图


CS 信号线由高变低,是 SPI 通讯的起始信号,CS 信号由低变高,是 SPI 通讯的停止信号。SPI 使用 MOSI 及 MISO 信号线来传输数据,使用 SCK 信号线进行数据同步。MOSI 及 MISO 数据线在 SCK 的每个时钟周期传输一位数据。

二.LCD

数据线,时钟线,片选线都有,分别对应SDA,SCL,CS,还有两根线是DC,数据命令选择;RES液晶复位;BL,背光选择。在淘宝商家处都有详细资料。

三.代码

我的代码是移植淘宝卖家发的资料,接下来说一下要改的部分。
1.在cubemx 中对引脚的配置如下,可以自己选择空闲的引脚,配置为output。

2.将代码拆分为通讯时序和显示函数两个部分。

#include "SPI_LCD.h"
#include "main.h"
#include "string.h"//管理LCD重要参数
//默认为竖屏
_lcd_dev lcddev;//画笔颜色,背景颜色
u16 POINT_COLOR = 0x0000,BACK_COLOR = 0xFFFF;
u16 DeviceCode;  /*SPI写数据*/
void  SPIv_WriteData(u8 Data)
{unsigned char i=0;for(i=8;i>0;i--){if(Data&0x80)  {SPI_MOSI_SET; //输出数据}else {SPI_MOSI_CLR;}SPI_SCLK_CLR;       SPI_SCLK_SET;Data<<=1; }
}/****************************************************************************** @name       :void LCD_WR_REG(u8 data)* @date       :2018-08-09 * @function   :Write an 8-bit command to the LCD screen* @parameters :data:Command value to be written* @retvalue   :None
******************************************************************************/
void LCD_WR_REG(u8 data)
{ LCD_CS_CLR;     LCD_RS_CLR;     SPIv_WriteData(data);LCD_CS_SET;
}/****************************************************************************** @name       :void LCD_WR_DATA(u8 data)* @date       :2018-08-09 * @function   :Write an 8-bit data to the LCD screen* @parameters :data:data value to be written* @retvalue   :None
******************************************************************************/
void LCD_WR_DATA(u8 data)
{LCD_CS_CLR;LCD_RS_SET;SPIv_WriteData(data);LCD_CS_SET;
}/****************************************************************************** @name       :void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)* @date       :2018-08-09 * @function   :Write data into registers* @parameters :LCD_Reg:Register addressLCD_RegValue:Data to be written* @retvalue   :None
******************************************************************************/
void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
{   LCD_WR_REG(LCD_Reg);  LCD_WR_DATA(LCD_RegValue);
}      /****************************************************************************** @name       :void LCD_WriteRAM_Prepare(void)* @date       :2018-08-09 * @function   :Write GRAM* @parameters :None* @retvalue   :None
******************************************************************************/
void LCD_WriteRAM_Prepare(void)
{LCD_WR_REG(lcddev.wramcmd);
}    /****************************************************************************** @name       :void Lcd_WriteData_16Bit(u16 Data)* @date       :2018-08-09 * @function   :Write an 16-bit command to the LCD screen* @parameters :Data:Data to be written* @retvalue   :None
******************************************************************************/
void Lcd_WriteData_16Bit(u16 Data)
{   LCD_CS_CLR;LCD_RS_SET;  SPIv_WriteData(Data>>8);SPIv_WriteData(Data);LCD_CS_SET;
}/****************************************************************************** @name       :void LCD_DrawPoint(u16 x,u16 y)* @date       :2018-08-09 * @function   :Write a pixel data at a specified location* @parameters :x:the x coordinate of the pixely:the y coordinate of the pixel* @retvalue   :None
******************************************************************************/
void LCD_DrawPoint(u16 x,u16 y)
{LCD_SetCursor(x,y);//设置光标位置 Lcd_WriteData_16Bit(POINT_COLOR);
}/****************************************************************************** @name       :void LCD_Clear(u16 Color)* @date       :2018-08-09 * @function   :Full screen filled LCD screen* @parameters :color:Filled color* @retvalue   :None
******************************************************************************/ void LCD_Clear(u16 Color)
{unsigned int i,m;  LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);   LCD_CS_CLR;LCD_RS_SET;for(i=0;i<lcddev.height;i++){for(m=0;m<lcddev.width;m++){   Lcd_WriteData_16Bit(Color);}}LCD_CS_SET;
} /****************************************************************************** @name       :void LCD_RESET(void)* @date       :2018-08-09 * @function   :Reset LCD screen* @parameters :None* @retvalue   :None
******************************************************************************/
void LCD_RESET(void)
{LCD_RST_CLR;HAL_Delay(100);    LCD_RST_SET;HAL_Delay(50);
}/****************************************************************************** @name       :void LCD_Init(void)* @date       :2018-08-09 * @function   :Initialization LCD screen* @parameters :None* @retvalue   :None
******************************************************************************/
void LCD_Init(void)
{ //MX_GPIO_Init();LCD_RESET(); //LCD 复位
//************* ST7735S初始化**********//  LCD_WR_REG(0x11);//Sleep exit HAL_Delay(150);       //ST7735R Frame RateLCD_WR_REG(0xB1); LCD_WR_DATA(0x01); LCD_WR_DATA(0x2C); LCD_WR_DATA(0x2D); LCD_WR_REG(0xB2); LCD_WR_DATA(0x01); LCD_WR_DATA(0x2C); LCD_WR_DATA(0x2D); LCD_WR_REG(0xB3); LCD_WR_DATA(0x01); LCD_WR_DATA(0x2C); LCD_WR_DATA(0x2D); LCD_WR_DATA(0x01); LCD_WR_DATA(0x2C); LCD_WR_DATA(0x2D);   LCD_WR_REG(0xB4); //Column inversion LCD_WR_DATA(0x07);     //ST7735R Power SequenceLCD_WR_REG(0xC0); LCD_WR_DATA(0xA2); LCD_WR_DATA(0x02); LCD_WR_DATA(0x84); LCD_WR_REG(0xC1); LCD_WR_DATA(0xC5); LCD_WR_REG(0xC2); LCD_WR_DATA(0x0A); LCD_WR_DATA(0x00); LCD_WR_REG(0xC3); LCD_WR_DATA(0x8A); LCD_WR_DATA(0x2A); LCD_WR_REG(0xC4); LCD_WR_DATA(0x8A); LCD_WR_DATA(0xEE); LCD_WR_REG(0xC5); //VCOM LCD_WR_DATA(0x0E);     LCD_WR_REG(0x36); //MX, MY, RGB mode LCD_WR_DATA(0xC0); //ST7735R Gamma SequenceLCD_WR_REG(0xe0); LCD_WR_DATA(0x0f); LCD_WR_DATA(0x1a); LCD_WR_DATA(0x0f); LCD_WR_DATA(0x18); LCD_WR_DATA(0x2f); LCD_WR_DATA(0x28); LCD_WR_DATA(0x20); LCD_WR_DATA(0x22); LCD_WR_DATA(0x1f); LCD_WR_DATA(0x1b); LCD_WR_DATA(0x23); LCD_WR_DATA(0x37); LCD_WR_DATA(0x00);    LCD_WR_DATA(0x07); LCD_WR_DATA(0x02); LCD_WR_DATA(0x10); LCD_WR_REG(0xe1); LCD_WR_DATA(0x0f); LCD_WR_DATA(0x1b); LCD_WR_DATA(0x0f); LCD_WR_DATA(0x17); LCD_WR_DATA(0x33); LCD_WR_DATA(0x2c); LCD_WR_DATA(0x29); LCD_WR_DATA(0x2e); LCD_WR_DATA(0x30); LCD_WR_DATA(0x30); LCD_WR_DATA(0x39); LCD_WR_DATA(0x3f); LCD_WR_DATA(0x00); LCD_WR_DATA(0x07); LCD_WR_DATA(0x03); LCD_WR_DATA(0x10);      LCD_WR_REG(0x2a);LCD_WR_DATA(0x00);LCD_WR_DATA(0x00);LCD_WR_DATA(0x00);LCD_WR_DATA(0x7f);LCD_WR_REG(0x2b);LCD_WR_DATA(0x00);LCD_WR_DATA(0x00);LCD_WR_DATA(0x00);LCD_WR_DATA(0x9f);LCD_WR_REG(0xF0); //Enable test command  LCD_WR_DATA(0x01); LCD_WR_REG(0xF6); //Disable ram power save mode LCD_WR_DATA(0x00);    LCD_WR_REG(0x3A); //65k mode LCD_WR_DATA(0x05); LCD_WR_REG(0x29);//Display on       LCD_direction(USE_HORIZONTAL);//设置LCD显示方向LCD_BLK_SET;//点亮背光  LCD_Clear(WHITE);//清全屏白色
}/****************************************************************************** @name       :void LCD_SetWindows(u16 xStar, u16 yStar,u16 xEnd,u16 yEnd)* @date       :2018-08-09 * @function   :Setting LCD display window* @parameters :xStar:the bebinning x coordinate of the LCD display windowyStar:the bebinning y coordinate of the LCD display windowxEnd:the endning x coordinate of the LCD display windowyEnd:the endning y coordinate of the LCD display window* @retvalue   :None
******************************************************************************/
void LCD_SetWindows(u16 xStar, u16 yStar,u16 xEnd,u16 yEnd)
{   LCD_WR_REG(lcddev.setxcmd); LCD_WR_DATA(0x00);LCD_WR_DATA(xStar);       LCD_WR_DATA(0x00);LCD_WR_DATA(xEnd);LCD_WR_REG(lcddev.setycmd); LCD_WR_DATA(0x00);LCD_WR_DATA(yStar);       LCD_WR_DATA(0x00);LCD_WR_DATA(yEnd);LCD_WriteRAM_Prepare(); //开始写入GRAM
}   /****************************************************************************** @name       :void LCD_SetCursor(u16 Xpos, u16 Ypos)* @date       :2018-08-09 * @function   :Set coordinate value* @parameters :Xpos:the  x coordinate of the pixelYpos:the  y coordinate of the pixel* @retvalue   :None
******************************************************************************/
void LCD_SetCursor(u16 Xpos, u16 Ypos)
{                       LCD_SetWindows(Xpos,Ypos,Xpos,Ypos);
} /****************************************************************************** @name       :void LCD_direction(u8 direction)* @date       :2018-08-09 * @function   :Setting the display direction of LCD screen* @parameters :direction:0-0 degree1-90 degree2-180 degree3-270 degree* @retvalue   :None
******************************************************************************/
void LCD_direction(u8 direction)
{ lcddev.setxcmd=0x2A;lcddev.setycmd=0x2B;lcddev.wramcmd=0x2C;switch(direction){       case 0:                                   lcddev.width=LCD_W;lcddev.height=LCD_H;       LCD_WriteReg(0x36,(0<<3)|(1<<6)|(1<<7));//BGR==1,MY==0,MX==0,MV==0break;case 1:lcddev.width=LCD_H;lcddev.height=LCD_W;LCD_WriteReg(0x36,(0<<3)|(1<<7)|(1<<5));//BGR==1,MY==1,MX==0,MV==1break;case 2:                                 lcddev.width=LCD_W;lcddev.height=LCD_H;   LCD_WriteReg(0x36,(0<<3)|(0<<6)|(0<<7));//BGR==1,MY==0,MX==0,MV==0break;case 3:lcddev.width=LCD_H;lcddev.height=LCD_W;LCD_WriteReg(0x36,(0<<3)|(0<<7)|(1<<6)|(1<<5));//BGR==1,MY==1,MX==0,MV==1break;   default:break;}
}
#ifndef _SPI_LCD_H_
#define _SPI_LCD_H_#include "main.h"
#include "stdlib.h"
#include "gpio.h"#define u32 unsigned  int
#define u16 unsigned short
#define u8 unsigned char//液晶控制口置1操作语句宏定义#define SPI_MOSI_SET     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET);
#define SPI_SCLK_SET     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET); //液晶控制口置0操作语句宏定义#define    SPI_MOSI_CLR    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET);
#define SPI_SCLK_CLR    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET);  void  SPIv_WriteData(unsigned char Data);//LCD重要参数集
typedef struct
{                                           u16 width;          //LCD 宽度u16 height;         //LCD 高度u16 id;               //LCD IDu8  dir;            //横屏还是竖屏控制:0,竖屏;1,横屏。 u16  wramcmd;       //开始写gram指令u16  setxcmd;        //设置x坐标指令u16  setycmd;      //设置y坐标指令
}_lcd_dev;  //LCD参数
extern _lcd_dev lcddev; //管理LCD重要参数
/用户配置区///
#define USE_HORIZONTAL       0//定义液晶屏顺时针旋转方向    0-0度旋转,1-90度旋转,2-180度旋转,3-270度旋转//
//定义LCD的尺寸
#define LCD_W 128
#define LCD_H 160//TFTLCD部分外要调用的函数
extern u16  POINT_COLOR;//默认红色
extern u16  BACK_COLOR; //背景颜色.默认为白色//-----------------  LCD端口定义直接不需要了,只需要在STM32CubeMX上设置好IO口并且标签打好,直接连接就能用  ----------------
#define LCD_BLK_SET HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);//LCD背光打开,QDtech全系列模块采用了三极管控制背光亮灭,用户也可以接PWM调节背光亮度
//如果使用官方库函数定义下列底层,速度将会下降到14帧每秒,建议采用他们公司推荐方法
//以下IO定义直接操作寄存器,快速IO操作,刷屏速率可以达到28帧每秒! //GPIO功能口置位(拉高)
#define LCD_CS_SET   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
#define LCD_RS_SET   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);     //数据/命令     (DC RS 指的是同一个引脚哈)
#define LCD_RST_SET  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);    //复位
//GPIO功能口复位(拉低)
#define LCD_CS_CLR  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
#define LCD_RS_CLR  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);      //数据/命令
#define LCD_RST_CLR HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);    //复位           //画笔颜色
#define WHITE       0xFFFF
#define BLACK       0x0000
#define BLUE        0x001F
#define BRED        0XF81F
#define GRED                0XFFE0
#define GBLUE               0X07FF
#define RED         0xF800
#define MAGENTA     0xF81F
#define GREEN       0x07E0
#define CYAN        0x7FFF
#define YELLOW      0xFFE0
#define BROWN           0XBC40 //棕色
#define BRRED           0XFC07 //棕红色
#define GRAY            0X8430 //灰色
//GUI颜色#define DARKBLUE          0X01CF //深蓝色
#define LIGHTBLUE        0X7D7C //浅蓝色
#define GRAYBLUE         0X5458 //灰蓝色
//以上三色为PANEL的颜色 #define LIGHTGREEN      0X841F //浅绿色
#define LIGHTGRAY     0XEF5B //浅灰色(PANNEL)
#define LGRAY                   0XC618 //浅灰色(PANNEL),窗体背景色#define LGRAYBLUE         0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE          0X2B12 //浅棕蓝色(选择条目的反色)void  SPIv_WriteData(u8 Data);
void LCD_WR_REG(u8 data);
void LCD_WR_DATA(u8 data);
void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue);
void LCD_WriteRAM_Prepare(void);
void Lcd_WriteData_16Bit(u16 Data);
void LCD_DrawPoint(u16 x,u16 y);
void LCD_Clear(u16 Color);
void LCD_RESET(void);
void LCD_Init(void);
void LCD_SetWindows(u16 xStar, u16 yStar,u16 xEnd,u16 yEnd);
void LCD_SetCursor(u16 Xpos, u16 Ypos);
void LCD_direction(u8 direction);#endif

第一个C文件没什么好说的,就是根据通讯时序写的,自己可以练习写一写通讯时序,作为小白的我就直接白嫖了哈哈哈哈。第二个H文件,里面对引脚的一些宏定义,要注意根据自己设定的修改,相应的拉高或者拉低电平,要记得背光引脚电平拉高,不信的小伙伴可以试一试。

LCD显示函数就没有什么好说的了,直接用就行。
接下来介绍两个好用的函数,画网格和lcd显示波形。
1.画网格

/*****************************************************************************
**自己编写的函数名称:void LCD_Drawgrid(int wid,int lcd_wid,int lcd_high)
功能:画网格
参数:网格宽度,lcd屏幕宽度,LCD屏幕高度
******************************************************************************/
void LCD_Drawgrid(int wid,int lcd_wid,int lcd_high){float row,col;int nrow,ncol;lcd_wid = 128;lcd_high = 160;row = (float)lcd_wid/wid;col = (float)lcd_high/wid;nrow = (int)lcd_wid/wid;ncol = (int)lcd_high/wid;if(row>nrow)nrow = nrow + 1;if(row==nrow)nrow = nrow;if(col>ncol)ncol = ncol + 1;if(col==ncol)ncol = ncol;for(int i = 0; i <ncol; i++){for(int j = 0; j <nrow; j++){LCD_DrawLine(0,i*wid,lcd_wid,i*wid);LCD_DrawLine(j*wid,0,j*wid,lcd_high);}}}

2.显示波形

/*****************************************************************************
名称:void drawCurve(short int rawValue)
功能:画波形
参数:波形数据
注意:  uint16_t lastX,lastY;            移植前别忘记定义这两unsigned char firstPoint = 1;
******************************************************************************/
uint16_t lastX,lastY;
unsigned char firstPoint = 1;
void drawCurve(short int rawValue)
{uint16_t x,y;y = 100-rawValue/100;    //起始坐标y的值,改变函数幅值//这里之所以是120-rawValue/280,与屏幕的扫描方向有关,如果出现上下颠倒的情况,可以改成120 + if(firstPoint)//如果是第一次画点,则无需连线,直接描点即可{LCD_DrawPoint(0,y);lastX=0;lastY=y;firstPoint=0;}else{x=lastX+1;if(x<160)  //不超过屏幕宽度{LCD_DrawLine(lastY,lastX,y,x);HAL_Delay(20);lastX=x;lastY=y;}else  //超出屏幕宽度,清屏,从第一个点开始绘制,实现动态更新效果{LCD_Clear(WHITE);//清屏,白色背景LCD_Drawgrid(20,128,160);HAL_Delay(300);LCD_DrawPoint(0,y);lastX=0;lastY=y;}}
}

第二个函数是csdn上另外一位博主的,链接忘记了
它可以根据数据显示波形,最好把数据放在一个数组里面,然后用for循环取出来,

int a[100] = {2112,2241,2368,2495,2619,2742,2861,2978,3091,3199,3303,3402,3496,3584,3666,3742,3811,
3873,3928,3975,4015,4047,4071,4087,4095,4095,4087,4071,4047,4015,3975,3928,3873,
3811,3742,3666,3584,3496,3402,3303,3199,3091,2978,2861,2742,2619,2495,2368,2241,
2112,1984,1855,1728,1601,1477,1354,1235,1118,1005,897,793,694,600,512,430,
354,285,223,168,121,81,49,25,9,1,1,9,25,49,81,121,
168,223,285,354,430,512,600,694,793,897,1005,1118,1235,1354,1477,1601,
1728,1855,1984,};

可以用这组数据测试。

放在while(1)里面。

分享一下淘宝的例程资料下载:https://pan.baidu.com/s/1bp6AYsR
下面是我的代码
代码
分享结束,欢迎指正

基于cubemx的stm32HAL库SPI通信写LCD显示屏相关推荐

  1. STM32H750VBT6驱动程控增益放大模块PGA113——基于CubeMX的Hal库

    前言 高情已逐晓云空,不与梨花同梦. 最近,因为准备电赛的需要,需要用到程控增益放大模块(PGA113),也就是这篇博文的主角:破哥啊(谐音称呼),需要调通这位大哥,今天终于完成了驱动的程序代码.说起 ...

  2. 学习笔记(1)stm32h743和ADXL355的SPI通信,基于cubeMX和keil5MDK平台,采用HAL库编程,代码已模块化处理

    今天是一个特别的日子,为什么呢?哈哈,因为从大四做毕业设计的时候,接触CSDN,到现在一整年了,终于创作了我的第一篇博客,内心难念有些激动! 首先声明,我不是嵌入式领域的技术大牛,只是普通的研一新生, ...

  3. STM32F103以SPI 驱动128*128的TFT彩屏,LCD驱动为ST7735s,程序使用CubeMX的HAL库开发方式,另外也做了标准库的程序移植

    0.  关于本文: 其实我一直都比较懒,不喜欢写博客.但网上关于详细讲解SPI驱动LCD的文章比较少,虽然也能下载到一些案例程序,但对于初学者来说,如果不懂LCD驱动的原理,不懂如何对文字和图片取模, ...

  4. STM32HAL库实现ADXL355加速度传感器简单记步功能(SPI)

    STM32HAL库实现ADXL355加速度传感器简单记步器功能(SPI) 文章目录 STM32HAL库实现ADXL355加速度传感器简单记步器功能(SPI) 一.硬件连接 二.STM32CubeMx配 ...

  5. STM32HAL ADC+TIM+DMA采集交流信号 基于cubemx

    ADC+TIM+DMA采集交流 前言 本文主要讲解定时器触发ADC去采集交流信号,DMA把数据搬移到内存. 所需工具: 开发板:STM32F103C8T6 STM32CubeMX IDE: Keil- ...

  6. 基于STM32与NOR FLASH的SPI通信

      SPI的通信很容易实现,相比之下,驱动FLASH反而耗费了我学习SPI整个过程的大部分时间.下面是我学习过程的一些记录. 硬件平台:秉火ISO_V2开发板 实现功能:STM32使用SPI协议读写板 ...

  7. 移植Freemodbus到STM32(基于CubeMX,HAL库)-避坑篇

    具体Freemodbus移植到STM32步骤参考: STMC2CubeMX | STM32 HAL库移植FreeModbus详细步骤 基于STM32HAL库移植FreeModbus FreeModbu ...

  8. stm32 IOT_基于STM32平台的cubeMX和HAL库详解

    课程简介: <朱有鹏老师单片机完全学习系列课程>总共5季,其中第1.2季是51单片机学习,第3.4.5季是STM32单片机与RTOS学习.整个课程时长约250小时,是一套零基础.全面系统. ...

  9. SPI通信实验---verilog(FPGA作为从机,使用可读可写)

    文章原地址: http://www.cnblogs.com/fhyfhy/p/4429302.html SPI通信实验---verilog(FPGA作为从机,使用可读可写) 本实验讲究实用性,故设计思 ...

最新文章

  1. 光流 | 基于光流的运动物体语义分割(源代码)
  2. 逆水寒服务器维护7.5,逆水寒7.26日维护到什么时候 逆水寒7.26日游戏改动汇总介绍...
  3. string、stringbuilder、stringbuffer区别
  4. 阿里-优酷视频增强和超分辨率挑战赛冠军方案:VESR-Net
  5. 支持向量机中到底什么是支持向量
  6. day048 BOM和DOM
  7. 当try和finally都包含return时
  8. php文件加锁 lock_sh ,lock_ex
  9. 通过Cadence学拉扎维的第0天-工艺库的导入+共源电路仿真示例
  10. FPGA电源设计总结
  11. 十三、用卡诺图化简真值表例题(2)
  12. 函数空间(巴纳赫空间、欧几里得空间、希尔伯特空间)
  13. C# 字符串转意和反转意
  14. Phobos家族后缀.actin勒索病毒变体详细说明,删除后缀.actin勒索病毒并尝试恢复文件
  15. linux定时任务crond那些事!
  16. c语言松树树干如何编程jemg,JE-C编程指南(上)
  17. python求级数的值_如何在Numpy中计算Fourier级数?
  18. 数控机床刀具挑选和切削用量确认的准则
  19. Windows10下用vim+ctags+cscope搭建属于自己的IDE
  20. 关东升的iOS实战系列图书 《iOS实战:入门与提高卷(Swift版)》已经上市

热门文章

  1. photoshop cs6 for mac 破解方法
  2. 旁观ACM ICPC
  3. 搭配Online都说绿色养眼 但为什么护眼模式总是黄色的?
  4. GAMES101笔记_Lec10~12_几何 Geometry
  5. 关于Uncaught SyntaxError- Unexpected token o in JSON at position 1,chrome持续报错的相关解析
  6. android 7zip库的编译
  7. java springmvc大学生校园兼职平台
  8. matlab机器人自动分拣_YOLOv3 + Matlab Robotics ToolBox 实战 -- 软包装药品的机器人分拣系统设计与仿真...
  9. JavaScript页面刷新的方法
  10. linux下的电子仿真软件,立创EDA Linux版