请你书写代码,实现:STM32在100100处画120120正方形,背景为红色,方块为蓝色
时间: 2024-05-09 07:17:15 浏览: 10
好的,以下是代码实现:
```
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_spi.h"
#include "stm32f10x_tim.h"
void drawSquare(int x, int y, int size, int bgColor, int sqColor);
void setup()
{
// 开启GPIO和TIM时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_TIM1, ENABLE);
// 配置PA8为TIM1通道1的输出PWM
GPIO_InitTypeDef gpioInit;
gpioInit.GPIO_Pin = GPIO_Pin_8;
gpioInit.GPIO_Mode = GPIO_Mode_AF_PP;
gpioInit.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpioInit);
// 配置TIM1为PWM模式
TIM_TimeBaseInitTypeDef timBaseInit;
timBaseInit.TIM_Period = 7999;
timBaseInit.TIM_Prescaler = 11;
timBaseInit.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &timBaseInit);
TIM_OCInitTypeDef timOcInit;
timOcInit.TIM_OCMode = TIM_OCMode_PWM1;
timOcInit.TIM_OutputState = TIM_OutputState_Enable;
timOcInit.TIM_Pulse = 0;
TIM_OC1Init(TIM1, &timOcInit);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
// 启动TIM1
TIM_Cmd(TIM1, ENABLE);
}
int main(void)
{
// 初始化
setup();
// 画正方形,默认位置和大小为(100, 100, 120)
drawSquare(100, 100, 120, 0xff0000, 0x0000ff);
// 死循环
while (1);
return 0;
}
void drawSquare(int x, int y, int size, int bgColor, int sqColor)
{
uint16_t init_x = x;
uint16_t init_y = y;
// 配置SPI接口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE);
GPIO_InitTypeDef gpio_init;
gpio_init.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_4;
gpio_init.GPIO_Speed = GPIO_Speed_10MHz;
gpio_init.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &gpio_init);
spi_init();
// 画背景色(红色)
set_color(bgColor);
spi_set_pos(init_x, init_y, init_x+size-1, init_y+size-1);
for (int i = 0; i < size*size; i++)
{
spi_write_data(bgColor >> 8);
spi_write_data(bgColor & 0xff);
}
// 画正方形(蓝色)
set_color(sqColor);
spi_set_pos(init_x+1, init_y+1, init_x+size-2, init_y+size-2);
for (int i = 0; i < (size-2)*(size-2); i++)
{
spi_write_data(sqColor >> 8);
spi_write_data(sqColor & 0xff);
}
}
void spi_init() {
SPI_InitTypeDef spi_init;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
spi_init.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
spi_init.SPI_Mode = SPI_Mode_Master;
spi_init.SPI_DataSize = SPI_DataSize_16b;
spi_init.SPI_CPOL = SPI_CPOL_High;
spi_init.SPI_CPHA = SPI_CPHA_2Edge;
spi_init.SPI_NSS = SPI_NSS_Soft;
spi_init.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
spi_init.SPI_FirstBit = SPI_FirstBit_MSB;
spi_init.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &spi_init);
SPI_Cmd(SPI1, ENABLE);
}
void set_color(uint16_t color) {
TIM1->CCR1 = (color >> 8) << 2;
}
void spi_send_cmd(uint8_t cmd){
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
SPI_I2S_SendData(SPI1, cmd);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) != RESET);
}
void spi_send_data(uint8_t data){
GPIO_SetBits(GPIOA, GPIO_Pin_4);
SPI_I2S_SendData(SPI1, data);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) != RESET);
}
void spi_set_pos(uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end){
spi_send_cmd(0x2A);//Column Command Set
spi_send_data(x_start >> 8);
spi_send_data(x_start & 0xff);
spi_send_data(x_end >> 8);
spi_send_data(x_end & 0xff);
spi_send_cmd(0x2B);//Row Command Set
spi_send_data(y_start >> 8);
spi_send_data(y_start & 0xff);
spi_send_data(y_end >> 8);
spi_send_data(y_end & 0xff);
spi_send_cmd(0x2C);//Memory Write
}
void spi_write_data(uint16_t data) {
spi_send_data(data >> 8);
spi_send_data(data & 0xff);
}
```