UART、TIMER

UART简介(通用异步收发器,通常称串口)

UART,是一种串行、异步、全双工的通信协议,在嵌入式领域应用的非常广泛。

UART作为异步串行通信协议的一种,工作原理是将传输数据的每个二进制位一位接一位地传输。在UART通信协议中信号线上的状态为高电平时代表‘1’,信号线上的状态为低电平时代表‘0’。比如使用UART通信协议进行一个字节数据的传输时就是在信号线上产生八个高低电平的组合。

数据通信方式和方向

串口协议帧

波特率:常见波特率有1200、2400、4800、9600、19200、38400、57600、115200等等

起始位和停止位:起始位由低电平表示,停止位是0.5、1、1.5位表示

有效数据位:5、6、7、8位,低位在前,高位在后

校验位:奇校验、偶校验、0校验、1校验、无校验

RX采样

UART框图

#include "debug.h"/* 标准库需要的支持函数 */
#pragma import(__use_no_semihosting)struct __FILE
{int handle;
};FILE __stdout;void _sys_exit(int x)
{ x = x;
}/* 重定义fputc函数 */
int fputc(int ch, FILE *f)
{while((USART1->SR & 0X40) == 0); //循环发送,直到发送完毕USART1->DR = (uint8_t)ch;return ch;
}/******************************************************************************* @brief     初始化串口1作为调试端口** @param[in]  bound_rate   :  波特率** @return     无*******************************************************************************/
void Debug_Init(uint32_t bound_rate)
{/* GPIO端口设置 */GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//使能USART1时钟/* 串口1对应引脚复用映射 */GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);  //PA9复用为USART1_TXGPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1); //PA10复用为USART1_RX/* USART1端口配置 */GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_9 | GPIO_Pin_10;  //GPIOA9与GPIOA10GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_AF;              //复用功能GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;          //速度50MHzGPIO_InitStructure.GPIO_OType  = GPIO_OType_PP;             //推挽复用输出GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_UP;              //上拉GPIO_Init(GPIOA, &GPIO_InitStructure);                      //初始化PA9,PA10/* USART1 初始化设置 */USART_InitStructure.USART_BaudRate              = bound_rate;                       //波特率设置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(USART1, &USART_InitStructure);                                           //初始化串口USART_Cmd(USART1, ENABLE);                                                          //使能串口
}
int main(void)
{Debug_Init(115200);while((USART1->SR & 0X40) == 0);USART_SendData(USART1, 'A');while((USART1->SR & 0X40) == 0);USART_SendData(USART1, 'B');while((USART1->SR & 0X40) == 0);USART_SendData(USART1, '\r');while((USART1->SR & 0X40) == 0);USART_SendData(USART1, '\n');printf("uart is ok\r\n");while (1) {;}
}

Timer(定时器)---以TIM3为例

TIM计数模式

TIM框图

TIM相关参数

倍频因子(默认为2)

自动加载值设置为1000

预分频器设置为84,

TIM3挂载到APB1总线,APB1总线42Mhz,倍频为2,则CK_INT = 42Mhz * 2 / 84= 1Mhz,则TIM3在1秒内计数1M次(每次1us) 具体定时时间:t = 一次TIM3计数时间  * 自动加载值 = 1us * 1000 = 1 ms

main.c

