32单片机串口通信问题

本人做这个编写不出来,希望有朋友帮助啦

配置串口1波特率为115200,pc14为推挽输出。
上电后pc14为高电平,串口每2秒输出一次0x00;
当单片机收到0x01时,串口每2秒输出一次0x01并将pc14设置为低电平;
当单片机收到0x00时,串口每2秒输出一次0x00并将pc14设置为高电平。

串口1

#include "stm32f10x.h"
#include "stm32f10x_usart.h"
/******************************* Usart1 *************************/
// USART1初始化
// PA 9  tx
// PA10  rx
void Usart1_Init(u32 baurdrate)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    /* 使能 USART1 时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); 

    /* USART1 使用IO端口配置 */    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);    
  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;    //浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);   //初始化GPIOA
      
    /* USART1 工作模式配置 */
    USART_InitStructure.USART_BaudRate = baurdrate;    //波特率设置
    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;//接收与发送都使能
    USART_Init(USART1, &USART_InitStructure);  //初始化USART1
    USART_Cmd(USART1, ENABLE);// USART1使能
}

 /*发送一个字节数据*/
 void Uart1SendByte(unsigned char SendData)
{       
    USART_SendData(USART1,SendData);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);        
}  


/*接收一个字节数据*/
unsigned char UART1GetByte(unsigned char* GetData)
{          
    if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
    {  
        return 0;//没有收到数据 
    }
    *GetData = USART_ReceiveData(USART1); 
    return 1;//收到数据
}

定时器3

#include "stm32f10x.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_it.h"

// 使用定时器3定时
// 系统时钟 72M :  psc : 7199   pre: 2000 0
// 系统时钟 84M :  psc : 8399   pre: 2000 0
//Tout = (pre) * (psc+1)/Tclk; //psc会自动加1  
 void TIM3_init(u16 pre,u16 psc){ //定时器是16位的
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定义定时器变量
    NVIC_InitTypeDef NVIC_InitStructure;//NVIC中断优先级配置
         
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能定时器时钟
    //初始化定时器参数:自动重装载值,分频系数,计数方式等
    TIM_TimeBaseInitStructure.TIM_Period=pre ;//自动重载值
    TIM_TimeBaseInitStructure.TIM_Prescaler = psc ;//预分频系数  
    TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //采样设置 ,1分频即不分频
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数模式
         
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//定时器初始化函数
         
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//定时器中断类型选择,使能(更新中断)
         
    //NVIC的配置
    //要配置中断分组(main中)
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
     
         
    //防止定时器状态在计数时已经置位   //清空状态
    TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除中断标志位
    //开启定时器
    TIM_Cmd(TIM3,ENABLE);
}

//定时器3 中断服务函数
void TIM3_IRQHandler(void){
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)){  //这个函数会先判断是否发送中断,然后再获取中断标志
         if( data == 0x00 ){
             Uart1SendByte(0x00);
         }else if(data == 0x01){
             Uart1SendByte(0x01);
         }
    }
    //清除中断标志(调用函数,或者读取相应寄存器中的值,标志会自动清除)
    TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}

pc14

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
void PC14Init(void){
    GPIO_InitTypeDef GPIO_InitStructure;
  
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE);                                   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}

主函数

u8 data = 0;

int main(void){
    
    PC14Init();
    TIM3_init(20000,7199);
    Usart1_Init(115200);
    
    while(1){
        UART1GetByte(&data);
        if( data == 0x00 ){
            GPIO_WriteBit(GPIOC,GPIO_Pin_14,Bit_SET);
        }else if(data == 0x01){
            GPIO_WriteBit(GPIOC,GPIO_Pin_14,Bit_RESET);
        }
        
    }
    
}

串口初始化,然后做判断,执行发送数据

有人编了吗,没人我编

要多多参考st官方的例程,这种基本的都会有的,耐心去学习学习,不难的,加油!还省点钱,哈哈