如何将数据从 stm32f0 发送到 max7219 点阵以制作乒乓球游戏

问题描述 投票:0回答:0

亲爱的帮手和编码神,我想用程序应用程序keill在stm32f0上制作一个spi连接到点阵的乒乓球游戏,以及硬件,MAX7219点阵模块8x8与SPI1通信到8x8 LED矩阵。 点阵接5v、gnd、pa7、pa4和pa5以及

我的问题是如何通过 spi 连接将内容写入屏幕以玩游戏,但首先是 h 或其他一些简单的东西。因为我不知道我做错了什么。 dac 与程序无关。

下面是我的代码,只需将 h 写入屏幕,这样我就可以开始编写游戏代码了。但是 het 没有写 annuthing,我的编辑器 keill 说函数 SPI_I2S_SendData 的隐式声明

/******************************************************************************
 * File           : Main program - Single Mode
 *****************************************************************************/
#include "stm32f0xx.h"
#include "stm32f0_discovery.h"
#include "helper.h"
#include "stm32f0xx_gpio.h"
//#include "stm32f0xx_spi.h"


/* SPI1 pin definition */
#define SPI1_SCK_PIN    GPIO_Pin_5
#define SPI1_MISO_PIN   GPIO_Pin_4
#define SPI1_MOSI_PIN   GPIO_Pin_7
#define SPI1_GPIO_PORT  GPIOA
#define SPI1_GPIO_CLK   RCC_AHBPeriph_GPIOA

/* MAX7219 command definitions */
#define MAX7219_NOOP            0x00
#define MAX72`19_DIGIT0          0x01
#define MAX7219_DIGIT1          0x02
#define MAX7219_DIGIT2          0x03
#define MAX7219_DIGIT3          0x04
#define MAX7219_DIGIT4          0x05
#define MAX7219_DIGIT5          0x06
#define MAX7219_DIGIT6          0x07
#define MAX7219_DIGIT7          0x08
#define MAX7219_DECODEMODE      0x09
#define MAX7219_INTENSITY       0x0A
#define MAX7219_SCANLIMIT       0x0B
#define MAX7219_SHUTDOWN        0x0C
#define MAX7219_DISPLAYTEST     0x0F

/* Function prototypes */
void SPI1_Init(void);
void MAX7219_Init(void);
void MAX7219_SendData(uint8_t reg, uint8_t data);

int main(void)
{
    /* Initialize SPI1 */
    SPI1_Init();

    /* Initialize MAX7219 */
    MAX7219_Init();

    /* Main loop */
    while (1)
    {
        /* Display a "H" character on the matrix */
        MAX7219_SendData(MAX7219_DIGIT0, 0x7E);
        MAX7219_SendData(MAX7219_DIGIT1, 0x09);
        MAX7219_SendData(MAX7219_DIGIT2, 0x09);
        MAX7219_SendData(MAX7219_DIGIT3, 0x7E);
        MAX7219_SendData(MAX7219_DIGIT4, 0x00);
        MAX7219_SendData(MAX7219_DIGIT5, 0x00);
        MAX7219_SendData(MAX7219_DIGIT6, 0x00);
        MAX7219_SendData(MAX7219_DIGIT7, 0x00);
    }
}

/* Initialize SPI1 */
void SPI1_Init(void)
{
    SPI_InitTypeDef SPI_InitStruct;
    GPIO_InitTypeDef GPIO_InitStruct;

    /* Enable SPI1 and GPIOA clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
    RCC_AHBPeriphClockCmd(SPI1_GPIO_CLK, ENABLE);

    /* Configure SPI1 pins: SCK, MISO and MOSI */
    GPIO_InitStruct.GPIO_Pin = SPI1_SCK_PIN | SPI1_MISO_PIN | SPI1_MOSI_PIN;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(SPI1_GPIO_PORT, &GPIO_InitStruct);

    /* Connect SPI1 pins to AF */
    GPIO_PinAFConfig(SPI1_GPIO_PORT, GPIO_PinSource5, GPIO_AF_0); // SCK
    GPIO_PinAFConfig(SPI1_GPIO_PORT, GPIO_PinSource6, GPIO_AF_0); // MISO
    GPIO_PinAFConfig(SPI1_GPIO_PORT, GPIO_PinSource7, GPIO_AF_0); // MOSI

    /* Configure SPI1 */
    SPI_StructInit(&SPI_InitStruct);
    SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
    SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
    SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
    SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
    SPI_Init(SPI1, &SPI_InitStruct);

    /* Enable SPI1 */
    SPI_Cmd(SPI1, ENABLE);
}

