第一步,认真阅读原理图,确认哪些引脚被使用了,哪些还可以使用。
经过阅读后,确认以下引脚和SPI片上外设,作为本次驱动ST7735的引脚
#define ST7735_RST_Pin GPIO_PINS_3
#define ST7735_RST_GPIO_Port GPIOA
#define ST7735_DC_Pin GPIO_PINS_1
#define ST7735_DC_GPIO_Port GPIOA
#define ST7735_CS_Pin GPIO_PINS_2
#define ST7735_CS_GPIO_Port GPIOA
#define ST7735_SCK_Pin GPIO_PINS_5
#define ST7735_SCK_GPIO_Port GPIOA
#define ST7735_MOSI_Pin GPIO_PINS_7
#define ST7735_MOSI_GPIO_Port GPIOA
#define ST7735_SPI SPI1
接下来编写驱动接口程序
IO的配置
static void gpio_config()
{
gpio_init_type gpio_initstructure;
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE5, GPIO_MUX_0);
gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE7, GPIO_MUX_0);
gpio_default_para_init(&gpio_initstructure);
//SCK
gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_initstructure.gpio_pull = GPIO_PULL_DOWN;
gpio_initstructure.gpio_mode = GPIO_MODE_MUX;
gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_initstructure.gpio_pins = GPIO_PINS_5;
gpio_init(GPIOA, &gpio_initstructure);
//MOSI
gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_initstructure.gpio_pull = GPIO_PULL_UP;
gpio_initstructure.gpio_mode = GPIO_MODE_MUX;
gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_initstructure.gpio_pins = GPIO_PINS_7;
gpio_init(GPIOA, &gpio_initstructure);
// RST/DC/CS
gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
gpio_initstructure.gpio_pull = GPIO_PULL_NONE;
gpio_initstructure.gpio_pins = GPIO_PINS_3|GPIO_PINS_1|GPIO_PINS_2;
gpio_init(GPIOA, &gpio_initstructure);
}
SPI外设的配置
static void spi_config(void)
{
spi_init_type spi_init_struct;
crm_periph_clock_enable(CRM_SPI1_PERIPH_CLOCK, TRUE);
spi_default_para_init(&spi_init_struct);
spi_init_struct.transmission_mode = SPI_TRANSMIT_HALF_DUPLEX_TX;
spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_2;
spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB;
spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;
spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_HIGH;
spi_init_struct.clock_phase = SPI_CLOCK_PHASE_2EDGE;
spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE;
spi_init(SPI1, &spi_init_struct);
spi_half_duplex_direction_set(SPI1,SPI_HALF_DUPLEX_DIRECTION_TX);
spi_enable(SPI1, TRUE);
}
与ST7735库函数底层接口的映射
void ST7735_delay(uint8_t i)
{
delay_us(i);
}
void ST7735_SPI_SendByte(uint8_t byte)
{
// 判断是否可以继续发送放在之后判断可以避免CS拉高后还没发送结束。可以确保每一次发送都是成功的。
while(spi_i2s_flag_get(ST7735_SPI, SPI_I2S_TDBE_FLAG) == RESET){};
spi_i2s_data_transmit(ST7735_SPI, byte);
}
void ST7735_SPI_RST_SetLow(void)
{
gpio_bits_write(ST7735_RST_GPIO_Port,ST7735_RST_Pin,FALSE);
}
void ST7735_SPI_RST_SetHigh(void)
{
gpio_bits_write(ST7735_RST_GPIO_Port,ST7735_RST_Pin,TRUE);
}
void ST7735_SPI_CS_SetLow(void)
{
gpio_bits_write(ST7735_CS_GPIO_Port,ST7735_CS_Pin,FALSE);
}
void ST7735_SPI_CS_SetHigh(void)
{
gpio_bits_write(ST7735_CS_GPIO_Port,ST7735_CS_Pin,TRUE);
}
void ST7735_SPI_DC_SetLow(void)
{
gpio_bits_write(ST7735_DC_GPIO_Port,ST7735_DC_Pin,FALSE);
}
void ST7735_SPI_DC_SetHigh(void)
{
gpio_bits_write(ST7735_DC_GPIO_Port,ST7735_DC_Pin,TRUE);
}
编写测试主函数
函数中配合板载的LED闪烁。
int main(void)
{
__IO uint32_t index = 0;
system_clock_config();
at32_board_init();
gpio_config();
spi_config();
for(int i=0;i<5;i++)
{
at32_led_on(LED2);
delay_ms(100);
at32_led_off(LED2);
delay_ms(100);
}
ST7735_Init();
ST7735_FillScreen(ST7735_BLACK);
//针对0.96寸屏幕y的参数需要偏移24
// ST7735_DrawRectangle(0,24,160,80,ST7735_BLUE);
ST7735_DrawRoundRect(0,24,160,80,5,ST7735_BLUE);//绘制带圆角方框
ST7735_DrawHLine(1,24+20,158,ST7735_CYAN);//绘制横线
ST7735_DrawHLine(1,24+50,158,ST7735_CYAN);
ST7735_DrawVLine(65-1,24+1,78,ST7735_CYAN); //绘制竖线
ST7735_FillRectangle(70,24+6,10,8,ST7735_MAGENTA);
ST7735_DrawRectangle(85,24+6,11,8,ST7735_BLUE);
for(int i=1;i<=4;i++)
{
ST7735_DrawPixel(85+2*i,24+6+3,ST7735_YELLOW);
ST7735_DrawPixel(85+2*i,24+6+4,ST7735_YELLOW);
}
ST7735_DrawCircle(106,24+10,5,ST7735_YELLOW);
ST7735_FillCircle(121,24+10,5,ST7735_PURPLE);
ST7735_DrawCircleHelper(136,24+10,5,1,ST7735_BLUE);
ST7735_DrawCircleHelper(136,24+10,5,2,ST7735_YELLOW);
ST7735_DrawCircleHelper(136,24+10,5,4,ST7735_RED);
ST7735_DrawCircleHelper(136,24+10,5,8,ST7735_LIME);
ST7735_FillCircleHelper(151,24+10,5,1,0,ST7735_TEAL);
ST7735_FillCircleHelper(151,24+10,5,2,0,ST7735_PURPLE);
ST7735_DrawString(5,24+6,"Hello",ST7735_MAGENTA,ST7735_BLACK,&Font_7x10);//字体实际高度为8个像素,所以偏移6个像素刚好在第一行居中2*6+8=20
ST7735_DrawString(5,24+20+7,"Hello",ST7735_GREEN,ST7735_BLACK,&Font_11x18);//字体实际高度为16个像素,所以偏移7个像素刚好在第一行居中2*7+16=30
ST7735_DrawString(5,24+50+7,"Hello",ST7735_YELLOW,ST7735_BLACK,&Font_11x18);//字体实际高度为16个像素,所以偏移7个像素刚好在第一行居中2*7+16=30
ST7735_DrawLine( 70,24+21,80,24+49,ST7735_BLUE);
ST7735_DrawLine( 90,24+21,80,24+49,ST7735_BLUE);
ST7735_DrawLine( 90,24+21,100,24+49,ST7735_BLUE);
ST7735_DrawLine( 110,24+21,100,24+49,ST7735_BLUE);
ST7735_FillRoundRect(112,24+20+5,40,19,5,ST7735_GRAY);
ST7735_DrawTriangle(70,24+78,100,24+52,100,24+78,ST7735_YELLOW);
ST7735_FillTriangle(110,24+52,110,24+78,148,24+78,ST7735_GREEN);
gpio_bits_write(LED4_GPIO,LED4_PIN,TRUE);
delay_sec(1);
gpio_bits_write(LED4_GPIO,LED4_PIN,FALSE);
delay_sec(1);
gpio_bits_write(LED4_GPIO,LED4_PIN,TRUE);
delay_sec(1);
gpio_bits_write(LED4_GPIO,LED4_PIN,FALSE);
delay_sec(1);
ST7735_FillScreen(ST7735_BLACK);
ST7735_DrawImage(0, 24+0, 160, 80, **);
while(1)
{
gpio_bits_write(LED3_GPIO,LED3_PIN,TRUE);
delay_sec(1);
gpio_bits_write(LED3_GPIO,LED3_PIN,FALSE);
delay_sec(1);
}
}
|
|