二、读取编码器数值实现电机测速—1 、配置串口通信;

2023-10-31

电机系列

二、读取编码器数值实现电机测速

1 、配置串口通信;

usart.h

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

#define USART_REC_LEN  			200  	//定义最大接收字节数 200
#define EN_USART1_RX 			1		//使能(1)/禁止(0)串口接收
	  	
extern u8  USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 
extern u16 USART_RX_STA;         		//接收状态标记	
//如果想串口中断接收,请不要注释以下宏定义
void uart_init(u32 bound);
void USART3_Init(u32 bound);
int fputc(int ch,FILE *f);

#endif

usart.c


#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include "stdio.h"

volatile unsigned char *rx_address;
volatile unsigned int rx_count;
volatile unsigned int rx_length;


/********** 禁用半主机模式 **********/
#pragma import(__use_no_semihosting)
 
struct __FILE
{
	int a;
};
 
FILE __stdout;
 
void _sys_exit(int x)
{
	
}
 
/// 重定向c库函数printf到USART3
int fputc(int ch, FILE *f)
{
		/* 发送一个字节数据到USART3 */
		USART_SendData(USART3, (uint8_t) ch);
		
		/* 等待发送完毕 */
		while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);		
	
		return (ch);
}

/// 重定向c库函数scanf到USART3
int fgetc(FILE *f)
{
		/* 等待串口1输入数据 */
		while (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET);

		return (int)USART_ReceiveData(USART3);
}

void USART3_Init(u32 bound)
{
	//GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);// 需要使能AFIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);	//使能GPIO时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);	//使能USART时钟
	GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);
	//USART_TX  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //Pc10
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
    GPIO_Init(GPIOC, &GPIO_InitStructure);
   
    //USART_RX	  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//Pc11
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    //UsartNVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;		//子优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
   //USART 初始化设置
	USART_InitStructure.USART_BaudRate = u32 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(USART3, &USART_InitStructure);     //初始化串口3
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断
    USART_Cmd(USART3, ENABLE); 
	
	USART_ITConfig(USART3,USART_IT_RXNE,ENABLE); //使能接收中断void USART3_IRQHandler(void)
}

串口中断函数
//void USART3_IRQHandler(void)
//{
//	  u8 Res; //串口一次只能读取1个字符
//		if(USART_GetITStatus(USART3, USART_IT_RXNE)) //获取串口1接收状态标志位
//		{
//		 Res =USART_ReceiveData(USART3);	//读取接收到的数据
//		 USART_SendData(USART3, Res);  //将接收到的数据原样发送
//		 while(USART_GetFlagStatus(USART3, USART_FLAG_TC)!=SET); //等待发送结束
//	   //USART3->DR=USART_RX_BUF[t]; //寄存器版本串口发送数据方法,数据寄存器 USART_DR可以存放要发送的数据
//		 //while((USART3->SR&0X40)==0); //USART_SR 寄存器的TC位置0时数据发送结束
//    } 
//}

/********************************************************************************************************
函数名称:void USART3_Send(unsigned char *tx_buf, int len)
函数功能:串口1发送函数
硬件连接:PC10----TXD,PC11----RXD
备    注:
日    期:  
*********************************************************************************************************
*/
void USART3_Send(unsigned char *tx_buf, int len)
{
	USART_ClearFlag(USART3, USART_FLAG_TC);
	USART_ClearITPendingBit(USART3, USART_FLAG_TXE);
	while(len--)
	{
		USART_SendData(USART3, *tx_buf);
		while(USART_GetFlagStatus(USART3, USART_FLAG_TC) != 1);
		USART_ClearFlag(USART3, USART_FLAG_TC);
		USART_ClearITPendingBit(USART3, USART_FLAG_TXE);
		tx_buf++;
	}
	
}

/*********************************************************************************************************
函数名称:void USART3_Receive(unsigned char *rx_buf, int len)
函数功能:串口1接收函数
硬件连接:PC10----TXD,PC11----RXD
备    注:
日    期:  
*********************************************************************************************************
*/
void USART3_Receive(unsigned char *rx_buf, int len)
{
	rx_count = 0;
	rx_length = len;
	rx_address = rx_buf;
}
/*
********************************************************************************************************
函数名称:void USART3_IRQHandler(void)
函数功能:串口1中断服务函数
硬件连接:PC10----TXD,PC11----RXD
备    注:
日    期: 
*********************************************************************************************************
*/
void USART3_IRQHandler(void)
{
	unsigned char Res;
	//u8 Res;
	if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
	{
		
		Res = USART_ReceiveData(USART3);
		 //printf("[USART3_IRQHandler],Rec_data = %x\r\n", Res);

		if(rx_length > rx_count)
		{
			*rx_address = Res;
			rx_address++;
			rx_count++;	
	}
			USART_ClearITPendingBit(USART3, USART_IT_RXNE);
			 
    } 	
}


