STM32F407VET6 普通 IO 口模拟串口发送数据

2023-05-16

1、只实现了,使用普通 IO 口模拟串口的发送,没有实现接收

2、由于是模拟发送的是 TTL 电平,所以在使用串口助手验证发送数据的准确性时,应该使用 USB 转 TTL ,而不能使用 USB 转 232(验证时,本人犯了这样的错误)

方法一:调节占空比,实现定时器延时

/对应波特率的1个电平持续时间
//(1/2400) = 416us
#define IO_USART_SENDDELAY_TIME 	416

void uart_tx_bit(uint8_t bit) {
	if (bit == 1) {
		GPIO_SetBits(GPIOD, GPIO_Pin_12);
	} else {
		GPIO_ResetBits(GPIOD, GPIO_Pin_12);
	}
}

void uart_tx_delayus(uint32_t nTime) {
	uint16_t tmp;
	//获得 TIM4 计数器的值
	tmp = TIM_GetCounter(TIM4);
	if (tmp + nTime <= 65535)
		while ((TIM_GetCounter(TIM4) - tmp) < nTime);
	else {
		TIM_SetCounter(TIM4, 0);
		//设置 TIM4 计数器寄存器值为0
		while (TIM_GetCounter(TIM4) < nTime);
	}
}

void uart_tx_byte(uint8_t data) {
	uint8_t i, tmp;

	// 开始位
	uart_tx_bit(0);	//将TXD的引脚的电平置低
	uart_tx_delayus(IO_USART_SENDDELAY_TIME);

	for (i = 0; i < 8; i++) {
		tmp = (data >> i) & 0x01;
		if (tmp == 0) {
			uart_tx_bit(0);
			uart_tx_delayus(IO_USART_SENDDELAY_TIME);	//0
		} else {
			uart_tx_bit(1);
			uart_tx_delayus(IO_USART_SENDDELAY_TIME);	//1
		}
	}
	// 结束位
	uart_tx_bit(1);	//将TXD的引脚的电平置高
	uart_tx_delayus(IO_USART_SENDDELAY_TIME);
}

static void hw_init(void) {
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_Init(GPIOD, &GPIO_InitStructure);
	GPIO_SetBits(GPIOD, GPIO_Pin_12);

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
	TIM_TimeBaseStruct.TIM_Period = 65535 - 1;
	TIM_TimeBaseStruct.TIM_Prescaler = 84 - 1;  
	TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStruct);
	TIM_Cmd(TIM4, ENABLE);
}

void uart_tx_init(void) {
	hw_init();
}

方法二:定时器中断的方式

//对应波特率的1个电平持续时间
//(1/2400) = 416us
#define IO_USART_SENDDELAY_TIME 	416

static int send_bit_flag = 0;
static int value_bit[10];
static uint8_t k = 0;

static void send_bit(int bit) {
	if (bit == 1) {
		GPIOD->BSRRL = GPIO_Pin_12;
	} else {
		GPIOD->BSRRH = GPIO_Pin_12;
	}
}

static void send(int value) {
	value_bit[0] = 0;
	for (uint8_t i = 1; i < 9; i++) {
		value_bit[i] = value & 1;
		value = value >> 1;
	}
	value_bit[9] = 1;

	k = 0;
	TIM_Cmd(TIM4, ENABLE);
	send_bit_flag = 1;
}


void TIM4_IRQHandler(void) {
	if (TIM_GetITStatus(TIM4, TIM_IT_Update) == SET) {
		if (send_bit_flag == 1) {
			send_bit(value_bit[k]);
			k++;
		}
		if (k == 11) {
			TIM_Cmd(TIM4, DISABLE);
			send_bit_flag = 0;
			k = 0;
		}
	}
	/* 清除中断标志位 */
	TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
}

static void hw_init(void) {
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_Init(GPIOD, &GPIO_InitStructure);

	GPIO_SetBits(GPIOD, GPIO_Pin_12);


	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
	TIM_TimeBaseStruct.TIM_Period = 416 - 1;
	TIM_TimeBaseStruct.TIM_Prescaler = 84-1; 
	TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStruct);

	TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
	TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
	TIM_Cmd(TIM4, DISABLE);

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}


void uart_tx_init(void) {
	hw_init();
}

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

