STM32F103C8T6串口通信,亲测可运行,一路串口

连线信息:PA9-RX,PA10-TX,3v3-3v3,GND-GND

以下是代码:usart.h

#ifndef __USART_H
#define __USART_H
#include "stdio.h"    

#define USART1_REC_LEN              200      //定义最大接收字节数 200
#define EN_USART1_RX             1            //使能(1)/禁止(0)串口1接收     
extern u8  USART1_RX_BUF[USART1_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 
extern u16 USART1_RX_STA;                     //接收状态标记    
void uart1_init(u32 bound);

#endif

ustart.c

#include "stm32f10x.h"                  // Device header  
#include <stdio.h>
#include "usart.h"      
 
//如果使用ucos,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_OS
#include "includes.h"                    //ucos 使用      
#endif

#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 

    int handle; 

}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
int _sys_exit(int x)

    x = x; 
    // 添加一个默认的返回语句  
  return 0;  

//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
    while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
    return ch;
}
#endif 

 
 
#if EN_USART1_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误       
u8 USART1_RX_BUF[USART1_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15,    接收完成标志
//bit14,    接收到0x0d
//bit13~0,    接收到的有效字节数目
u16 USART1_RX_STA=0;       //接收状态标记      
  
void uart1_init(u32 bound){
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
     
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);    //使能USART1,GPIOA时钟
  
    //USART1_TX   GPIOA.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);//初始化GPIOA.9
   
    //USART1_RX      GPIOA.10初始化
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

    //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 初始化设置

    USART_InitStructure.USART_BaudRate = bound;//串口波特率
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    USART_InitStructure.USART_StopBits = USART_StopBits_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); //初始化串口1
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
    USART_Cmd(USART1, ENABLE);                    //使能串口1 

}

void USART1_IRQHandler(void)                    //串口1中断服务程序
{
    u8 Res;
#if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
    OSIntEnter();    
#endif
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
    {
        Res =USART_ReceiveData(USART1);    //读取接收到的数据        
        if((USART1_RX_STA&0x8000)==0)//接收未完成
        {
            if(USART1_RX_STA&0x4000)//接收到了0x0d
            {
                if(Res!=0x0a)USART1_RX_STA=0;//接收错误,重新开始
                else USART1_RX_STA|=0x8000;    //接收完成了 
            }
            else //还没收到0X0D
            {    
                if(Res==0x0d)USART1_RX_STA|=0x4000;
                else
                    {
                    USART1_RX_BUF[USART1_RX_STA&0X3FFF]=Res ;
                    USART1_RX_STA++;
                    if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;//接收数据错误,重新开始接收      
                    }         
                }
            }            
     } 
#if SYSTEM_SUPPORT_OS     //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
    OSIntExit();                                               
#endif

#endif    

 main.c

/*
本程序用于实现stm32f103c8t6串口通信
串口:
        RX PA10
        TX PA9
运行现象:
    串口接到串口助手时,电脑端发送信息给单片机,单片
机收到后会返回:串口1:我接收到了串口数据:***  其中,
***表示单片机收到的信息。
作者:ZX
时间:2022年9月19日
*/
#include "stm32f10x.h"                             // Device header
#include "usart.h"
#include <stdio.h>
int main()
{
//    u8 i = 0;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
    uart1_init(9600);                                     //串口初始化波特率为9600
 while(1)
    {    
        if(USART1_RX_STA&0x8000)
        {
            printf("串口1:我接收到了串口数据:%s\r\n",USART1_RX_BUF);
            USART1_RX_STA = 0;
        }   
    }
}

最后感谢ZX大神分享代码,以下为链接: 【STM32】STM32F103C8T6串口通信,实现3个串口收发数据-CSDN博客

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32F103C8T6是意法半导体(STMicroelectronics)推出的一款高性能微控制器。它具有强大的处理能力和丰富的外设,其中包括UART(通用异步收发器)模块。下面是一个使用STM32F103C8T6的UART例程的简单介绍。 UART是一种通用的串行通信接口,可用于将数据从一个设备传输到另一个设备。UART通过发送和接收数据帧的方式进行通信。在STM32F103C8T6上,UART模块可以通过配置寄存器来设置波特率、数据位数、停止位数和校验位等参数。 为了使用UART模块,首先需要在STM32F103C8T6的开发环境中包含相应的头文件。然后,可以通过初始化相关寄存器来配置UART模块的参数。例如,可以使用 USART_InitTypeDef 结构体来设置波特率、数据位数和停止位数等参数。接下来,可以使用 USART_Cmd() 函数来使能UART模块。 一旦UART模块配置完成,就可以通过发送和接收函数来实现数据的收发。发送函数可以使用 USART_SendData() 函数将数据发送到UART模块的发送缓冲区中,然后UART模块根据设置的波特率将数据发送到外部设备。接收函数可以使用 USART_ReceiveData() 函数从UART模块的接收缓冲区中读取接收到的数据。 在使用UART例程时,需要注意配置正确的引脚复用功能以及使能对应的GPIO时钟。此外,还需注意设置正确的中断优先级、中断使能以及中断处理函数等。 通过以上步骤,可以在STM32F103C8T6上实现基本的UART通信。使用UART模块可以方便地与其他设备进行数据传输,例如与传感器、无线模块等进行通讯。 总结来说,STM32F103C8T6的UART例程主要包括配置UART模块的参数、发送和接收数据的函数以及相应的引脚配置。通过掌握这些内容,可以实现简单且可靠的串行通信。不同的应用场景可能需要根据具体需求进行一些定制和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值