初级会员

- 积分
- 143
- 金钱
- 143
- 注册时间
- 2012-7-11
- 在线时间
- 0 小时
|
/*头文件--------------------------------------------------------------------------*/
#include "stm32f10x_lib.h"
//#include "stm32f10x.h"
//#include "stm32f10x_systick.h"
#include "stdio.h"
#include "string.h"
SPI_InitTypeDef SPI_InitStructure;//定义SPI初始化结构体
vu8 LED_out[9];//SPI待发射数码管码字
vu8 LED_buf[30]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,
0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0xFF,0xFF,0xFF,0x00,0x00,0x00};
const u8 LED_bm[32]=
{
/*显示字符:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,0.,1.,2.,3.,4.,5.,6.,7.,8.,9.,灭,-,-,-,-,-*/
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,
0x40,0x79,0x24,0x30,0x19,0x12,0x20,0x78,0x00,0x10,0xff,0xbf,0xbf,0xbf,0xbf,0xbf
};
/*自定义函数声明--------------------------------------------------------------------*/
void RCC_Configuration(void);//设置系统时钟
void GPIO_Configuration(void);//设置GPIO端口
void SPI_Configuration(void);//设置SPI
void SysTick_Configuration(void);//设置定时器
void Delay_Second(void);//延时函数
void RTC_Configurate(void);
void NVIC_Configuration(void);
int main(void)
{
u8 i,j,temp=0x80,temp1,temp2,temp3;
const u8 *p;
p=&LED_bm[0];
RCC_Configuration();
GPIO_Configuration();
SPI_Configuration();
SysTick_Configuration();
RTC_Configurate();
NVIC_Configuration();
SPI_I2S_DeInit(SPI1);//将外设SPI1寄存器重设为默认值
/*设这SPI为发射机--------------------------------------------------------------------*/
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
SPI_Init(SPI1,&SPI_InitStructure);
SPI_Cmd(SPI1,ENABLE);//使能SPI
while(1)
{
// GPIO_SetBits(GPIOB,GPIO_Pin_0);
for(i=0;i<8;i++)
{
if((LED_buf[27]==0)&&(LED_buf[29]==0)){temp1=LED_buf;}
else if(LED_buf[27]==i+1){temp1=0x1a;}
LED_out[0]=*(p+temp1);
if((LED_buf[27]==0)&&(LED_buf[29]==0)){temp2=LED_buf[i+8];}
else if(LED_buf[27]==i+9){temp2=0x1a;}
LED_out[3]=*(p+temp2);
if((LED_buf[27]==0)&&(LED_buf[29]==0)){temp3=LED_buf[i+16];}
else if(LED_buf[27]==i+17){temp3=0x1a;}
LED_out[6]=*(p+temp3);
LED_out[2]=LED_buf[24];
LED_out[5]=LED_buf[25];
LED_out[8]=LED_buf[26];
if((LED_buf[28]==0)&&(LED_buf[29]==0))
{
LED_out[2]=LED_buf[24];
LED_out[5]=LED_buf[25];
LED_out[8]=LED_buf[26];
}
else if(LED_buf[28]!=0)
{
switch(LED_buf[28])
{
case 0x01 ED_buf[24]&=0x01;break;case 0x02 ED_buf[24]&=0x02;break;
case 0x03 ED_buf[24]&=0x04;break;case 0x04 ED_buf[24]&=0x08;break;
case 0x05 ED_buf[24]&=0x10;break;case 0x06 ED_buf[24]&=0x20;break;
case 0x07 ED_buf[24]&=0x40;break;case 0x08 ED_buf[24]&=0x80;break;
case 0x09 ED_buf[25]&=0x01;break;case 0x0a ED_buf[25]&=0x02;break;
case 0x0b:LED_buf[25]&=0x04;break;case 0x0c:LED_buf[25]&=0x08;break;
case 0x0d:LED_buf[25]&=0x10;break;case 0x0e:LED_buf[25]&=0x20;break;
case 0x0f:LED_buf[25]&=0x40;break;case 0x10:LED_buf[25]&=0x80;break;
case 0x11:LED_buf[26]&=0x01;break;case 0x12:LED_buf[26]&=0x02;break;
case 0x13:LED_buf[26]&=0x04;break;case 0x14:LED_buf[26]&=0x08;break;
case 0x15:LED_buf[26]&=0x10;break;case 0x16:LED_buf[26]&=0x20;break;
case 0x17:LED_buf[26]&=0x40;break;case 0x18:LED_buf[26]&=0x80;break;
default:break;
}
LED_out[2]=LED_buf[24];
LED_out[5]=LED_buf[25];
LED_out[8]=LED_buf[26];
}
LED_out[1]=temp;
LED_out[4]=temp;
LED_out[7]=temp;
for(j=0;j<9;j++)
{
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI1,LED_out[j]);
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)== RESET);
SPI_I2S_ReceiveData(SPI1);
}
GPIO_SetBits(GPIOB,GPIO_Pin_1);//输出九个字节后CS输出一个高电平的脉冲
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
temp>>=1;//控制码字左移移位
if(temp==0x00) {temp=0x80;}
Delay_Second();//延时3ms
}
}
}
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus; //定义枚举类型变量HSEStartUpStatus
RCC_DeInit(); //复位系统时钟
RCC_HSEConfig(RCC_HSE_ON); //开启HSE
HSEStartUpStatus=RCC_WaitForHSEStartUp();//等待HSE起振并稳定
/*判断HSE起是否振成功,是则进入if(内部)*/
if(HSEStartUpStatus==SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); //选择HCLK(APB)时钟源为SYSCLK 1分频
RCC_PCLK2Config(RCC_SYSCLK_Div1); //选择PCLK2时钟源为HCLK(APB) 1分频
RCC_PCLK1Config(RCC_SYSCLK_Div2); //选择PCLK1时钟源为HCLK(APB) 2分频
FLASH_SetLatency(FLASH_Latency_0); //设置Flash延时周期数为0
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能Flash预取缓存
/*选择PLL时钟源为HSE 1分频*/
// RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
// RCC_PLLCmd(ENABLE); //使能PLL
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY==RESET));//等待HSE输出稳定
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);//选择SYSCLK时钟为HSE
while(RCC_GetSYSCLKSource()!=0x04); // 等待PLL成为SYS时钟源
}
/*打开GPIOA、GPIOB和SPI1时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_SPI1,ENABLE);
}
void GPIO_Configuration(void)
{
/*定义GPIO初始化结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*设置SPI引脚:SCK,MISO和MOSI*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
/*设置SPI引脚:CS*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void SPI_Configuration(void)
{
/*SPI设置为双线双向全双工,SPI发送接收8位帧结构,时钟悬空低,数据
捕获雨第1个时钟沿,内部HSE信号由SSI位控制,波特率预分频值为4,数据
传输从MSB为开始,用于CRC值计算的多项式*/
SPI_InitStructure.SPI_Direction=SPI_Direction_1Line_Tx;
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_4;
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial=7;
/*设置SPI为发射机*/
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
SPI_Init(SPI1,&SPI_InitStructure);
SPI_Cmd(SPI1,ENABLE);//使能SPI
}
void SysTick_Configuration(void)
{
SysTick_CounterCmd(SysTick_Counter_Disable); //失能Systick定时器
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择HCLK为Systick时钟源
SysTick_CounterCmd(SysTick_Counter_Clear); //消除Systick计数器
/*主频为11.0592MHz,设置计数器值为33177.6可以得到3ms定时间隔*/
SysTick_SetReload(27000);
}
void Delay_Second(void)
{
SysTick_CounterCmd(SysTick_Counter_Enable); //启动Systick计数
while(SysTick_GetFlagStatus(SysTick_FLAG_COUNT)==0); //等待Systick计数至0
SysTick_CounterCmd(SysTick_Counter_Disable); //失能Systick定时器
SysTick_CounterCmd(SysTick_Counter_Clear); //清楚Systick计数器
}
void RTC_Configurate(void)
{
/* Enable PWR and BKP clocks */ //使能PWR和备份模块
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
/* Allow access to BKP Domain */
PWR_BackupAccessCmd(ENABLE); //使能备份访问
/* Reset Backup Domain */
BKP_DeInit(); //初始化为缺省值
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON); //使能外部高速时钟
/* Wait till LSE is ready */
while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET) //等待时钟就绪
{}
/* Select LSE as RTC Clock Source */
RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128); //选择外部高速时钟128分频作为时钟源
/* Enable RTC Clock */
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
/* Wait for RTC registers synchronization */
RTC_WaitForSynchro(); //等待时钟寄存器同步
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask(); //等待最后一次写操作完成
/* Enable the RTC Second */
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能秒中断
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask(); //等待最后一次写操作完成
/* Set RTC prescaler: set RTC period to 500MS */
RTC_SetPrescaler(43199); /* RTC period = RTCCLK/RTC_PR = (11059.2/128 KHz)/(43199+1) */
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask(); //等待写操作完成
}
//-----------------------NVIC向量表配置函数---------------------------
/*******************************************************************************
* Function Name : NVIC_Configuration
* Description :
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure; //构造一个NVIC结构体对象
NVIC_InitStructure.NVIC_IRQChannel =RTC_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
大神 偶的程序有问题吗 是不能发射数据吗
|
|