STM32F407VET6 普通 IO 口模拟串口发送数据 的相关文章

  • UITableView

    http www cnblogs com kenshincui p 3931948 html
  • 一些网址

    http www chanpin100 com 点击打开链接
  • win10下的docker桌面端配置ubuntu进行访问

    前言 xff1a win10下安装了docker桌面端 xff0c 想使用linux系统来访问docker 1 win10下docker安装好之后 xff0c 可以直接使用powershell来访问docker环境 xff0c 如下 xff
  • ROS的基本用法二 服务通信

    第一节 xff1a ROS的服务 摘要 xff1a 介绍ROS的服是双向的通信 xff0c 客户端提交 xff0c 服务端处理后返回到客户端 1 理论介绍 自定义数据类型 xff0c 根据自定义数据类型进行处理 xff0c 客户端请求 xf
  • Ubuntu22安装docker-ce

    阿里云 span class token function sudo span span class token function apt get span remove span class token function docker s
  • C语言之字符数组和字符串末尾加‘\0‘情况浅述

    在字符数组中 xff0c 以字符串形式存入 xff0c 机器会自动加上 39 0 xff1b 在字符数组中 xff0c 以字符形式存入 xff0c 机器不会自动加上 39 0 39 在字符串中 xff0c 效果一样 在C语言中 xff1a
  • Ubuntu 16.04+ROS kinetic+rviz模拟turtlebot机器人时出现的问题-

    鉴于ROS kinetic 版本主能兼容 ubuntu 16 04和15 01版本 xff0c 而16 04的版本由于环境比较新 xff0c 感觉还有很多问题需要解决 博主在进行RVIZ模拟仿真机器人跑时 xff0c 出现了以下问题 xff
  • Win10下 Ubuntun1604LTS双系统安装

    1 下载Ubuntu 16 04 https www ubuntu com download alternative downloads 下载 16 04LTS版 2018 03 10 Ubuntu 16 04 4 LTS Ubuntu 1
  • 主祷文

    主 祷 文 我们在天上的父 xff0c 愿人都尊你的名为圣 愿你的国降临 愿你的旨意行在地上 xff0c 如同行在天上 我们日用的饮食 xff0c 今日赐给我们 免我们的债 xff0c 如同我们免了人的债 不叫我们遇见试探 xff0c 救我
  • 嵌入式Linux系统串口通信协议设计

    1 设计基础 这里指的协议是应用层协议 xff0c 针对应用协议的设计 xff0c 需要注意的有几个基本点 xff1a 可识别 xff0c 兼容性 xff0c 访问控制 xff0c 可追溯 xff0c 数据完整性校验 首先是可识别 xff0
  • 什么是导航?导航具有什么样的作用?

    导航 xff08 Navigation xff09 是引导载体从起始点安全 可靠地引导到目的地的过程 xff0c 导航的基本作用就是回答我在哪里 xff1f 通常用载体在空间的即时位置 速度 姿态和航向等参数来描述导航过程 xff0c 这些
  • 一个失败的程序员

    一个失败的程序员 第一次写博客 xff0c 看了别人的很久 xff0c 也想了很久 xff0c 觉得无论文笔有多不好 xff0c 分享的内容有多糟糕 xff0c 都应该有这个勇气迈出第一步 xff0c 记录生活 抒写回忆 xff0c 等到回
  • 学习FreeRTOS前的准备工作

    转自 http bbs armfly com read php tid 61 1552 了解FreeRTOS之前 xff0c 一定要搞清楚FreeRTOS xff0c SafeRTOS和OpenRTOS之间的关系 1 先说FreeRTOS和
  • Linux网络编程(一)

    Linux网络编程博文均选自 unix网络编程 Richard Stevens xff0c 仅限于学习与查漏补缺只用 xff0c 原址 xff1a http blog csdn net hongchangfirst article deta
  • vscode配合gitee同步云设置

    更换开发设备后 xff0c 新安装的vscode软件 xff0c 是没有原先的配置的 xff0c 诸如快捷键 xff0c 快捷代码段生成 安装的各个插件 xff0c 插件的配置等都木大了 xff0c 开发起来会很别扭 xff0c 网上最多的
  • 升压减压以及充电电路设计

    供电电路在整个硬件系统中都是极其重要的 xff0c 只有能产生稳定电压与电流的供电电路才能保证整个硬件系统的正常工作 在本系统中 xff0c STM32F103C8T6需要的电压为3 3V xff0c 同时还有其他的模块需要5V的电压 xf
  • Java枚举详解及常见用法

    1 枚举的使用场景 枚举是一个被命名的整型常数的集合 xff0c 用于声明一组带标识符的常数 枚举在曰常生活中很常见 xff0c 例如一个人的性别只能是 男 或者 女 xff0c 一周的星期只能是 7 天中的一个等 类似这种当一个变量有几种
  • ros编译时与opencv发生冲突的解决办法 opencv_imgcodecs3.so.3.3.1: undefined reference to `TIFFReadDirectory@LIBTIFF

    在编译ros项目的时候 xff0c 遇到下面的错误 xff1a 38 Building CXX object cube slam detect 3d cuboid CMakeFiles detect 3d cuboid dir src ma
  • ROS的一些常用的命令

    下面是ros下面的一些常用操作 xff0c 先做个总结 xff0c 方便后续使用 1 只编译工作空间下面的一个包 catkin make DCATKIN WHITELIST PACKAGES span class token operato
  • realsense相机两种获取相机内外参的方式

    realsense相机出厂的时候一般都标定好了 xff0c 直接读取他们的内参即可 终端输入 xff1a rs sensor control 然后按照提示操作即可 方法 xff1a https blog csdn net mystyle a

随机推荐

  • 【Python开发利器-TKinterDesigner 】 :第一讲:TkinterDesigner的基本功能介绍

    Python开发利器 TKinterDesigner xff1a 第一讲 xff1a TkinterDesigner的基本功能介绍
  • 基于Spine动画的AVATAR换装系统优化

    大家好 xff0c 我是红孩儿 xff0c 目前在玩吧技术专家组负责技术研发工作 xff0c 好久不见 xff0c 作为一名引擎开发者 xff0c 这次我给大家分享一下基于Spine动画的AVATAR换装优化 xff0c 希望能够对有类似需
  • TKinterDesigner v1.6.4 前瞻- 即将开启Python移动开发时代

    TKinterDesigner v1 6 4 前瞻 即将开启Python移动开发时代 我想 xff1a 这可能是一个新时代的开启吧
  • TKinterDesigner从入门到精通视频教程

    想使用TKinter开发桌面应用 xff1f 想使用TKinter开发移动应用 xff1f TKinterDesigner来帮助你吧 xff01 欢迎使用TKinterDesigner xff01 以下是 TKinterDesigner从入
  • 房卡麻将分析系列 "牌局回放" 之 播放处理

    持续放出房卡麻将设计与研发讲解 敬请关注微信共众号 xff1a 红孩儿的游戏开发之路 房卡麻将分析系列 34 牌局回放 34 之 播放处理 昨天红孩儿给大伙讲了讲 牌局回放 的数据记录处理 xff0c 有了数据的存储 xff0c 下面就是数
  • AutoSAR 标准--基础安全特性

    CSM 密码服务管理器 Crypto Service Manager xff1a 访问加密服务 配置用于执行服务的加密服务和算 同步或异步执行的配置 安全计数器的配置 对加密密钥的操作配置 配置证书操作 CRYIF 密码算法接口 Inter
  • 房卡麻将分析系列之"发牌器"算法设计

    房卡麻将分析系列之 34 发牌器 34 算法设计 大家好 xff0c 经过一段时间的努力 xff0c 在填平了大部分源码框架中的坑后 xff0c 我们的 大赢家 红中麻将总算完成了1 0版本 xff0c 虽然仍然有诸多问题 xff0c 但总
  • 房卡麻将分析系列之"架构选型"

    房卡 麻将研发技巧 xff0c 尽在 红孩儿的游戏开发之路 xff0c 欢迎关注公众号 xff01 房卡麻将分析系列之 34 架构选型 34 这段时间 xff0c 团队的棋牌订制咨询量激增 xff0c 每天都有人问如何进行订制合作 xff0
  • 房卡麻将分析系列之"断线重连"

    房卡 麻将研发技巧 xff0c 尽在 红孩儿的游戏开发之路 xff0c 欢迎关注公众号 xff01 房卡麻将分析系列之 34 断线重连 34 大家好 xff0c 我是红孩儿 xff0c 房卡 麻将分析系列继续进行中 在进行游戏的过程中 xf
  • 房卡麻将分析系列之"千里传音"

    房卡 麻将研发技巧 xff0c 尽在 红孩儿的游戏开发之路 xff0c 欢迎关注公众号 xff01 房卡麻将分析系列之 34 千里传音 34 在房卡棋牌游戏中 xff0c 因为要频繁的看牌 xff0c 出牌 为了实时沟通打字聊天往往比较麻烦
  • 房卡棋牌分析系列之"微信登录"

    房卡 麻将研发技巧 xff0c 尽在 红孩儿的游戏开发之路 xff0c 欢迎关注公众号 xff01 房卡棋牌分析系列之 34 微信登录 34 房卡棋牌之所以火热 xff0c 很大程度上取决于当下中国智能机的普及和微信作为基础通讯社交工具的广
  • 程序员三十岁之后要考虑什么?

    程序员三十岁之后要考虑什么 xff1f 周六受邀参加了触控科技CocoaChina开发者社区举办的 34 移动游戏人才培养和创业机会 的沙龙 其间被问到一个问题 xff1a 程序员三十岁之后该怎么办 xff1f 三十岁后该怎么办 xff1f
  • 房卡麻将分析之"一键入局"

    地方棋牌 xff0c VR AR技术 xff0c 请关注公众号 xff1a 34 红孩儿的游戏开发之路 房卡麻将分析之 34 一键入局 34 房卡麻将通过微信邀请好友加入房间进行游戏 xff0c 大大方便了玩家进行麻将游戏 这也凸显了微信对
  • 房卡麻将分析之"防作弊处理"

    房卡麻将分析之 34 防作弊处理 34 棋牌游戏最重要的一个特点就是人与人对局 xff0c 因为玩家各自的不可见 xff0c 就存在着一些作弊的可能性和漏洞 对于手机房卡麻将游戏 xff0c 大家最讨厌的问题就是作弊 如何防止玩家作弊 xf
  • 房卡麻将分析之“缺人玩法”

    一般玩麻将都是四个人 xff0c 遇到 三缺一 怎么办 xff1f 大多数情况下 xff0c 玩家只好等待或叫人 xff0c 这无疑增加了玩家的等待时间 xff0c 同时也减缓了房卡的消耗速度 其实四个人并不是玩麻将的硬性条件 xff0c
  • 房卡麻将分析之“代开房间”

    什么是代开房间 代开房间 xff0c 就是可以创建一个新的房间 xff0c 让其它玩家加入 为什么要做代开房间 xff08 1 xff09 可以帮助没有房卡的朋友开房 xff0c 提升未买卡玩家玩游戏的积级性 xff08 2 xff09 代
  • 信号量sem_wait()的使用

    闲来无事 xff0c 我给大家讲下UNIX Linux下信号量函数的使用 首先你得知道什么叫信号量 xff0c 什么时候要用信号量 这个嘛 xff0c 主要就是用来保护共享资源的 xff0c 也就是说如果你想限制某个 xff08 些 xff
  • 房卡麻将分析之“俱乐部功能”

    什么是俱乐部 群主 xff08 代理 xff09 创建俱乐部后 xff0c 可以邀请自已的群成员成为自已的俱乐部会员 xff0c 方便管理 俱乐部玩法由创始人设置 xff0c 只有俱乐部成员才能加入 xff0c 并且俱乐部房间全部消耗创始人
  • 红孩儿网狐Cocos经典棋牌开发教程-卞安-专题视频课程

    红孩儿网狐Cocos经典棋牌开发教程 4750人已学习 课程介绍 由知名Cocos技术讲师红孩儿讲解的基于网狐源码进行棋牌开发的系列教程 课程收益 1 快速理解掌握网狐棋牌的源码框架 2 能够学会使用网狐棋牌快速换皮产品 3 能够在网狐棋牌
  • STM32F407VET6 普通 IO 口模拟串口发送数据

    1 只实现了 xff0c 使用普通 IO 口模拟串口的发送 xff0c 没有实现接收 2 由于是模拟发送的是 TTL 电平 xff0c 所以在使用串口助手验证发送数据的准确性时 xff0c 应该使用 USB 转 TTL xff0c 而不能使