随着时间的推移,第一批收到光立方套件的网友们已经完成了焊接工作,开始了程序的编写与硬件检测的阶段。版主为了缩短STM32芯片程序开发的过程,节省由于软件问题带来的硬件检测异常,编写光立方硬件测试代码。现将源代码分享给大家。
第一部分:底层spi驱动配置与数据显示
BSP文件头文件
	
#define LAYERn                           8 
#define LAYER0_PIN                       GPIO_Pin_11
#define LAYER0_GPIO_PORT                 GPIOB
#define LAYER0_GPIO_CLK                  RCC_APB2Periph_GPIOB
 
#define LAYER1_PIN                       GPIO_Pin_10
#define LAYER1_GPIO_PORT                 GPIOB
#define LAYER1_GPIO_CLK                  RCC_APB2Periph_GPIOB  
                                         
#define LAYER2_PIN                       GPIO_Pin_1
#define LAYER2_GPIO_PORT                 GPIOB
#define LAYER2_GPIO_CLK                  RCC_APB2Periph_GPIOB  
                                         
#define LAYER3_PIN                       GPIO_Pin_0  
#define LAYER3_GPIO_PORT                 GPIOB
#define LAYER3_GPIO_CLK                  RCC_APB2Periph_GPIOB  
                                         
#define LAYER4_PIN                       GPIO_Pin_6
#define LAYER4_GPIO_PORT                 GPIOB
#define LAYER4_GPIO_CLK                  RCC_APB2Periph_GPIOB
#define LAYER5_PIN                       GPIO_Pin_7
#define LAYER5_GPIO_PORT                 GPIOB
#define LAYER5_GPIO_CLK                  RCC_APB2Periph_GPIOB
#define LAYER6_PIN                       GPIO_Pin_8
#define LAYER6_GPIO_PORT                 GPIOB
#define LAYER6_GPIO_CLK                  RCC_APB2Periph_GPIOB
#define LAYER7_PIN                       GPIO_Pin_9
#define LAYER7_GPIO_PORT                 GPIOB
#define LAYER7_GPIO_CLK                  RCC_APB2Periph_GPIOB
	
	
BSP文件
	
/**
  * @brief  called from main.c
  * @param  
  * @retval 
  * @date   2014-03-24
  * @note   
  */
void Bsp_Init(void)
{
  SysClockInit();
  Bsp_LayerInit();
  Uart1Init(115200);
  HC595_Init();
}
/**
  * @brief  initial the sysclock, 
  * @param  
  * @retval 
  * @date   2014-03-24
  * @note   
  */
static void SysClockInit(void)
{
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/   
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();
  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);
  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();
  if (HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
 
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1); 
    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);
    /* PLLCLK = 12MHz * 6 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6);    /* 此处需要根据外部晶振的改变而改变 */
    /* Enable PLL */ 
    RCC_PLLCmd(ENABLE);
    /* Wait till PLL is ready */
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }
    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock configuration.
       User can add here some code to deal with this error */    
    /* Go to infinite loop */
    while (1)
    {
    }
  }
}
/**
  * @brief  初始化板载8层LED灯
  * @param  none
  * @retval none
  * @date   2014-04-27
  * @note   
  */
void Bsp_LayerInit(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(LAYER0_GPIO_CLK, ENABLE);
  
  GPIO_InitStructure.GPIO_Pin = LAYER0_PIN | LAYER1_PIN | LAYER2_PIN | LAYER3_PIN | LAYER4_PIN | LAYER5_PIN | LAYER6_PIN | LAYER7_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  
  GPIO_Init(LAYER0_GPIO_PORT, &GPIO_InitStructure);
}
/**
  * @brief  给某一层LED灯通电
  * @param  uint8_t lay
  * @retval 
  * @date   2014-06-30
  * @note   
  */
void Bsp_LayerOn(uint8_t lay)
{
  switch(lay)
  {
    case 0:
    {
      GPIO_SetBits(LAYER0_GPIO_PORT, LAYER0_PIN);
      break;
    }
    case 1:
    {
      GPIO_SetBits(LAYER1_GPIO_PORT, LAYER1_PIN);
      break;
    }
    case 2:
    {
      GPIO_SetBits(LAYER2_GPIO_PORT, LAYER2_PIN);
      break;
    }
    case 3:
    {
      GPIO_SetBits(LAYER3_GPIO_PORT, LAYER3_PIN);
      break;
    }
    case 4:
    {
      GPIO_SetBits(LAYER4_GPIO_PORT, LAYER4_PIN);
      break;
    }
    case 5:
    {
      GPIO_SetBits(LAYER5_GPIO_PORT, LAYER5_PIN);
      break;
    }
    case 6:
    {
      GPIO_SetBits(LAYER6_GPIO_PORT, LAYER6_PIN);
      break;
    }
    case 7:
    {
      GPIO_SetBits(LAYER7_GPIO_PORT, LAYER7_PIN);
      break;
    }
  }
}
/**
  * @brief  给某一层LED灯断电
  * @param  uint8_t lay
  * @retval 
  * @date   2014-06-30
  * @note   
  */
