现在我改变了一种思路,用上位机软件控制串口每次数据发一定量,将一大批字符数据分多次发送,但后写入Flash中,但发生了一些奇怪的问题下面是我的源程序:你帮我分析分析,
uart.c  中断接收部分和发送部分内容)
u8 USART_RX_TX_BUF[129]; //接收缓冲,最大64个字节.
u8 uart_rx,uart_tx,flag,data[];
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET)
{
USART_RX_TX_BUF[uart_rx]=USART_ReceiveData(USART1);
// data[size]=USART_RX_TX_BUF[uart_rx]; size++;
uart_rx++;
if(uart_rx==129) uart_rx=0;
// uart_rx&=0x3f;
}
}
void Send_to_PC(void)
{
while(!flag) //flag=0
{
if(uart_rx!=uart_tx)
{
// Uart_PutChar(USART_RX_TX_BUF[uart_tx]);
uart_tx++;
if(uart_tx==129) uart_tx=0;
// uart_tx&=0X3f;
LED0=!LED0;//提示系统正在运行
LED1=!LED0;//提示系统正在运行
// delay_ms(10);
if(uart_tx==uart_rx) flag=1;
}
}
// return flag;
}
main.c:
/*现在只能写入固定字节数*/
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "spi.h"
#include "flash.h"
//Mini STM32开发板范例代码17
//SPI 实验
//正点原子@ALIENTEK
//技术支持论坛:www.openedv.com
//要写入到W25X16的字符串数组
//#define SIZE sizeof(TEXT_Buffer_SPI)
#define SIZE strlen(USART_RX_TX_BUF)
static u32 add1=0,add2=0;
//extern u8 datatemp[22];
int main(void)
{
// u8 SIZE;
u16 i=0,j=0,num1,num2;
//static u32 add;
// SIZE=strlen(USART_RX_TX_BUF);
u8 datatemp1[129] ,datatemp2[128] ;
SystemInit();
delay_init(72); //延时初始化
NVIC_Configuration();
uart_init(9600);
LED_Init();
SPI_Flash_Init(); //SPI FLASH 初始化
printf("Mini STM32\n");
printf("SPI TEST\n");
printf("ATOM@ALIENTEK\n");
printf("2012年8月~~\n");
while(SPI_Flash_ReadID()!=FLASH_ID)//检测不到W25X16
{
i=SPI_Flash_ReadID();
printf("ID:%d\n",i);
printf("W25X16 Check Failed!\n");
delay_ms(500);
printf(" Please Check! \n");
delay_ms(500);
LED0=!LED0;//DS0闪烁
}
SPI_Flash_Erase_Chip();
printf("W25X16 Ready!\n");
printf("Enter the DATA to store ... \n\n"); //显示提示信息
while(1)
{
Send_to_PC(); delay_ms(2);
if(flag)
{
flag=!flag; delay_ms(2); //flag置零;
// SPI_Flash_Erase_Chip(); delay_ms(2);
printf("Start Write W25X16....\n"); printf("...%d\n",SIZE);
SPI_Flash_Write((u8*)USART_RX_TX_BUF,add1,SIZE);
add1+=SIZE;
num1=add1/128; num2=add1%128;
// SPI_Flash_Write((u8*)USART_RX_TX_BUF,0,SIZE);//从0字节处开始,写入SIZE长度的数据
printf("W25X16 Write Finished!\n\n");//提示传送完成
delay_ms(10);
printf("Start Read W25X16.... \n");
printf("The Data Readed Is: \n");//提示传送完成
if(0!=num1)
{
for(j=0;j<num1;j++)
{
SPI_Flash_Read(datatemp1,add2,128);//从0地址处开始,读出SIZE个字节
add2+=128; printf("%s",datatemp1);
}
}
if(num2!=0)
{
SPI_Flash_Read(datatemp2,add2,num2);
printf("%s",datatemp2);//显示读到的字符串
}
printf("\n");
}
}
}
看看下图在串口调试的结果,多么奇怪:
我原本写入是128个字符的;也只是想写入一次,怎么会写入两次,而且第一次还是写入28个,这个28不知道怎么来,我今天调试了很久都没有看出来哪里出现问题,
|