stm32f103c8t6串口通信(寄存器版)

本文使用串口1通信,实现了数据的收发。

主函数:

//串口发送/接收数据
#include "stm32f10x.h"
#include "yanshi.h"
#include "USART.h"    

int main()
{   
    usart1_init();
    
//    unsigned char wenben[] = {0x1, 0x43, 0x22, 0x65};
    
//    usart1_init(72,9600);     //串口初始化为9600
//    USART1_Send_zifuchuan("123Hello你好!\r\n");
//    USART1_Send(0xf1);  //发送一个字节hex
//    
//    USART1_Send('A');   //发送对应的十六进制,或者文本模式下的a
    
//    USART1_Send_shuzu(wenben, 4);  //发送数组
//    
//    USART1_Send_zifuchuan("123Hello!\r\n");//\r\n转移字符来换行的 文本模式下的字符串
//    
//    USART1_Send_zifuchuan("你好,世界!\r\n");//\r\n转移字符来换行的 文本模式下的字符串
    USART1_Send_zifuchuan("123Hello你好!\r\n");//\r\n转移字符来换行的 文本模式下的字符串
    while(1)
    {
    
//        yanshi_ms (500);
        //printf("1234wed你好,大学生\r\n");
    }
}

头文件:

#ifndef __USART_H
#define __USART_H

#include "stm32f10x.h" 

void usart1_init(void);
void USART1_Send(char ch);      //发送字节
char USART1_Receive(void);    //接收字节     
void USART1_Send_shuzu(u8 *shuzu, u16 changdu); //发送数组
void USART1_Send_zifuchuan(char *zifuchuan); //发送字符串


//void usart1_init(void);
void usart1_init(unsigned int pl,unsigned int btl);//时钟频率 和波特率
//void USART1_Send(char ch);    //发送字节
//char USART1_Receive(void);    //接收字节
//                                                       
//void USART1_Send_shuzu(u8 *shuzu, u16 changdu); //发送数组
//void USART1_Send_zifuchuan(char *zifuchuan); //发送字符串

uint32_t Send_pow(uint32_t x, uint32_t y);
void USART1_Send_shuzi(uint32_t *shuzi, uint8_t changdu);
//int fputc(int ch, FILE *f);         //printf重定向

#endif

串口部分的代码:

#include "stm32f10x.h"
#include "USART.h"
#include "stdio.h"

void usart1_init(void)
{    
    RCC -> APB2RSTR |= 1 << 14;                    //复位usart1
    RCC->APB2RSTR &= ~(1 << 14);                   //停止复位
    
    RCC->APB2ENR |= 1 << 2 | 1 << 14;           //使能 GPIOA,usart1
    GPIOA->CRH &= 0XFFFFF00F;                   //清零
    GPIOA->CRH |= 0X000004B0;                     //tx pa9 复用推挽输出,rx pa10 浮空输入
    
    USART1->CR1 = 0x202c;
    
    //USART1->BRR = 0X27a;                  //设置波特率为115200
    
    USART1->BRR = 0X1D4C;                    //设置波特率为9600
    
    SCB -> AIRCR |= 0x06 << 8;
    NVIC ->IP[37] |= 1 << 7 | 1 << 4;            //设置抢占1,响应1
    NVIC -> ISER[1] |= 1 << 5;                     //中断使能寄存器开启usart1的使能    
}

void USART1_Send(char date)                       //发送
{
    while((USART1->SR & 0X80) == 0);       //TXE= 0等待发送数据缓冲寄存器为空, 1 & 1得1 取反 0  为假,出循环 有0得0
    USART1 -> DR = date;                          //将待发送字符写入数据寄存器
}

char USART1_Receive(void)                         //接收
{
    char ch = '\0';                               //检查是否接收数据   0x20 10 0000  rxne 读数据寄存器非空 为0 没数据了
    while((USART1->SR & 0X20) == 0);         //等待接收数据缓冲寄存器非空  1 & 1得1 取反 0  为假,出循环 有0得0// while (!(USART1 -> SR & USART_SR_RXNE));
    ch = (char)USART1 -> DR;                      //从数据寄存器中读取接收到的字符
    return ch;
}

void USART1_Send_shuzu(uint8_t *shuzu, uint16_t changdu)  //发送一个 数组,需要判断长度
{
    uint16_t i;
    for(i = 0; i < changdu; i ++)
    {
        USART1_Send(shuzu[i]);
    }    
}

void USART1_Send_zifuchuan(char *zifuchuan)      //发送字符串,自带结束标志位,不需要判断长度
{
    uint16_t i;
    for(i = 0; zifuchuan[i] != 0; i ++)
    {
        USART1_Send(zifuchuan[i]);
    }    
}

void USART1_IRQHandler()                   //串口中断标志  中断现象:将接收到得数据再发送给电脑
{
    if (USART1 -> SR & (1 << 5))            //如果读数据寄存器接收到了数据 进入循环
  {
    char data = USART1_Receive();               //数据来自串口接收端
    USART1->SR &= ~(1 << 5);                   //清除接收非空标志位
    USART1_Send(data);                          //进入中断,将数据再发送给电脑来验证 
  }
}

也算是一种 记录吧,加油!
 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小斌bin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值