| 由上位机(PC)通过串口调试助手发送数据,下位机接收到数据后,将接收到的数据发送到上位机,在串口调试助手中显示出来,程序运行不成功,查不到原因??? <p>/*******************************************************************************
* 文件名称    : 19.3.1 中断法USART接收(库函数版本V3.5.0)
* 文件描述    : 由上位机(PC)通过串口调试助手发送数据,下位机接收到数据后,将接收到的数据发送到上位机,在串口调试助手中显示出来
* 编写人      : 蒋厚兵
* 课程            :  
* 教材        :                    
*******************************************************************************/
#include"stm32f10x.h"
#include<stdio.h>
#include "rcc.h"
#include "NVIC.h"
#include"usart.h"
 
int main()
{
        /******************1.初始化*************************************************/
        RCC_PLL3_Configuration();   
        NVIC_Configuration();
        Usart_GPIO();        
        Usart_Init(9600);                   //配置USART1        
        
        GPIO_Write(GPIOA, 0xffff);                           // 
        GPIO_Write(GPIOB, 0xffff);                           //         
        while(1);        
         
} </p><p>
</p><p><div class="blockcode"><blockquote><p>/******************************************************************************************************
串口发送接收
*******************************************************************************************************/
#include"stm32f10x.h"
#include"usart.h"
#include<stdio.h> 
void Usart_GPIO()
{
        GPIO_InitTypeDef GPIO_InitStructure;
        /*        结构体类型                           变量*/        
        //开启相应的外设时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE );                //使能APB2外设的GPIOA和复用功能的时钟        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);                 //使能APB2外设的USART1的时钟                   
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);                //关闭调试端口
        USART_DeInit(USART1);  //复位串口1
        //设置引脚
        //USART1_TX发射引脚   PA.9
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
        GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9        
        //USART1_RX        接受引脚  PA.10
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10                
}
void Usart_Init(u32 BaudRate)
{
        USART_InitTypeDef        USART_InitStructure;        
        //结构体                        变量(共10个成员)
        NVIC_InitTypeDef NVIC_InitStructure;
//        USART_ClockInitTypeDef USART_ClockInitStruct;
        //配置Usart        
        USART_InitStructure.USART_BaudRate = BaudRate;                                   //波特率
        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_Tx | USART_Mode_Rx;                          //发送使能,接收使能
        USART_Init(USART1, &USART_InitStructure);                // 初始化USART串口
//         USART_ClockInitStruct.USART_Clock=USART_Clock_Disable;      //??????
//         USART_ClockInitStruct.USART_CPOL=USART_CPOL_Low;        //???????
//         USART_ClockInitStruct.USART_CPHA=USART_CPHA_2Edge;    //??CPHA?????2?????????
//         USART_ClockInitStruct.USART_LastBit=USART_LastBit_Disable;  // ??????,??????????????SCLK??
//         USART_ClockInit(USART1, &USART_ClockInitStruct);      //??USART????????                
        //Usart1 NVIC 配置
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器        
        USART_ClearFlag(USART1,USART_IT_RXNE);
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断
        USART_Cmd(USART1, ENABLE);                //UE位使能,打开USART1外设
}
/*******************************************************************************
* Function Name  : fputc
* Description    : 重定向这个C库(stdio)printf函数  文件流——》串口USART1
* Input          : ch,*f
* Output         : None
* Return         : None
*******************************************************************************/ 
int fputc(int ch,FILE *f)
{
        
        //等待发送完毕
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET) ;
        //ch送给USART1
        USART_SendData(USART1, ch);        //
        
        //返回ch
        return(ch);
}
//串口1中断服务程序
void USART1_IRQHandler(void)                        
{
        u8 Res;
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断 
        {                                                                                                                        
                Res =USART_ReceiveData(USART1);//(USART1->DR);        //读取接收到的数据
                USART_SendData(USART1, Res);          //将接收到的数据发送出去                
        }                      
}
</p><p>
</p><p><div class="blockcode"><blockquote>#ifndef __USART_H
#define __USART_H                            
#include "stm32f10x.h"
#include<stdio.h>
void Usart_GPIO(void);
void Usart_Init(u32 BaudRate);
extern int fputc(int ch,FILE *f);
#endif
 
 
 
 
 
 |