|
主函数如下:
#include "stm32f10x_lib.h"
#include "stdio.h"
char TxBuffer1[];
char RxBuffer1[];
volatile int TxCounter1;
volatile int RxCounter1;
int rec_f,tx_flag;
int Rec_Len;
char TxBuffer5[];
void RCC_Configuration()
{
ErrorStatus HSEStartUpStatus; //¶¨ÒåÍⲿ¸ßËÙ¾§ÕñÆô¶¯×´Ì¬Ã¶¾Ù±äÁ¿
RCC_DeInit(); //¸´Î»RCCÍⲿ¼Ä´æÆ÷µ½Ä¬ÈÏÖµ
RCC_HSEConfig(RCC_HSE_ON); //´ò¿ªÍⲿ¸ßËÙ¾§Õñ
HSEStartUpStatus=RCC_WaitForHSEStartUp(); //µÈ´ýÍⲿ¸ßËÙʱÖÓ×¼±¸ºÃ
if(HSEStartUpStatus==SUCCESS){ //Íⲿ¸ßËÙʱÖÓÒѾ׼±¸ºÃ
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //¿ªÆôFLASHÔ¤¶Á»º³å¹¦ÄÜ£¬¼ÓËÙFLASHµÄ¶ÁÈ¡¡£ËùÓгÌÐòÖбØÐëµÄÓ÷¨£¬Î»ÖãºRCC³õʼ»¯×Óº¯ÊýÀïÃ棬ʱÖÓÆðÕñÖ®ºó
FLASH_SetLatency(FLASH_Latency_2); //FLASHʱÐòÑÓ³Ù¼¸¸öÖÜÆÚ£¬µÈ´ý×ÜÏßͬ²½²Ù×÷¡£ÍƼö°´ÕÕµ¥Æ¬»úϵͳÔËÐÐƵÂÊ£¬0¡ª24MHzʱ£¬È¡Latency=0£»24¡ª48MHzʱ£¬È¡Latency=1£»48~72MHzʱ£¬È¡Latency=2¡£
RCC_HCLKConfig(RCC_SYSCLK_Div1); //ÅäÖÃAHB(HCLK)==ϵͳʱÖÓ/1
RCC_PCLK2Config(RCC_HCLK_Div1); //ÅäÖÃAPB2(¸ßËÙ)(PCLK2)==ϵͳʱÖÓ/1
RCC_PCLK1Config(RCC_HCLK_Div2); //ÅäÖÃAPB1(µÍËÙ)(PCLK1)==ϵͳʱÖÓ/2
//×¢£ºAHBÖ÷Òª¸ºÔðÍⲿ´æ´¢Æ÷ʱÖÓ¡£APB2¸ºÔðAD£¬I/O£¬¸ß¼¶TIM£¬´®¿Ú1¡£APB1¸ºÔðDA£¬USB£¬SPI£¬I2C£¬CAN£¬´®¿Ú2345£¬ÆÕͨTIM¡£
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //ÅäÖÃPLLʱÖÓ==(Íⲿ¸ßËÙ¾§ÌåʱÖÓ/1£©* 9 ==72MHz
RCC_PLLCmd(ENABLE); //ʹÄÜPLLʱÖÓ
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); //µÈ´ýPLLʱÖÓ¾ÍÐ÷
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //ÅäÖÃϵͳʱÖÓ==PLLʱÖÓ
while(RCC_GetSYSCLKSource()!=0x08); //µÈ´ýϵͳʱÖÓÔ´µÄÆô¶¯
}
//------------------------ÒÔÏÂΪ¿ªÆôÍâÉèʱÖӵIJÙ×÷-----------------------//
// RCC_AHBPeriphClockCmd (ABP2É豸1 | ABP2É豸2 , ENABLE); //Æô¶¯AHBÉ豸
// RCC_APB2PeriphClockCmd(ABP2É豸1 | ABP2É豸2 , ENABLE); //Æô¶¯ABP2É豸
// RCC_APB1PeriphClockCmd(ABP2É豸1 | ABP2É豸2 , ENABLE); //Æô¶¯ABP1É豸
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1 , ENABLE); //´ò¿ªAPB2ÍâÉè
}
void NVIC_Configuration( )
{
NVIC_InitTypeDef NVIC_InitStructure; //¶¨ÒåÒ»¸öÖжϽṹÌå
// NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //ÉèÖÃÖжÏÏòÁ¿±íµÄÆðʼµØַΪ0x08000000
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //ÉèÖÃNVICÓÅÏȼ¶·Ö×飬·½Ê½¡£
//×¢£ºÒ»¹²16¸öÓÅÏȼ¶£¬·ÖΪÇÀռʽºÍÏìӦʽ¡£Á½ÖÖÓÅÏȼ¶ËùÕ¼µÄÊýÁ¿ÓÉ´Ë´úÂëÈ·¶¨£¬NVIC_PriorityGroup_x¿ÉÒÔÊÇ0¡¢1¡¢2¡¢3¡¢4£¬
//·Ö±ð´ú±íÇÀÕ¼ÓÅÏȼ¶ÓÐ1¡¢2¡¢4¡¢8¡¢16¸öºÍÏìÓ¦ÓÅÏȼ¶ÓÐ16¡¢8¡¢4¡¢2¡¢1¸ö¡£¹æ¶¨Á½ÖÖÓÅÏȼ¶µÄÊýÁ¿ºó£¬ËùÓеÄÖжϼ¶±ð±ØÐëÔÚÆäÖÐÑ¡Ôñ£¬
//ÇÀÕ¼¼¶±ð¸ßµÄ»á´ò¶ÏÆäËûÖжÏÓÅÏÈÖ´ÐУ¬¶øÏìÓ¦¼¶±ð¸ßµÄ»áÔÚÆäËûÖжÏÖ´ÐÐÍêÓÅÏÈÖ´ÐС£
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel; //ͨµÀÉèÖÃΪ´®¿Ú1ÖжÏ
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //ÖжÏÏìÓ¦ÓÅÏȼ¶0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //´ò¿ªÖжÏ
NVIC_Init(&NVIC_InitStructure); //³õʼ»¯
}
/****************************************
* º¯ÊýÃû³Æ £ºGPIO_Configuration()
* ¹¦ÄÜÃèÊö £º GPIOÅäÖÃ
* ²ÎÊý £º ÎÞ
* ·µ»ØÖµ £º ÎÞ
* È«¾Ö±äÁ¿ £º ÎÞ
* È«¾Ö¾²Ì¬±äÁ¿£º ÎÞ
* ¾Ö²¿¾²Ì¬±äÁ¿£º ÎÞ
****************************************/
void GPIO_Configuration()
{
GPIO_InitTypeDef GPIO_InitStructure; //¶¨ÒåGPIO³õʼ»¯½á¹¹Ìå
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_8; //LED,ָʾµÆ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//--------½«USART1 µÄTX ÅäÖÃΪ¸´ÓÃÍÆÍìÊä³ö AF_PP---------------------//
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; //¹Ü½ÅλÖö¨Ò壬±êºÅ¿ÉÒÔÊÇNONE¡¢ALL¡¢0ÖÁ15¡£
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz; //Êä³öËÙ¶È2MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //ÍÆÍìÊä³öģʽ Out_PP
GPIO_Init(GPIOA,&GPIO_InitStructure); //E×éGPIO³õʼ»¯
//--------½«USART1 µÄRX ÅäÖÃΪ¸´Óø¡¿ÕÊäÈë IN_FLOATING---------------------//
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; //¹Ü½ÅλÖö¨Òå
//ÊäÈëģʽÏÂÅäÖÃÊä³öËÙ¶ÈÎÞÒâÒå
//GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz; //Êä³öËÙ¶È2MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //¸¡¿ÕÊäÈë IN_FLOATING
GPIO_Init(GPIOA,&GPIO_InitStructure); //C×éGPIO³õʼ»¯
}
/****************************************************
* º¯ÊýÃû³Æ £ºUSART1_Configuration( )
* ¹¦ÄÜÃèÊö £º ÅäÖÃUSART1Êý¾Ý¸ñʽ¡¢²¨ÌØÂʵȲÎÊý
* ²ÎÊý £º ÎÞ
* ·µ»ØÖµ £º ÎÞ
* È«¾Ö±äÁ¿ £º ÎÞ
* È«¾Ö¾²Ì¬±äÁ¿£º ÎÞ
* ¾Ö²¿¾²Ì¬±äÁ¿£º ÎÞ
*******************************************************/
void USART1_Configuration( )
{
USART_InitTypeDef USART_InitStructure; //´®¿ÚÉèÖûָ´Ä¬ÈϲÎÊý
USART_InitStructure.USART_BaudRate = 115200; //²¨ÌØÂÊ115200
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //×Ö³¤8λ
USART_InitStructure.USART_StopBits = USART_StopBits_1; //1λֹͣ×Ö½Ú
USART_InitStructure.USART_Parity = USART_Parity_No; //ÎÞÆæżУÑé
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //ÎÞÁ÷¿ØÖÆ
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //´ò¿ªRx½ÓÊÕºÍTx·¢Ë͹¦ÄÜ
USART_Init(USART1, &USART_InitStructure); //³õʼ»¯
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // Èô½ÓÊÕÊý¾Ý¼Ä´æÆ÷Âú£¬Ôò²úÉúÖжÏ
USART_Cmd(USART1, ENABLE); //Æô¶¯´®¿Ú
//-----ÈçÏÂÓï¾ä½â¾öµÚ1¸ö×Ö½ÚÎÞ·¨ÕýÈ··¢ËͳöÈ¥µÄÎÊÌâ-----//
USART_ClearFlag(USART1, USART_FLAG_TC); // Çå±êÖ¾
}
void USART_OUT(USART_TypeDef* USARTx, char *Data, int Len){
int i;
for(i=0; i<Len; i++){
USART_SendData(USARTx, Data[i]);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET); //ÅжÏÊÇ·ñ·¢ËÍÍê³É¡£
}
}
int main(void)
{
char a = 0;int j;
RCC_Configuration();
GPIO_Configuration();
NVIC_Configuration( );
USART1_Configuration();
printf("\r\n¸ÐлÄúʹÓÃSTM32·Ü¶·°å£¡^_^ \r\n");
printf("\r\n Please Input Character From Keyboard \r\n");
while(1)
{
if(rec_f==1){ //ÅжÏÊÇ·ñÊÕµ½Ò»Ö¡ÓÐЧÊý¾Ý
rec_f=0;
USART_OUT(USART1,TxBuffer1,Rec_Len);
}
if(a==0) {GPIO_SetBits(GPIOC, GPIO_Pin_6); a=1;} //LED1 V6 Ã÷°µÉÁ˸
else {GPIO_ResetBits(GPIOC, GPIO_Pin_6);a=0; }
}
}
int fputc(int ch, FILE *f)
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART */
USART_SendData(USART1, (u8) ch);
/* Loop until the end of transmission */
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{
}
return ch;
}
中断函数如下:
#include "stm32f10x_it.h"
#include "stm32f10x_usart.h"
#include "stdio.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
extern char TxBuffer1[];
extern char TxBuffer5[],RxBuffer1[];
extern int TxCounter1;
extern int RxCounter1;
extern int rec_f,tx_flag;
extern int Rec_Len;
void USART1_IRQHandler(void)
{
char i,j;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //Èô½ÓÊÕÊý¾Ý¼Ä´æÆ÷Âú
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1);
printf("%d ",RxCounter1);
if(RxCounter1 == 10) //ÅжϽáÊø±êÖ¾ÊÇ·ñÊÇ0x0d 0x0a
{
for(i=0; i< RxCounter1; i++){ //½«½ÓÊÕ»º³åÆ÷µÄÊý¾Ýתµ½·¢ËÍ»º³åÇø£¬×¼±¸×ª·¢
TxBuffer1[i] = RxBuffer1[i];
}
rec_f=1; //½ÓÊճɹ¦±êÖ¾
Rec_Len=RxCounter1;
RxCounter1=0;
}
}
}
问题描述:原本想是让接收到的最后一个数据时W时,就向PC机发送数组里存储的数据,可是怎么也实现不了,后来就改为接收10个数据就发送,可是也实现不了。只有当小于8才可以正确发送,而且我把RxCounter1的值打印出来:打印结果如下:1 2 3 4 5 6 7 113 114 115 116 117 118 119 120 121……
从7后RxCounter1的值就不正常了!
就是哪儿的问题我找了好久,搞的头都打了,我是个学STM32的新手,请高手指点指点啊!