stm32之11.USART串口通信

news/2024/6/3 16:57:05 标签: stm32, 嵌入式硬件, 单片机

可以添加上拉电阻,但会增加功耗,传输距离变长

  要添加库函数USART

 官方参考文档说明书位置

 ALT+左键可实现整体删除(如下图)

 输出模式第三种模式AF

----------------------

源码 

 远程控制pc端

#include <stm32f4xx.h>
#include "led.h"
#include "key.h"

#include "stdio.h"
    

//#define BIT_BAND(addr,bitnum)((addr&0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))

#define PFout(n) (*(volatile uint32_t *)(0x42000000+(GPIOF_BASE+0x14-0x40000000)*32+(n)*4))
#define PAin(n) (*(volatile uint32_t *)(0x42000000+(GPIOA_BASE+0x10-0x40000000)*32+(n)*4))
#define PEout(n) (*(volatile uint32_t *)(0x42000000+(GPIOE_BASE+0x14-0x40000000)*32+(n)*4))
#define PEin(n) (*(volatile uint32_t *)(0x42000000+(GPIOE_BASE+0x10-0x40000000)*32+(n)*4))
    
static     GPIO_InitTypeDef GPIO_InitStructure;
static     USART_InitTypeDef USART_InitStructure;
static     NVIC_InitTypeDef NVIC_InitStructure;

void usart1_init(uint32_t baud)
{

    //端口A硬件时钟打开
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    
    //串口1硬件时钟打开
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    
    //配置PA9 PA10为AF模式(复用功能)
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9 | GPIO_Pin_10 ;     //9 10号引脚
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;//输出模式第三种模式AF模式
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;//高速,速度越高,响应越快,但是功耗会更高
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;//不使能上下拉电阻
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    //由于引脚支持很多功能,需要指定该引脚的功能,当前要制定支持USART1
    
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
    
    //配置USART1相关参数:波特率,数据位,停止位,校验位
    
    USART_InitStructure.USART_BaudRate = baud;   //波特率,就是通信的速度
    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);
    
    //配置中断触发方式,接收到一个字节,就通知CPU处理
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    
    //NVIC配置其优先级
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  //中断号
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   //抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;      //响应优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    //打开通道给NVIC管理
    NVIC_Init(&NVIC_InitStructure);
    
    //使能USART1工作
    USART_Cmd(USART1, ENABLE);
    
    
    
}
//发送数据
void usart1_send_str(const char *str)
{

     const char * p = str;
    while(*p!='\0')
    {
        //发送一个字节
        USART_SendData(USART1,*p);
        p++;
        //等待发送完毕
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
    }
}

int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
        //抢占优先级0~3,支持4级!
    //响应优先级0~3,支持4级!
    key_init();
    Led_init();
    //初始化串口1波特率位115200bps,若发送/接收数据有乱码,请检查PLL
    
    usart1_init(115200);
    usart1_send_str("hello5555\r\n");
    while(1){

    
        }
    
}

void USART1_IRQHandler(void)
{
    static uint8_t d;
    if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)
    {
        d=USART_ReceiveData(USART1);
        
        
        if(d == 'A')PFout(9)=0;
        if(d == 'a')PFout(9)=1;    
        
        //告诉CPU,已经完成接收中断请求,可以响应新的接收中断请求
        USART_ClearITPendingBit(USART1,USART_IT_RXNE);
    
    }

}


http://www.niftyadmin.cn/n/4963364.html

相关文章

Vivado中的FFT IP核使用(含代码)

本文介绍了Vidado中FFT IP核的使用&#xff0c;具体内容为&#xff1a;调用IP核>>配置界面介绍>>IP核端口介绍>>MATLAB生成测试数据>>测试verilogHDL>>TestBench仿真>>结果验证>>FFT运算。 1、调用IP核 该IP核对应手册pg109_xfft.pd…

从零学算法160

**160.**给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 示例 1&#xff1a; 输入&#xff1a;intersectVal 8, listA [4,1,8,4,5], listB [5,6,1,8,4,5], skipA 2, ski…

Scala反射调用object

和反射class不同&#xff0c;反射class和java反射一样&#xff0c;object是静态代码块模式的单例&#xff0c;Scala 反射的核心是 scala.reflect.runtime.universe&#xff1a;代码如下&#xff1a; object&#xff1a; object TargetObject{def test1(name:String):String…

企业数字化转型中,VR数字展厅能有哪些体验?

在数字化转型的浪潮下&#xff0c;企业纷纷开始注重数字展厅的开展&#xff0c;VR虚拟展厅结合VR全景技术&#xff0c;可以创造出许多有趣的玩法和体验&#xff0c;无论是虚拟参观、互动体验还是VR云会议对接&#xff0c;都为企业客户带来了全新的感知方式。 同传统展厅相比&am…

flink cdc初始全量速度很慢原因和优化点

link cdc初始全量速度很慢的原因之一是&#xff0c;它需要先读取所有的数据&#xff0c;然后再写入到目标端&#xff0c;这样可以保证数据的一致性和顺序。但是这样也会导致数据的延迟和资源的浪费。flink cdc初始全量速度很慢的原因之二是&#xff0c;它使用了Debezium作为捕获…

Mongodb两种启动方法

一、命令行启动 1.修改存放数据库的位置 说明&#xff1a;E:\data\mongodb&#xff1b;我在E盘创建的文件夹mongodb mongod --dbpathE:\data\mongodb 2.成功启动 说明&#xff1a;默认端口27017&#xff0c;代表已经启动成功 &#xff0c;并在mongodb自动创建文件 二、配置项…

Linux共享库基础及实例

共享库是将库函数打包成一个可执行文件&#xff0c;使得其在运行时可以被多个进程共享。 目标库 回顾下构建程序的一种方式&#xff1a; 将每个源文件编译成目标文件&#xff0c;再通过链接器将这些目标文件链接组成一个可执行程序。 gcc -g -c prog.c mod1.c mod2.c gcc -g …

【C++练习】普通方法+利用this 设置一个矩形类(Rectangle), 包含私有成员长(length)、 宽(width), 定义一下成员函数

题目 设置一个矩形类(Rectangle), 包含私有成员长(length)、 宽(width), 定义成员函数: void set_ len(int l); //设置长度 设置宽度void set_ wid(int w); 获取长度: int get len(); 获取宽度: int get _wid); 显示周长和面积: v…