STM32
直播中

陈秀珍

8年用户 993经验值
私信 关注
[问答]

STM32F03串口通信调试程序分享

STM32F03串口通信调试程序分享

回帖(1)

王桂香

2021-12-8 14:04:58

main.c


#include "main.h"






char data[100] ;
//数据缓冲流,用来存储数据


int main()
{
       
  System_Init();
  //系统初始化
       
  SysTick_Init(NULL);
  //必须有否则会出问题
       
  LED_Init();
  //LED灯初始化,用来观察实验现象
       
  USART1_Init();
  //串口1初始化
       
        while(1)
        {
                scanf("%s",data);
                //输入函数,可以输入数据到data数组中
                //这里的本质是计算机向32发送数据
                printf("输入的结果:%s",data);
                //输出函数,将数据打印出来
                //这里的本质是32向计算机发送数据
                USART1_receive();
                //串口1接收函数
                //本质是通过串口1  使32接收数据(这个函数使用有一些问题后面会提到)
        }
       


}


main.h
这里是各种头文件不再解释


#ifndef __MAIN_H_
#define __MAIN_H_


#include "stm32f1xx.h"
#include "stm32_types.h"
#include "stm32_system.h"
#include "delay.h"




//驱动头文件
#include "Systick.h"
#include "led.h"
#include "usart.h"


#endif


usart.h


#ifndef __USART_H_
#define __USART_H_


#include "stm32f1xx.h"
#include "stm32_types.h"
#include "stm32f1xx_hal.h"
#include "delay.h"


#include "stdio.h"
#include "stdlib.h"
#include
//这三个头文件是为了使用printf  scanf  重定义和strlen函数


#define UART_LSR_RDR  (1<<5)    //接收完成标志
#define UART_LSR_THRE (1<<6)    //发送完成标志


#define SEND_BUF1 (USART1->DR)  //串口1发送缓冲区
#define RECV_BUF1 (USART1->DR)  //串口1接收缓冲区
#define USART1_SR (USART1->SR)  //串口1状态




#define SEND_BUF2 (USART2->DR)
#define RECV_BUF2 (USART2->DR)
#define USART2_SR (USART2->SR) //和一同理


void USART1_Init(void);
//串口1初始化
void USART1_receive(void);
//串口1接收数据  本质32接收计算机的信息
void USART1_send(char *data);
//串口1发送数据  本质32向计算机发送信息
#endif


usart.c


#include "usart.h"




UART_HandleTypeDef usart1;
//串口结构体句柄语句
u8 test_rxbuf1[200];
//接收缓冲流数组
u8 rx_index1;
//接收长度
void USART1_Init(void)//串口初始化
{
        GPIO_InitTypeDef GPIO_InitStruct;
        __GPIOA_CLK_ENABLE();      //使能GPIOA时钟
        __USART1_CLK_ENABLE();     //使能USART1时钟
       
        GPIO_InitStruct.Pin = GPIO_PIN_9; //UASRT1对应IO口PA9 TX
        GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;        //复用开漏输出模式
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;  //高速
        GPIO_InitStruct.Pull = GPIO_PULLUP;            //上拉
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);        //初始化PA9,PA10
       
        GPIO_InitStruct.Pin = GPIO_PIN_10; //UASRT1对应IO口PA10  RX
        GPIO_InitStruct.Mode = GPIO_MODE_AF_INPUT;   //配置为输入
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);        //初始化PA10  RX
       
        usart1.Instance          = USART1;                //串口1
        usart1.Init.BaudRate     = 115200;               //波特率设置
        usart1.Init.WordLength   = UART_WORDLENGTH_8B;    //8位
        usart1.Init.StopBits     = UART_STOPBITS_1;       //1个停止位
        usart1.Init.Parity       = UART_PARITY_NONE;      //无校验
        usart1.Init.HwFlowCtl    = UART_HWCONTROL_NONE;   //无硬件流
        usart1.Init.Mode         = UART_MODE_TX_RX;       //串口发送,接收使能
        usart1.Init.OverSampling = UART_OVERSAMPLING_16;  //16倍过采样  
       
        HAL_UART_Init(&usart1);   //初始化串口


    //__HAL_UART_ENABLE_IT(&usart1, UART_IT_RXNE);   //使能接收中断
       
           //HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);
           //HAL_NVIC_EnableIRQ(USART1_IRQn);
           //后面这三个语句重点说一下,当我们使用scanf重定义的时候这三个需要注释才能使用scanf语句,但是void USART1_IRQHandle(void)因为中断函数被注释所以不能使用。
           //但当我们把注释取消的时候,scanf函数将出现问题。
       
}




void USART1_IRQHandler(void)
{
        unsigned long temp;
       
        temp = USART1_SR;
       
        if(temp&UART_LSR_RDR)
        {
                test_rxbuf1[rx_index1++] = RECV_BUF1;
        }
       
        HAL_UART_IRQHandler(&usart1);
}


void USART1_send(char *data)
{
        uint16_t i,j;
        i = strlen(data);
       
        for(j=0; j         {
                while((USART1_SR&UART_LSR_THRE)==0);
                SEND_BUF1 = data[j];       
        }
       
}
       


void USART1_receive(void)
{
        while(rx_index1)
        {
                uint8_t i;
                printf("usart1串口接收到: ");
                for(i=0;i                 {
                        printf("%c",test_rxbuf1);
                }
                printf("rn");
                rx_index1 = 0;
        }
}






//printf函数重定义
int fputc(int ch, FILE *f)
{           
        while((USART1_SR&UART_LSR_THRE)==0);        //当串口1发送完成且状态为1
        SEND_BUF1 = (u8) ch; //发送数据
       
        return ch;
}


//scanf函数重定义
int fgetc(FILE* f)
{


        while(!(USART1_SR&UART_LSR_RDR));//当不接受且状态为1的时候
        return RECV_BUF1;//返回数据
}
举报

更多回帖

×
20
完善资料,
赚取积分