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.mzph.cn/bicheng/8114.shtml

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

相关文章

JavaScript:正则表达式属于字符串吗-不属于/字符串转正则表达式的两种方法

一、需求描述 js 字符串转正则表达式 二、理解正则表达式属于字符串吗? 正则表达式不属于字符串&#xff0c;它是一种用于匹配、查找和操作文本的模式。正则表达式是一种特殊的语法&#xff0c;用于描述字符串的特征。通过使用正则表达式&#xff0c;可以检查一个字符串是否…

SGP.22-V.3.1-安全2

有任何关于GSMA\IOT\eSIM\RSP\业务应用场景相关的问题&#xff0c;欢迎W: xiangcunge59 一起讨论, 共同进步 (加的时候请注明: 来自CSDN-iot). InitialiseSecureChannel 在 SGP.22 v3.1 技术规范的第 2.5.4.1 节 "Description of InitialiseSecureChannel Block"…

刷题之最爱的城市(卡码网,图论)

最爱的城市 #include<vector> #include<climits> #include<iostream> using namespace std; int path 0; void dfs(vector<vector<int>>& city, vector<bool>& visited, int city2, int startindex, int* result) {if (startinde…

[数据概念|方案实操][最新]数据资产入表4月速递

“ 在各地数据资产变现“热辣滚烫”” 国家数据局全国数据工作会议前后&#xff0c;数据资源“入表”的尝试在各地持续热火朝天地展开&#xff0c;多地实现数据资产入表和利用数据资产进行融资实现“零的突破”。 我们今天就把4月前后的案例做一个小结&#xff0c;之前的案例大…

linux / uboot一些编译调试命令

//声明环境变量 export PATH/home/fmsh/ft/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH export CROSS_COMPILEaarch64-linux-gnu- export ARCHarm64 export CCaarch64-linux-gnu-gcc //编译 make xxx_defconfig make menuconfig make -j8 //设置uboot启动参…

自然语言处理(NLP)技术及举例说明

自然语言处理&#xff08;NLP&#xff09;技术是一种人工智能技术&#xff0c;在处理人类自然语言的文本或语音时&#xff0c;可以帮助计算机理解、解释和生成语言。 以下是一些常见的自然语言处理技术的例子&#xff1a; 机器翻译&#xff1a;机器翻译技术可以将一种语言的文…

基于大数据+Hadoop的豆瓣电子图书推荐系统实现

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列文章目录 基于大数…

Pascal Content数据集

如果您想使用Pascal Context数据集&#xff0c;请安装Detail&#xff0c;然后运行以下命令将注释转换为正确的格式。 1.安装Detail 进入项目终端 #即 这是在我自己的项目下直接进行克隆操作&#xff1a; git clone https://github.com/zhanghang1989/detail-api.git $PASCAL…

美联储官员卡什卡利:判断通胀是否停滞为时尚早,利率可能维持较长时间

美联储明尼阿波利斯联邦储备银行行长尼尔卡什卡利近日表示&#xff0c;美联储需要更多数据才能判断通胀是否已经停滞不前&#xff0c;现在就断言通胀进展已经停滞还为时过早。卡什卡利的言论表明&#xff0c;美联储在通胀方面保持谨慎态度&#xff0c;同时强调利率政策可能维持…

连通“数据”,让制造变“聪明”

说起数据智能&#xff0c;你第一时间想到的是什么呢&#xff1f;是科技感十足的智慧城市&#xff1f;还是炫酷的人工智能景象&#xff1f; 数据作为企业的战略资产越来越受到重视&#xff0c;从最初的数据协助业务协同&#xff0c;转化为数据驱动业务&#xff0c;数据驱动运营…

review (fgetc/fputc)(fscanf/fprintf)(fgets)(fread/fwrite/fseek)

fgetc 统计行号 23 FILE* fpfopen("./1.c","r");24 if(fp0)25 {26 perror("错误原因");27 return -1;28 }29 int count0;30 while(1)31 {32 char retvalfgetc(fp);33 if(retvalEO…

命名空间、C++的输入输出、缺省参数(默认参数)、函数重载

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

Utreexod:支持Utreexo累加器的比特币全节点

1. 引言 前序博客&#xff1a; Utreexo&#xff1a;比特币UTXO merkle tree proof以节约节点存储空间Utreexo&#xff1a;优化Bitcoin UTXO集合的基于哈希的动态累加器Zerosync&#xff1a;构建基于STARK的Bitcoin证明系统 Utreexod为&#xff1a; 支持Utreexo累加器的比特…

【数据库原理及应用】期末复习汇总高校期末真题试卷06

试卷 一、选择题 1&#xff0e; ________是长期存储在计算机内的有组织,可共享的数据集合. A.数据库管理系统 B.数据库系统 C.数据库 D.文件组织 1&#xff0e; 有12个实体类型&#xff0c;并且它们之间存在15个不同的二元联系&#xff0c;其中4个是1:1联系类型&#xff0c;5…

如何恢复回收站中被删除的文件?3个恢复策略,实测有用!

“刚刚一不小心把回收站清空了&#xff0c;大家有什么好用的方法可以帮我恢复回收站中删除的文件吗&#xff1f;快帮帮我吧&#xff01;” 在使用电脑的过程中&#xff0c;我们有时可能会不小心将重要的文件或文件夹删除到回收站&#xff0c;并且随后可能进一步从回收站中彻底删…

羊大师分析,为什么羊奶是孩子的理想饮品?

羊大师分析&#xff0c;为什么羊奶是孩子的理想饮品&#xff1f; 羊奶&#xff0c;作为一种传统的营养饮品&#xff0c;近年来逐渐受到家长们的青睐&#xff0c;成为孩子们的理想饮品。那么&#xff0c;羊大师将为大家讲解&#xff0c;为什么羊奶能够赢得如此多的赞誉&#xf…

Redis 源码安装(CentOS 单机)

序言 本文给大家介绍如何在 CentOS 上&#xff0c;通过 Redis 源码单机部署 Redis 服务。 一、部署流程 通过官网下载源码 # 下载源码 wget https://download.redis.io/redis-stable.tar.gz# 解压源码包 tar -xzvf redis-stable.tar.gz在 linux 中执行以下命令&#xff0c;安…

Unity3D DOTween

简单介绍一下 DOTween 插件的使用。 导入插件 先到 Asset Store 获取 DOTween 插件&#xff0c;然后在 Package Manager 的 My Assets 中搜索&#xff0c;下载并导入插件。 导入后&#xff0c;会自动弹出一个窗口&#xff0c;提示需要先对插件进行配置。 点击上图中的按钮&am…

IDEA 插件,提高开发效率

AI 编程助手&#xff1a; 通义灵码: 搜索 tongyi 安装 fitten code: 搜索 fitten code 安装 其他&#xff1a; Alibaba Java Coding Guidelines&#xff1a;阿里巴巴代码规范 Mybatis log free&#xff1a;mybatis 日志助手能拼接带参数的完整sql Save Actions &#xff1a;代…

深度解析互联网医疗源码:视频问诊APP开发技术剖析

视频问诊APP作为在线医疗其中的重要一环&#xff0c;正在改变人们就医的方式。今天&#xff0c;我将为大家详解互联网医疗源码&#xff0c;探讨视频问诊APP开发技术&#xff0c;揭示其背后的原理和关键技术。 一、视频问诊APP的基本功能 视频问诊APP作为一种新型的医疗服务平台…