迪瓦拉西 2022-07-15 11:35 采纳率: 33.3%
浏览 94
已结题

32单片机串口通信问题

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

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

  • 写回答

4条回答 默认 最新

  • 暴风雨中的白杨 2022-07-16 01:03
    关注

    串口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);
            }
            
        }
        
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 7月24日
  • 已采纳回答 7月16日
  • 赞助了问题酬金5元 7月15日
  • 创建了问题 7月15日

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大