我的程序Write-addr和Read-Addr不是相同的,每次从SRAM取出的数据要处理完之后才能取出下一条数据,而数据写入SRAM比较快。
我在串口里面输入一串数据 ,(接收的都是8位的,我将它转成16位的,就是说每来两个数据就进行一次写入SRAM的操作)
u32 Write_addr=0x8000 ; /*定义写的地址*/
u32 Read_addr=0x8000 ; /*定义读的地址*/
u16 ReadData[6];
u16 WriteData[6];
unsigned char RxBuffer[6]; //接收数组
int RxCounter,TxCounter;
void USART1_IRQHandler(void) //串口1中断处理函数
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //检测是否是接收中断
{
RxBuffer[RxCounter++] = USART_ReceiveData(USART1);
if(RxCounter==2)
{RxCounter=0;
WriteData[0]=RxBuffer[0];WriteData[0]<<=8;WriteData[0]|=RxBuffer[1];//两个8位的数组合为一个16位数
FSMC_SRAM_Init(); /*配置与SRAM连接的FSMC BANK1 NOR/SRAM3*/
FSMC_SRAM_WriteBuffer(WriteData,Write_addr,1);/*将数据写入到SRAM中。WRITE_ADDR:写入的起始地址*/
Write_addr+=2;
}
}
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) //检测是否是发送中断
{
USART_SendData(USART1,ReadData[TxCounter++]);
if(TxCounter ==6) //如果发送数据量等于总数据量
{
USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //关闭串口发送中断,停止发送
TxCounter=0; //发送计数器清零
}
}
}
SRAM里数据的读出由外部中断0控制,我预想的是每按 一次EXTI0键,就进行一次SRAM读操作,并且每次读六个数据(下面的程序编写需要六个数据),外部中断同时控制串口的发送中断,每读一次SRAM,串口发送中断使能,在串口调试窗口显示读出的数据(低八位),验证是否正确发送。
void EXTI0_IRQHandler(void)
{ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line0);
FSMC_SRAM_ReadBuffer(ReadData,Read_addr,6); /*从SRAM中读回数据。READ_ADDR:读出数据的起始地址*/
ReadData+=12;
USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //打开串口1发送中断,打开后会立即执行中断发送操作
}
}
程序调试的时候,每次按外部中断0,要么调试窗口没有数据显示,要么显示的数据压根不是我发送的数据,我想问一下我的程序思想是不是错的?我调试很久了,最大的错误还是在FSMC_SRAM_ReadBuffer(ReadData,Read_addr,6)这句话,窗口没有数据显示,我怀疑程序就卡在这句话,数据乱显示,原因我不知道,就这么一句话,我都不知道怎么改程序了!!
|