/* Initialize MAX7219 */
void MAX7219_Init(void)
{
    /* Configure SPI1 */
    SPI1_Init();

    /* Send initialization data to MAX7219 */
    MAX7219_SendData(MAX7219_SCANLIMIT, 0x07);    // Display all digits
    MAX7219_SendData(MAX7219_DECODEMODE, 0x00);   // No decoding
    MAX7219_SendData(MAX7219_SHUTDOWN, 0x01);      // Normal operation
    MAX7219_SendData(MAX7219_DISPLAYTEST, 0x00);  // No display test
    MAX7219_SendData(MAX7219_INTENSITY, 0x0F);     // Maximum intensity
}

/* Send data to MAX7219 */
void MAX7219_SendData(uint8_t reg, uint8_t data)
{
    /* Select MAX7219 */
    GPIO_ResetBits(GPIOA, GPIO_Pin_4);

    /* Send data */
    SPI_I2S_SendData(SPI1, reg);
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) != RESET) {}
    SPI_I2S_SendData(SPI1, data);
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) != RESET) {}

    /* Deselect MAX7219 */
    GPIO_SetBits(GPIOA, GPIO_Pin_4);
}


// ----------------------------------------------------------------------------
// Function prototypes
// ----------------------------------------------------------------------------
void DAC_Setup(void);

// ----------------------------------------------------------------------------
// Main
// ----------------------------------------------------------------------------
int main2(void)
{
  uint32_t i;
  
  // Configure LED3 and LED4 on STM32F0-Discovery
  STM_EVAL_LEDInit(LED3);
  STM_EVAL_LEDInit(LED4);
  
  // Initialize User Button on STM32F0-Discovery
  STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_GPIO);
  
  DAC_Setup();
  
  while(1)
  {
    // Assuming Uled = 1.8 V
    // (4095 * 1.8) / 3 = 2457

    for(i=4095; i>2457; i--)
    {
      Delay(SystemCoreClock/8/1000);
      DAC_SetChannel1Data(DAC_Align_12b_R, i);
    }

    for(i=2457; i<=4095; i++)
    {
      Delay(SystemCoreClock/8/1000);
      DAC_SetChannel1Data(DAC_Align_12b_R, i);
    }
  }
}

/**
  * @brief  This function sets PA4 to analog mode and initializes
  *         DAC1.
  * @param  None
  * @retval None
  */
void DAC_Setup(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  DAC_InitTypeDef  DAC_InitStructure;
 
  //(+) Enable DAC APB1 clock to get write access to DAC registers
  //    using RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE)
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
  
  //(+) Configure DAC_OUT1 (DAC_OUT1: PA4) in analog mode
  //    using GPIO_Init() function  
  GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  //(+) Configure the DAC channel using DAC_Init()
  DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
  DAC_Init(DAC_Channel_1, &DAC_InitStructure);
  
  //(+) Enable the DAC channel using DAC_Cmd()
  DAC_Cmd(DAC_Channel_1, ENABLE);
}

我尝试了很多东西,MAX7219_SendData(MAX7219_SCANLIMIT, 0x07); SPI_I2S_SendData(SPI1, 注册); 甚至 digitalWrite(clock_pin,1);但没有任何效果。

c++ spi keil stm32f0 dot-matrix
© www.soinside.com 2019 - 2024. All rights reserved.