void Bsp_LayerOff(uint8_t lay)
{
  switch(lay)
  {
    case 0:
    {
      GPIO_ResetBits(LAYER0_GPIO_PORT, LAYER0_PIN);
      break;
    }
    case 1:
    {
      GPIO_ResetBits(LAYER1_GPIO_PORT, LAYER1_PIN);
      break;
    }
    case 2:
    {
      GPIO_ResetBits(LAYER2_GPIO_PORT, LAYER2_PIN);
      break;
    }
    case 3:
    {
      GPIO_ResetBits(LAYER3_GPIO_PORT, LAYER3_PIN);
      break;
    }
    case 4:
    {
      GPIO_ResetBits(LAYER4_GPIO_PORT, LAYER4_PIN);
      break;
    }
    case 5:
    {
      GPIO_ResetBits(LAYER5_GPIO_PORT, LAYER5_PIN);
      break;
    }
    case 6:
    {
      GPIO_ResetBits(LAYER6_GPIO_PORT, LAYER6_PIN);
      break;
    }
    case 7:
    {
      GPIO_ResetBits(LAYER7_GPIO_PORT, LAYER7_PIN);
      break;
    }
  }
}
/**
  * @brief  初始化74HC595的驱动方式,使用spi2接口
  * @param  none
  * @retval none
  * @date   2014-06-15
  * @note   使用SPI2的单向,仅发送,低速APB1,最大36MHz
  */
void HC595_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;
  /*!<  PB13 => SPI2_SCK(LED_SCK); PB15 => SPI2_MOSI(LED_TX) Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  /*!< SPI2 Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
  
  /*!< Configure SPI pins: SCK */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  /*!< Configure sFLASH_SPI pins: MOSI */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  /*!< SPI configuration */
  SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI2, &SPI_InitStructure);
  /*!< Enable the sFLASH_SPI  */
  SPI_Cmd(SPI2, ENABLE);
  
  
  /*!< Configure PB14 => ROW  */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/**
  * @brief  发送一层的数据
  * @param  uint8_t *BufPtr:发送缓冲区,共8字节数据
  * @retval 
  * @date   2014-06-17
  * @note   
  */
void H595SendData(const uint8_t *BufPtr)
{
    
    /*!< Send byte through the SPI2 peripheral */
    SPI_I2S_SendData(SPI2, *BufPtr); 
    
    /*!< Loop while DR register in not emplty */
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
 
} 
/**
  * @brief  显示一次内容
  * @param  
  * @retval 
  * @date   2014-07-10
  * @note   
  */
void DispLayer(const uint8_t *BufPtr)
{
  uint8_t i;
  for(i = 0; i < 8; i++)
  {
    H595SendData(BufPtr + i);
  }
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET);
  
}
	
	
	
#include #include #include #include "content.h"
	
	
main文件
	
#include "main.h"
#include "bsp.h"
/** @addtogroup STM32_EEPW
  * @{
  */
/** @defgroup LEDCUBE 
  * @brief 
  * @{
  */
/** @defgroup LEDCUBE_Private_TypesDefinitions
  * @{
  */
/**
  * @}
  */
/** @defgroup LEDCUBE_Private_Defines
  * @{
  */
/**
  * @}
  */
/** @defgroup LEDCUBE_Private_Macros
  * @{
  */
/**
  * @}
  */
/** @defgroup LEDCUBE_Private_Variables
  * @{
  */
uint16_t gSecond= 0;
uint8_t gDisp = 0;
uint16_t gCount = 0;
/**
  * @}
  */
/** @defgroup LEDCUBE_Private_FunctionPrototypes
  * @{
  */
/**
  * @}
  */
/** @defgroup LEDCUBE_Private_Functions
  * @{
  */
/**
  * @brief  main function
  * @param  
  * @retval 
  * @date   2014-03-24
  * @note   
  */
void main(void)
{
 
  Bsp_Init();  /*!< 底层外设模块初始化 */
  if (SysTick_Config(72000))  /*!< 1000Hz(1ms)中断间隔 */
  {
    while (1);
  }
  
  while(true)
  {
    if(gCount == 2)
    {
      gCount = 0;
      
      Bsp_LayerOff(gDisp);  //关闭当前层的显示
      gDisp++;
      if(gDisp > 7)
      {
        gDisp = 0;
      }
 
      GPIO_ResetBits(GPIOB, GPIO_Pin_14);
  
      DispLayer(content + gDisp * 8);
 
      GPIO_SetBits(GPIOB, GPIO_Pin_14); //发送显示开启上升沿
      
      GPIO_ResetBits(GPIOB, GPIO_Pin_14);
      
      Bsp_LayerOn(gDisp); //打开当前层的显示
    }
  }
}
void SysTick_Handler(void)
{
  if(gCount < 2)
  {
    gCount++;
  }
  else
  {
    gCount = 2;
  }
  
  if(gSecond < 1000)
  {
    gCount++;
  }
  else
  {
    gCount = 1000;
  }
}
	
	
显示内容头文件
	
 /**
  * @brief  光立方显示内容,全亮
  *  
  */
const uint8_t content[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  
};
	
	
本测试程序工程使用IAR for ARM 6.7版本编译。工程文件下载地址如下:
http://share.eepw.com.cn/share/download/id/166522
	
	
	
	
			
			
			
						
			
 
 我要赚赏金