main.c

#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "motor.h"
#include "control.h"
#include "usart.h"
#include "encoder.h"
#include "stdio.h"

int main(void)
{	
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //串口设置中断优先级分组,即优先级分级个数
	                                                //NVIC_PriorityGroup_2,代表抢占优先级位数位2,可以分[0, 1, 2, 3]四级优先级
	                                                // 响应优先级位数位2,可以分[0, 1, 2, 3]四级优先级
	USART3_Init(); //调用串口1初始化函数
	//printf("11111");
	while(1)
	{
		printf("nihao ");
	}
}

此时即可通过串口助手读到 printf输出的内容。

源码在下载区。

2 、配置编码器;

在工程中加入电机控制文件:

见下文;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二、读取编码器数值实现电机测速—1 、配置串口通信; 的相关文章

  • 浏览器页面后退,重新运行ajax

    问题描述 在浏览器页面后退时 也就是说你点击链接到一个页面 然后又点击后退按钮回到刚才的页面 结果发现jQuery的ajax GET请求不再执行了 解决方法 禁用ajax缓存 ajaxSetup cache false 吐槽 为了解决这个问
  • java中的String

    Java中的String类是一种复合数据类型 比较String类的是否相等也有2种办法 和equals 两种 String是一个系统定义的类 不是基本数据类型 有关字符串处理的方法非常多 有时候两个 一样 的字符串做相等的比较运算时会得到t
  • 华为OD机试真题-查找充电设备组合【2023Q1】【JAVA、Python、C++】

    题目描述 某个充电站 可提供n个充电设备 每个充电设备均有对应的输出功率 任意个充电设备组合的输出功率总和 均构成功率集合P的1个元素 功率集合P的最优元素 表示最接近充电站最大输出功率p max的元素 输入描述 输入为3行 第1行为充电设
  • 时序预测

    时序预测 MATLAB实现Bayes贝叶斯优化LSTM 长短期记忆神经网络 时间序列预测 预测效果一览
  • React - Websocket

    组件didMount调用 Store createWebSocket Math random Store url ws window backend server slice 7 apronMapWebsocket 这个要与后端提供的相同
  • C++函数重载、重写与重定义

    演示代码 include
  • 探索Java8——CompletableFuture: 组合式异步编程

    文章目录 Future接口 Future接口的局限性 使用 CompletableFuture 使用并行流对请求进行并行操作 使用 CompletableFuture 发起异步请求 如果你的意图是实现并发 而非并行 或者你的主要目标是在同一
  • https到底是如何防篡改的

    1 前言 https是一个老生常谈的话题了 也是面试过程种经常甚至必然会问到的一个问题 但当问到https为什么安全的时候 很多人的回答就是简单的回一句 因为他加密了 然后就没然后了 你也相当于啥都没回答出来 2 我为什么要写这篇文章呢 网
  • select底部增加固定按钮

  • 基于SSM的校园快递一站式服务系统设计与实现

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 采用JSP技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Mave
  • 统计学R语言 第五章课后练习 置信区间

    5 1 计算一个总体均值的置信区间 大样本 gt exercise5 1 lt read csv D 289250 统计学 基于R 第4版 例题和习题数据 统计学 基于R 第4版 例题和习题数据 公开资源 exercise chap05 e
  • 用python网络爬虫爬取英雄联盟英雄图片

    用python爬虫爬取lol皮肤 这也用python网络爬虫爬取lol英雄皮肤 忘了是看哪个大神的博客 由于当时学了下就一直放在这儿 现在又才拿出来 再加上马上要考二级挺忙的 代码基本上是没改 还望大神原谅 本人小白 没学过Python 只

