【STM32F103ZET6——库函数】4.串口通讯

devtools/2025/3/4 13:48:38/

目录

配置串口引脚

引脚图

中断优先级分组

使能时钟

配置中断优先级

配置串口

重写中断服务函数

清空中断标志位

获取中断标志位

接收函数

打印数据

例程

例程说明

main.h

main.c

usart.h

usart.c

配置串口引脚

引脚图

  1. 配置引脚号

  2. 配置引脚速度

  3. 配置引脚的模式

  4. 引脚初始化  

GPIO_InitTypeDef GPIO;//USART1_TX   GPIOA.9
GPIO.GPIO_Pin = GPIO_Pin_9; //PA9
GPIO.GPIO_Speed = GPIO_Speed_50MHz;
GPIO.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
GPIO_Init(GPIOA, &GPIO);//初始化GPIOA9//USART1_RX	  GPIOA.10初始化
GPIO.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO);//初始化GPIOA.10

中断优先级分组

/*
zu_bie:NVIC_PriorityGroup_0NVIC_PriorityGroup_1NVIC_PriorityGroup_2NVIC_PriorityGroup_3NVIC_PriorityGroup_4
*/
void NVIC_PriorityGroupConfig(zu_bie);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组

使能时钟

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟

配置中断优先级

  1. 配置中断的串口

  2. 配置抢占优先级

  3. 配置子优先级

  4. 通道使能

  5. 接收中断使能

void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);//接收中断使能NVIC_InitTypeDef ZhongDuan;
//Usart1 NVIC 配置
ZhongDuan.NVIC_IRQChannel = USART1_IRQn;
ZhongDuan.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级1
ZhongDuan.NVIC_IRQChannelSubPriority = 1;		//子优先级1
ZhongDuan.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
NVIC_Init(&ZhongDuan);	//根据指定的参数初始化VIC寄存器
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//接收中断使能

配置串口

  1. 配置波特率

  2. 配置数据模式

  3. 配置停止位

  4. 配置奇偶校验位

  5. 配置硬件流传输

  6. 配置收发模式

  7. 串口初始化

  8. 串口使能

void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);//串口使能USART_InitTypeDef ChuanKou;
//USART 初始化设置
ChuanKou.USART_BaudRate = bound;//串口波特率
ChuanKou.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
ChuanKou.USART_StopBits = USART_StopBits_1;//一个停止位
ChuanKou.USART_Parity = USART_Parity_No;//无奇偶校验位
ChuanKou.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
ChuanKou.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
USART_Init(USART1,&ChuanKou);//串口初始化
USART_Cmd(USART1,ENABLE);//串口使能

重写中断服务函数

        注意:中断服务函数的函数已经固定,重新定义相同名字的函数即可,在定义好的函数里写中断的操作,哪个串口发生中断就得重定义哪个串口中断的函数

void USART1_IRQHandler();void USART1_IRQHandler(void)                	//串口1中断服务程序
{u8 JiaoYan_Wei=0;u8 j;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res =USART_ReceiveData(USART1);	//读取接收到的数据data[flag_1]=Res;flag_1++;if(flag_1==6) {flag_1=0;flag=1;}USART_ClearITPendingBit(USART1,USART_IT_RXNE);}
}

清空中断标志位

在中断服务函数里进行操作。

void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);USART_ClearITPendingBit(USART1,USART_IT_RXNE);

获取中断标志位

/*
不仅会判断标志位是否置1,同时还会判断是否使能了相应的中断
*/
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);USART_GetITStatus(USART1, USART_IT_RXNE);

接收函数

uint16_t USART_ReceiveData(USART_TypeDef* USARTx);Res =USART_ReceiveData(USART1);	//读取接收到的数据

打印数据

注意:得加上下面函数,才能像C语言那样打印到终端,在这里是打印到串口调试助手上

int fputc(int ch, FILE *f)
{USART_SendData(USART1, (uint8_t) ch);while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);return (ch);
}

例程

例程说明

1.编写主程序,初始化串口1,设置波特率为9600,无校验,数据位8位,停止位1位。

