程序如下:
//定时中断程序,改部分代码可以实现TIMER2~TIME4的定时中断
//void TIM2_IRQHandler(void)改成对应中断号
//RCC->APB1ENR|=1<<0;改成对应中断的使能
//TIM2->ARR;TIM2->PSC;TIM2->DIER;TIM2->CR1;改成对应结构体
//MY_NVIC_Init(1,3,TIM2_IRQChannel,2);改对应优先级
//若不想使用中断,屏蔽MY_NVIC_Init(1,3,TIM2_IRQChannel,2);
#include <stm32f10x_lib.h>
#include "sys.h"
#include "delay.h"
#define CS PBout(12) // PB10
#define SPI_SPEED_2 0
#define SPI_SPEED_8 1
#define SPI_SPEED_16 2
#define SPI_SPEED_256 3
void SPIx_Init(void); //初始化 SPI 口
unsigned char SPI[3];
unsigned char i;
unsigned char a;
u8 SPIx_ReadWriteByte(u8 TxData);
void SPIx_SetSpeed(u8 SpeedSet);
//SPI 总线读写一个字节
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
RCC->APB2ENR|=1<<3; //使能PORTB时钟
a=0;
for(i=0;i<3;i++)
{
SPI=0x33;
}
SPIx_Init();
SPIx_SetSpeed(SPI_SPEED_2);
SPIx_ReadWriteByte(0x01);
while(1)
{
}
}
u8 SPIx_ReadWriteByte(u8 TxData)
{
unsigned char retry=0;
CS=0;
// while((SPI2->SR&1<<1)==0) //等待发送区空
// {
// retry++;
// if(retry>200)return 0;
// }
SPI2->DR=TxData; //发送一个byte
while((SPI2->SR&1<<1)==0) //等待发送区空
{
retry++;
if(retry>200)return 0;
}
retry=0;
// for(i=0;i<3;i++)
// {
//// CS=0;
// while((SPI2->SR&1<<0)==1) //等待接收完一个byte
// {
// retry++;
// if(retry>200)return 0;
// }
// //return SPI1->DR; //返回收到的数据
// SPI2->SR|=0x01;
// SPI=SPI2->DR;
// delay_ms(200);
// retry=100;
//// CS=1;
// }
// CS=1;
return 0;
}
//SPI 速度设置函数
//SpeedSet:
//SPI_SPEED_2 2 分频 (SPI [email=36M@sys]36M@sys[/email] 72M)
//SPI_SPEED_8 8 分频 (SPI [email=9M@sys]9M@sys[/email] 72M)
//SPI_SPEED_16 16 分频 (SPI [email=4.5M@sys]4.5M@sys[/email] 72M)
//SPI_SPEED_256 256 分频 (SPI [email=281.25K@sys]281.25K@sys[/email] 72M)
void SPIx_SetSpeed(u8 SpeedSet)
{
SPI2->CR1&=0XFFC7; //Fsck=Fcpu/256
if(SpeedSet==SPI_SPEED_2) //二分频
{
SPI2->CR1|=0<<3; //Fsck=Fpclk/2=36Mhz
}
else if(SpeedSet==SPI_SPEED_8)
//八分频
{
SPI2->CR1|=2<<3; //Fsck=Fpclk/8=9Mhz
}
else if(SpeedSet==SPI_SPEED_16)
//十六分频
{
SPI2->CR1|=3<<3; //Fsck=Fpclk/16=4.5Mhz
}
else //256 分频
{
SPI2->CR1|=7<<3; //Fsck=Fpclk/256=281.25Khz 低速模式
}
SPI1->CR1|=1<<6; //SPI 设备使能
}
void SPIx_Init(void)
{
RCC->APB2ENR|=1<<3; //PORTB 时钟使能
RCC->APB1ENR|=1<<14; //SPI2 时钟使能
//这里只针对 SPI 口初始化
GPIOB->CRH&=0X000FFFFF;
GPIOB->CRH|=0XBBB00000; //PB13.14.15 复用
GPIOB->ODR|=0x7<<13; //PA13.14.15 上拉
GPIOB->CRH&=0XFFF0FFFF;
GPIOB->CRH|=0X00030000; //PA5.6.7 复用
//GPIOB->ODR|=0X7<<13; //PA5.6.7 上拉
SPI2->CR1|=0<<6; //SPI 设备不使能
SPI2->CR2|=1<<6; //开发送接收中断
SPI2->CR1|=0<<10; //全双工模式
SPI2->CR1|=1<<9; //软件nss 管理
SPI2->CR1|=1<<8;
SPI2->CR1|=1<<2; //SPI 主机
SPI2->CR1|=0<<11; //8bit 数据格式
SPI2->CR1|=1<<1; //空闲模式下SCK 为 1 CPOL=1
SPI2->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1
SPI2->CR1|=7<<3; //Fsck=Fcpu/256
SPI2->CR1|=0<<7; //MSBfirst
SPI2->CR1|=1<<6; //SPI 设备使能
MY_NVIC_Init(3,4,SPI2_IRQChannel,4);
SPIx_ReadWriteByte(0xff); //启动传输
}
void SPI2_IRQHandler(void)
{
a++;
}
硬件仿真的时候老是在a++这行了,不知道大家有没有遇到过这种情况 |