记一次移植MSP40F5529PocketKit墨水屏驱动到STM32F103C8T6的过程

暑假做电赛,学校给发了一块TI的MSP430F5529的LaunchPad和HautsingInstruments的MSP430F5529PocketKit,集训结束后,LaunchPad收回去了,但是这个PocketKit却不收,可以留着自己用了。
记一次移植MSP40F5529PocketKit墨水屏驱动到STM32F103C8T6的过程_第1张图片
现在手头上只有STM32F103C8T6的开发板,没有MSP430,但是这个PocketKit的硬件和参考例程只为LaunchPad设计的,故移植之。
首先从官方文档里翻出两份原理图,LaunchPad的IOPin排列如下:
记一次移植MSP40F5529PocketKit墨水屏驱动到STM32F103C8T6的过程_第2张图片
POCKET KIT中对墨水屏的原理图如下:
记一次移植MSP40F5529PocketKit墨水屏驱动到STM32F103C8T6的过程_第3张图片
所以,相当于墨水屏与STM32的链接只要6条信号线和2条电源线,电源线只需连接3.3V和GND,5V可以不管,由于POCKET KIT和LaunchPad的引脚一一对应,直接按指示链接就完了。
这里给的连接关系如下:

墨水屏引脚(MSP430引脚) STM32引脚 输入/输出
BUSY(P2.2) PA0 input
RES(P1.4) PA1 output
DC(P3.4) PA2 output
CSI(P3.2) PA3 output
SCLK(P2.7) PA4 output
SDI(P3.3) PA5 output

记一次移植MSP40F5529PocketKit墨水屏驱动到STM32F103C8T6的过程_第4张图片
针对引脚STM32上编写IO初始化程序:

void Eink_GPIO_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //挂载PA时钟
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;				 
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO时钟50MHz
 GPIO_Init(GPIOA, &GPIO_InitStructure);
 GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);						

 GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;//BUSY信号
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //例程中对这一输入取了下拉,实际浮空输入也可。
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

将官方例程的Paper_Display.h中关于IO操作的部分替换为STM32的IO操作库函数,并记得注释掉和MSP430的Include,以及添加上和stm32有关的include。

#define nRST_H	GPIO_SetBits(GPIOA,GPIO_Pin_1)//P1OUT|=BIT4
#define nRST_L	GPIO_ResetBits(GPIOA,GPIO_Pin_1)//P1OUT&=~BIT4
#define nCS_H	GPIO_SetBits(GPIOA,GPIO_Pin_3)//P3OUT|=BIT2
#define nCS_L	GPIO_ResetBits(GPIOA,GPIO_Pin_3)//P3OUT&=~BIT2
#define SDA_H	GPIO_SetBits(GPIOA,GPIO_Pin_5)//P3OUT|=BIT3
#define SDA_L	GPIO_ResetBits(GPIOA,GPIO_Pin_5)//P3OUT&=~BIT3
#define SCLK_H   GPIO_SetBits(GPIOA,GPIO_Pin_4)//P2OUT|=BIT7
#define SCLK_L   GPIO_ResetBits(GPIOA,GPIO_Pin_4)//P2OUT&=~BIT7
#define nDC_H 	GPIO_SetBits(GPIOA,GPIO_Pin_2)//P3OUT|=BIT4
#define nDC_L 	GPIO_ResetBits(GPIOA,GPIO_Pin_2)//P3OUT&=~BIT4
#define nBUSY	GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//P2IN & BIT2

在Paper_Display.c中include入stm32的相关头文件,对于延迟相关的可以根据注释标识的延迟时间,将其替换为delay.h中的delay_ms和delay_us,开头的#define DELAY_TIME 50最好改为#define DELAY_TIME 1降低刷新缓冲区后的等待时间。
PaperIO_Int函数里的内容全部注释掉,改成GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);
READBUSY()函数改成如下内容

void READBUSY()
{
  while(1)
  {	 //=1 BUSY
     if(nBUSY==0)
    	 break;
  }
  delay_ms(5);//DELAY_M(2);
}

然后,按照例程写一个类似的测试函数。

#include "sys.h"
#include "delay.h"

 int main(void)
 {
	 int freshcount=0;
	 char strs[40];
	 delay_init();
	 Eink_GPIO_Init();//初始化GPIO
	 PaperIO_Int(;
	 INIT_SSD1673();//初始化
	 Init_buff();
	 DIS_IMG(1);
	 display((unsigned char *)"2018-11-10 ByAyahuasec/shsx5543",0,16,0,0,0,0);
	 while(1)
	 {
		 sprintf(strs,"Fresh Count:%d",freshcount++);
		 display((unsigned char *)strs,0,0,0,0,0,0);
		 DIS_IMG(1);
	 }
 }

连接STLink,下载,运行。效果如下图,每计数一次刷新一次屏幕,显示计数值。
记一次移植MSP40F5529PocketKit墨水屏驱动到STM32F103C8T6的过程_第5张图片
原创,转载请告知

你可能感兴趣的:(STM32,外设驱动)