LED_t gLed[3];
int main(void)
{Debug_Init(115200);Delay_Init();printf("timer start\r\n");/* 初始化3个板载LED */LED_Init(&gLed[0], GPIOE, GPIO_Pin_5);LED_Init(&gLed[1], GPIOE, GPIO_Pin_6);LED_Init(&gLed[2], GPIOC, GPIO_Pin_13);int i = 0;while (1) {printf("%d\r\n", i++);Delay_Ms(1000);
//        //打开所有的LED灯
//        LED_On(&gLed[0]);
//        LED_On(&gLed[1]);
//        LED_On(&gLed[2]);
//        Delay_Ms(1000);//        //关闭所有的LED灯
//        LED_Off(&gLed[0]);
//        LED_Off(&gLed[1]);
//        LED_Off(&gLed[2]);
//        Delay_Ms(1000);}
}
#include "delay.h"/******************************************************************************* @brief     通用定时器3中断初始化*            定时器溢出时间计算方法:Tout = ((arr + 1) * (psc + 1)) / Ft us.*            Ft = 定时器工作频率, 单位: Mhz** @param[in]  arr   :  自动重装值* @param[in]  psc   :  时钟预分频数** @return     无*******************************************************************************/
void TIM3_Init(uint16_t arr, uint16_t psc)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);                  //使能TIM3时钟TIM_TimeBaseInitStructure.TIM_Prescaler      = psc;                   //定时器分频TIM_TimeBaseInitStructure.TIM_CounterMode    = TIM_CounterMode_Down;  //向下计数模式TIM_TimeBaseInitStructure.TIM_Period         = arr;                   //自动重装载值TIM_TimeBaseInitStructure.TIM_ClockDivision  = TIM_CKD_DIV1;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);                 //初始化定时器3
}/******************************************************************************* @brief      初始化定时器延时函数,定时1us** @param[in]  无** @return     无*******************************************************************************/
int Delay_Init(void)
{TIM3_Init(100 - 1, 84 - 1); //return 0;
}/******************************************************************************* @brief      微秒级延时** @param[in]  us    :  延时微秒数** @return     无*******************************************************************************/
void Delay_Us(uint32_t us)
{TIM3->ARR = us;           //自动重载器TIM3->CNT = TIM3->ARR;    //计数器TIM_Cmd(TIM3, ENABLE);    //启动定时器while (TIM3->CNT) {;}      //等待延时时间到TIM_Cmd(TIM3, DISABLE);   //关闭定时器
}/******************************************************************************* @brief      毫秒级延时,不建议在OS中使用** @param[in]  us    :  延时毫秒数** @return     无*******************************************************************************/
void Delay_Ms(uint32_t ms)
{for(int i = 0; i < ms; i++){Delay_Us(1000);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/321696.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五一 大项目

Docker 中的 Nginx 服务为什么要启用 HTTPS 一安装容器 1 安装docker-20.10.17 2 安装所需的依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 添加Docker官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos…

言出身随!人情世故:利益交换与人脉的重要性——早读(逆天打工人爬取热门微信文章解读)

巴黎输了&#xff0c;看了比赛还得加班 引言Python 代码第一篇 洞见 认知越高的人&#xff0c;越懂得感恩第二篇 冯站长之家 2024年5月8日&#xff08;周三&#xff09;三分钟新闻早餐结尾 智慧赋予我决策的明灯 勇气则是我行动的盾牌 在细雨中骑行 是我以智慧选择的道路 用勇气…

富唯智能复合机器人:CNC铝块上下料安全新标准

在CNC铝块加工过程中&#xff0c;上下料环节的安全问题一直是企业关注的焦点。富唯智能复合机器人的应用&#xff0c;为这一环节树立了新的安全标准。 传统的上下料方式往往依赖于人工操作&#xff0c;存在着较大的安全隐患。而富唯智能复合机器人采用先进的视觉识别技术和精准…

前端如何设置div可滚动,且设置滚动条颜色

在前端中&#xff0c;设置 div 为可滚动并通过 CSS 自定义滚动条的颜色并不是所有浏览器都直接支持的功能&#xff0c;因为滚动条的样式在很大程度上取决于操作系统和浏览器的默认样式。然而&#xff0c;你可以使用某些 CSS 属性来尝试自定义滚动条的外观&#xff0c;这些属性在…

一分钟教你学浪app视频怎么缓存

你是否在学浪app上苦苦寻找如何缓存视频的方法&#xff1f;你是否想快速、轻松地观看自己喜欢的视频内容&#xff1f;那么&#xff0c;让我们一起探索一分钟教你如何缓存学浪app视频的技巧吧&#xff01; 学浪下载工具我已经打包好了&#xff0c;有需要的自己下载一下 学浪下…

OpenAI的搜索引擎要来了!

最近的报道和业界泄露信息显示&#xff0c;OpenAI正秘密研发一款新的搜索引擎&#xff0c;可能叫SearchGPT或Sonic&#xff0c;目标是挑战Google的搜索霸权。预计这款搜索引擎可能在5月9日即将到来的活动中正式亮相。 SearchGPT的蛛丝马迹 尽管OpenAI对SearchGPT尚未表态&…

如何在Hostease的Linux虚拟主机上永久移除WordPress网站

最近有遇到客户咨询如何移除Linux虚拟主机上的WordPress网站的&#xff0c; 因为原先的站点长时间不更新&#xff0c;被恶意篡改&#xff0c;跳转到了一个博彩网站上&#xff0c;本身网站也比较旧了&#xff0c;客户也不准备修复&#xff0c;准备重新建站。但是又怕移除不干净&…

合并两个有序数组题目讲解

一&#xff1a;题目 非递减顺序可以理解为&#xff1a;不完全递增顺序&#xff0c;它不是完全的递增&#xff0c;会存在前后相等的情况&#xff0c;比如 [1&#xff0c;2&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;6] &#xff0c;这就是非递减顺序。 二&#xff1…

3. 分布式链路追踪的链路日志设计

前言 分布式链路追踪的客户端实现中&#xff0c;我们会通过各种手段和规则得到一个又一个的Span&#xff0c;得到这些Span后&#xff0c;需要在分布式链路追踪的服务端这边汇总这些Span并拼接出一条请求链路&#xff0c;那么这里就存在一个问题&#xff0c;客户端得到的Span如…

vue脚手架和vite创建的项目的环境配置

开发环境文件 .env.development NODE_ENV"development" # // 开发接口域名 本地测试就用这个 # vue脚手架创建的 VUE_APP_MODE"开发环境" VUE_APP_API_URL http://19527 # vite创建的 # VITE_MODE"开发环境" # VITE_BASE_URL http://1920:9527…

【自动驾驶|毫米波雷达】初识毫米波雷达射频前端硬件

第一次更新&#xff1a;2024/5/4 目录 整体概述 混频器&#xff08;MIXER&#xff09; 低通滤波器&#xff08;LPF&#xff1a;Low-Pass filter&#xff09; 数模转换器&#xff08;ADC&#xff1a;Analog to Digital Converter&#xff09; 毫米波雷达功能框图 整体概述 完…

开源go实现的iot物联网新基建平台

软件介绍 Magistrala IoT平台是由Abstract Machines公司开发的创新基础设施解决方案&#xff0c;旨在帮助组织和开发者构建安全、可扩展和创新的物联网应用程序。曾经被称为Mainflux的平台&#xff0c;现在已经开源&#xff0c;并在国际物联网领域受到广泛关注。 功能描述 多协…

如何利用AI提高内容生产效率

一&#xff1a;简介 通过AI技术可以在内容生产过程中提升效率和质量&#xff0c;以下是一些方法和应用场景&#xff1a; 1. 自动化内容生成&#xff1a; 自然语言生成&#xff08;NLG&#xff09;&#xff1a;通过AI技术&#xff0c;可以自动生成文章、报告、产品描述等文…

原型模式类图与代码

现要求实现一个能够自动生成求职简历的程序&#xff0c;简历的基本内容包括求职者的姓名、性别、年龄及工作经历。希望每份简历中的工作经历有所不同&#xff0c;并尽量减少程序中的重复代码。 采用原型模式(Prototype)来实现上述要求&#xff0c;得到如图 7.25 所示的类图。 原…

如何完美解决Outlook大文件传送问题,提升办公协作效率?

在日常工作中&#xff0c;邮件是一种常用的通信方式&#xff0c;经常用来发送各类文件&#xff0c;比如报告和文档、合同和协议、财务报表、营销资料、设计文件等。但有时文件会比较大&#xff0c;因此Outlook大文件传送时&#xff0c;会遇到附件大小受限的情况。常用的解决发送…

Sqlmap的使用

Sqlmap URL 检测 sqlmap直接对单一的url探测&#xff0c;参数使用-u或--url payload&#xff1a;sqlmap -u "http://192.168.10.1/sqlilabs/sqli-labs-php7-master/Less-1/?id1" --banner 注意&#xff1a;如果进入这个页面要先登录那么就需要把cookie带上 sqlm…

【MsSQL】数据库基础 库的基本操作

目录 一&#xff0c;数据库基础 1&#xff0c;什么是数据库 2&#xff0c;主流的数据库 3&#xff0c;连接服务器 4&#xff0c;服务器&#xff0c;数据库&#xff0c;表关系 5&#xff0c;使用案例 二&#xff0c;库的操作 1&#xff0c;创建数据库 2&#xff0c;创建…

【代码分享】使用HTML5的Canvas绘制编码说明图片

最急在工作中遇到一个需求&#xff0c;根据给定的编码生成编码说明&#xff0c;像下面这样的效果。 不同含义的编码用横杠分割&#xff0c;然后每个编码下面用箭头指明具体的含义。下面是我使用canvas实现的代码。具体的编码宽度大家可以根据实际情况进行调整&#xff0c;目前…

未授权访问:Redis未授权访问漏洞

目录 1、漏洞原理 2、环境搭建 3、未授权访问 4、利用redis未授权写入weshell 5、利用redis未授权反弹shell 6、利用redis未授权实现免密登录 防御手段 从这篇文章开始我就要开始学习各种未授权访问的知识和相关的实操实验了&#xff0c;一共有好多篇&#xff0c;内容主…

Python实现txt转Excel(坐标)

import pandas as pddef txt_to_excel(txt_file, excel_file):# 读取 txt 文件with open(txt_file, r) as f:lines f.readlines()# 将每行数据分割成多个单元格data []for line in lines:row line.strip().split( )data.append(row)# 将数据保存到 Excel 文件df pd.DataFra…