2.编写中断服务程序代码实现将接收到的数据保存下来。

3、数据格式为0xaa,0x55,0xxx(有效控制字节), 校验字节(前数相加-1),0x0d,0x0a 。(前两个是头码,后两个是结束码)

4.分析保存的数据,如果数据正确,则将控制单片机进行对应的动作,并把收到的数据发回。

5、.控制动作包括led1、led2和蜂鸣器,控制协议自定,比如:

0x01Led1亮
0x02Led1灭
0x08Led2亮
0x09Led2灭
0x15蜂鸣器响
0x16蜂鸣器不响

main.h

#ifndef _MAIN_H_
#define _MAIN_H_#include "stm32f10x.h"                  // Device header
#include "stm32f10x_gpio.h"             // Keil::Device:StdPeriph Drivers:GPIO
#include "stm32f10x_tim.h"              // Keil::Device:StdPeriph Drivers:TIM
#include <stm32f10x_rcc.h>
#include <stm32f10x_usart.h>
#include <stm32f10x_sdio.h>
#include <misc.h>
#include <stdio.h>
#include <delay.h>
#include "timch.h"
#include "bsp_SysTick.h"#include "led.h"
#include "Key.h"
#include "usart.h"
#include "FengMingQi.h"#endif

main.c

#include "main.h"extern u8 data[6];
extern u8 flag_1;
extern u8 flag;int main() {u8 key_num;u8 FMQ=0;u8 j;u8 JiaoYan_Wei=0;uart_init(9600);LED_Init();Key_Init();FengMingQi_Init();while(1) {if(flag==1){flag=0;	printf("\rok\n%x %x %x %x %x %x",data[0],data[1],data[2],data[3],data[4],data[5]);JiaoYan_Wei=data[0]+data[1]+data[2]-1;if((data[0]==0xaa)&&(data[1]==0x55)&&(JiaoYan_Wei==data[3])&&(data[4]==0x0d)&&(data[5]==0x0a)){switch(data[2]) {case 0x01: {//aa 55 01 ff 0d 0aLED_R_NO();break;}case 0x02: {//aa 55 02 00 0d 0aLED_R_OFF();break;}case 0x08: {//aa 55 08 06 0d 0aLED_G_NO();break;}case 0x09: {//aa 55 09 07 0d 0aLED_G_OFF();break;}case 0x15: {//aa 55 15 13 0d 0aFengMingQi_NO();break;}case 0x16: {//aa 55 16 14 0d 0aFengMingQi_OFF();break;}}}}}
}

usart.h

#ifndef __USART_H
#define __USART_H#include "stdio.h"
#include "sys.h"
#include "led.h"
#include "FengMingQi.h"
#include "delay.h"extern u8 Res;void uart_init(u32 bound);
void USART1_IRQHandler();#endif

usart.c

#include "usart.h"void uart_init(u32 bound) {//GPIO端口设置GPIO_InitTypeDef GPIO;USART_InitTypeDef ChuanKou;NVIC_InitTypeDef ZhongDuan;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟//USART1_TX   GPIOA.9GPIO.GPIO_Pin = GPIO_Pin_9; //PA9GPIO.GPIO_Speed = GPIO_Speed_50MHz;GPIO.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出GPIO_Init(GPIOA, &GPIO);//初始化GPIOA9//USART1_RX	  GPIOA.10初始化GPIO.GPIO_Pin = GPIO_Pin_10;//PA10GPIO.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO);//初始化GPIOA.10//Usart1 NVIC 配置ZhongDuan.NVIC_IRQChannel = USART1_IRQn;ZhongDuan.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级1ZhongDuan.NVIC_IRQChannelSubPriority = 1;		//子优先级1ZhongDuan.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&ZhongDuan);	//根据指定的参数初始化VIC寄存器USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//接收中断使能//USART 初始化设置ChuanKou.USART_BaudRate = bound;//串口波特率ChuanKou.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式ChuanKou.USART_StopBits = USART_StopBits_1;//一个停止位ChuanKou.USART_Parity = USART_Parity_No;//无奇偶校验位ChuanKou.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制ChuanKou.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式USART_Init(USART1,&ChuanKou);//串口初始化USART_Cmd(USART1,ENABLE);//串口使能
}u8 data[6];
u8 Res;
u8 flag_1=0;
u8 flag;void USART1_IRQHandler(void)                	//串口1中断服务程序
{u8 JiaoYan_Wei=0;u8 j;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res =USART_ReceiveData(USART1);	//读取接收到的数据data[flag_1]=Res;flag_1++;if(flag_1==6) {flag_1=0;flag=1;}USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除中断标志位}
}int fputc(int ch, FILE *f)
{USART_SendData(USART1, (uint8_t) ch);while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);return (ch);
}

http://www.ppmy.cn/devtools/164466.html

相关文章

通过Python编程语言实现机器学习小项目教程案例

通过Python编程语言实现机器学习小项目教程案例 文章目录 通过Python编程语言实现机器学习小项目教程案例1. 项目背景与目标2. 开发环境准备2.1 所需工具2.2 环境搭建2.3 库版本验证3. 数据集介绍与加载3.1 数据集特性3.2 数据加载4. 数据探索与可视化4.1 数据概览4.2 可视化分…

碰一碰矩阵发视频源码:从 NFC 触发到 AI 矩阵剪辑

一、行业背景与技术趋势 随着移动支付和短视频的爆发式增长&#xff0c;"碰一碰" 交互&#xff08;如支付宝碰一碰支付&#xff09;已延伸至内容创作领域。本文将解析如何通过 NFC/NB-IoT 技术触发视频生成&#xff0c;并结合矩阵运算实现智能剪辑&#xff0c;构建虚…

【JMeter】JMeter之MQTT压测

文章目录 MQTT概念Jmeter压测MQTTMQTT服务器下载Jmeter MQTT插件测试MQTT测试思路和解决方法 MQTT概念 MQTT是什么 MQTT是用于物联网&#xff08;IoT&#xff09;的OASIS标准消息传递协议。它被设计为一种非常轻量级的发布/订阅消息传输&#xff0c;非常适合使用较少的代码占用…

OAK相机的抗震性测试

在工业环境中&#xff0c;双目视觉相机必须具备与工作环境同等的坚固性。鉴于部分客户会将我们的相机应用于恶劣环境&#xff08;例如安装在重型机械上&#xff09;&#xff0c;我们依据EN 60068-2-6:2008标准对相机进行了振动耐受性测试。 测试涉及的相机型号包括&#xff1a…

飞书考勤Excel导入到自己系统

此篇主要用于记录Excel一行中&#xff0c;单条数据的日期拿取&#xff0c;并判断上下班打卡情况。代码可能满足不了大部分需求&#xff0c;目前只够本公司用&#xff0c;如果需要&#xff0c;可以参考。 需要把飞书月度汇总的考勤表导入系统中可以参考下。 下图为需要获取的年…

BiliBili视频下载-原理与实现Python+FFmpeg

脚本地址: 项目地址: Gazer BiliGrab.py 提要 适用于: 登录状态下, 非大会员视频下载. 自动解析任意 B 站非大会员 / 付费视频的视频 & 音频请求链接并下载, 需要添加 Cookie 保证视频清晰度. 使用 FFmpeg 命令无损合并视频和音频. 使用方法 克隆或下载项目代码.安装…

Java面试第八山!《Spring框架》

一、Spring框架概述 Spring是Java企业级应用开发的核心框架&#xff0c;通过控制反转&#xff08;IoC&#xff09;和 面向切面编程&#xff08;AOP&#xff09;实现模块解耦&#xff0c;简化开发流程。其核心优势包括依赖注入、声明式事务管理、集成主流ORM框架&#xff08;如…

Day31 第八章 贪心算法 part04

一. 学习文章及资料 860.柠檬水找零 406.根据身高重建队列 452.用最少数量的箭引爆气球 二. 学习内容 1. 柠檬水找零 (1) 解题步骤&#xff1a; 有三种情况&#xff1a; 情况一&#xff1a;账单是5&#xff0c;直接收下。 情况二&#xff1a;账单是10&#xff0c;消耗一个5…