随机推荐

  • Pay Cycle related record

    select delete from sysadm ps pycycl stat where pay cycle ACH and pay cycle seq num gt 30 select delete from sysadm ps PY
  • Golang初入编程-踩坑笔记(3)- 并发,优雅关闭

    主函数也是线程 在不使用sync WaitGroup的情况下 需要main等待goroutine完成 不然main完成就没了 sync是synchronizing 使 同步 的缩写 wg done 最好加defer chan需要make c
  • Sqli-labs之Less-26和Less-26a

    Less 26 GET 基于错误 您所有的空格和注释都属于我们 根据提示我们知道这一关过滤了空格和注释 实际上过滤的远远不止这些 我们来看下源码 可以确认一下 id 231 确认过滤了 id or1 确认过滤了or id 1 确认过滤了多行
  • C语言 fstat函数

    系列文章目录 文章目录 系列文章目录 前言 一 stat系统调用 二 fstat 1 功能 2 相关函数 3 头文件 4 函数声明 5 描述 6 返回值 7 例子 三 struct stat结构体 前言 一 stat系统调用 stat系统调
  • Linux学习之expect操作详解

    一 expect安装介绍 1 expect命令安装 安装语句 yum install expect 2 expect命令含义 expect是一种脚本语言 它能够代替人工实现与终端的交互 主要应用于执行命令和程序时 系统以交互形式要求输入指定
  • Python全栈开发【基础-03】编程语言的分类

    专栏介绍 本专栏为Python全栈开发系列文章 技术包括Python基础 函数 文件 面向对象 网络编程 并发编程 MySQL数据库 HTML JavaScript CSS JQuery bootstrap WSGI Django Flas
  • usb鼠标驱动(一)

    Linux USB 鼠标驱动程序详解 注册一个usb driver 这个drvier不是usb设备driver 而是接口driver use a define to avoid include chaining to get THIS MO
  • 微信小程序消息订阅Java

    前言 编写日期 2022 11 04 写这篇文章原因 公司给政府做一个订餐系统 需要在员工在小程序上发起订餐后经过部门领导和书记的审批后 再由食堂确认订餐结果 在订餐审批单在各个节点流转的过程中 需要给每一个节点的审批人发送微信订阅消息和手
  • 【目标检测】目标检测的评价指标(七个)

    目录 目标检测的评价指标 一 正样本与负样本 二 真正 TP 假正 FP 真负 TN 假负 FN 1 正确的正向预测 True Positive TP 正样本被正确检测的数量 2 错误的正向预测 False Positive FP 3 错误
  • redis 过期消息订阅实现(java实现)

    一 开启redis消息通知功能 方法1 修改conf文件 编辑 etc redis redis conf文件 添加或启用以下内容 key过期通知 notify keyspace events Ex 方法2 使用命令 登陆redis cli
  • AUTOSAR-自旋锁(spinlock)与互斥锁

    AUTOSAR多核OS为实现核间资源互斥 保证数据一致性 设计了自旋锁机制 该机制适用于核间资源互斥 对于多核概念 需要一种新的机制来支持不同内核上任务的互斥 这种新机制不应在同一内核上的 TASK 之间使用 因为它没有意义 在这种情况下
  • Leetcode——118.杨辉三角

    杨辉三角 杨辉三角 是二项式系数在三角形中的一种几何排列 在欧洲 这个表叫做帕斯卡三角形 帕斯卡 1623 1662 是在1654年发现这一规律的 比杨辉要迟393年 比贾宪迟600年 杨辉三角是中国古代数学的杰出研究成果之一 它把二项式系
  • el-empty Empty 空状态 自定义图片 使用本地图片

    今天用到el empty组件 Empty 空状态 使用image属性导入自己本地图片不成功 后面发现问题如下 1 image属性要用动态绑定 即 image url 2 图片导入要用require url vue div class que
  • python 对数值各个数位上的单数操作

    如果对数值各个数位上的单数进行操作呢 比如 求解任意给定的某个数字的各个数位上的单数的平方和 如给定数字123 求解 思路就是通过循环使用 取余 和 取整 操作从该数字的个位开始往高位不断取值 代码如下 def calculate num
  • 可参考的MES系统软件

    MES生产管理系统 用的生产管理软件有 企业资源计划管理系统 ERP 制造企业生产过程执行管理系统 MES 生产设备和工位智能化联网管理系统 生产数据及设备状态信息采集分析管理系统 MDC 制造过程数据文档管理系统 工装及刀夹量具智能数据库
  • 常用的英文单词2000

    常用的英文单词 可以ctrl f来查找需要的单词 查找需要的前缀后缀引导的单词 1 a ei art 一 个 任何一 个 每一 个 2 I ai pron 我 3 ability biliti n 能力 本领 才能 才智 4 able ei
  • QT UDP简单的通信示例

    UDP user datagram protocol 即用户数据协议 是一个轻量级的 不可靠的 面向数据报的无连接协议 在qt中提供了QUdpSocket类来进行UDP数据报的发送和接收 在Pro中加入network模块 因为upd是无连接
  • Java中的重写(Override)

    从字面上看 重写就是 重新写一遍的意思 其实就是在子类中把父类本身有的方法重新写一遍 子类继承 了父类原有的方法 但有时子类并不想原封不动的继承父类中的某个方法 所以在方法名 参数列 表 返回类型 除过子类中方法的返回值是父类中方法返回值的
  • 万字长文总结Android多进程,面试心得体会

    前言 跳槽容易 但想拿大厂的offer可不那么容易 很多小伙伴一直叨叨要跳槽 大大小小的公司面试了很多 但却很难拿到一个满意的offer 要么package太低 要么就是面试被虐 经过多次面试失利之后 方能明白什么叫基础不牢 地动山摇 面试
  • 二、读取编码器数值实现电机测速—1 、配置串口通信;

    读取编码器数值实现电机测速 电机系列 二 读取编码器数值实现电机测速 1 配置串口通信 usart h usart c main c 2 配置编码器 电机系列 二 读取编码器数值实现电机测速 1 配置串口通信 usart h ifndef