UART、TIMER

news2024/11/24 3:42:19

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_TX
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1); //PA10复用为USART1_RX

    /* USART1端口配置 */
    GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_9 | GPIO_Pin_10;  //GPIOA9与GPIOA10
    GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_AF;              //复用功能
    GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;          //速度50MHz
    GPIO_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.coloradmin.cn/o/1651781.html

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

相关文章

谷歌开源!用 js 编写 Shell 脚本! | 开源日报 No.247

google/zx Stars: 41.4k License: Apache-2.0 zx 是一个用于编写更好脚本的工具。 提供有用的包装器&#xff0c;简化了对 child_process 的操作转义参数并提供合理的默认值使用 JavaScript 编写复杂脚本时比 Bash 更方便可以直接使用 npm 安装 dani-garcia/vaultwarden St…

72207-80-8,Epoxide-PEG-Epoxide是一种具有两个环氧基团的线性双功能PEG(聚乙二醇)试剂

【试剂详情】 英文名称 Ep-PEG-Ep&#xff0c;Epoxide-PEG-Epoxide 中文名称 环氧基-聚乙二醇-环氧基&#xff0c;聚乙二醇二缩水甘油醚 CAS号 72207-80-8 外观性状 由分子量决定&#xff0c;固体或者液体。 分子量 0.4k&#xff0c;0.6k&#xff0c;1k&#xff0c;2k…

(自适应手机端)物流运输快递仓储网站模板 - 带三级栏目

(自适应手机端)物流运输快递仓储网站模板 - 带三级栏目PbootCMS内核开发的网站模板&#xff0c;该模板适用于物流运输网站、仓储货运网站等企业&#xff0c;当然其他行业也可以做&#xff0c;只需要把文字图片换成其他行业的即可&#xff1b;自适应手机端&#xff0c;同一个后台…

CSS-背景属性

目录 背景属性 background-color (背景颜色 ) background-image (背景图片 ) background-repeat (背景图平铺方式 ) no-repeat 不平铺 repeat-x 水平方向平铺 repeat-y 垂直方向平铺 repeat 平铺 background-position (背景图位置) background-size (背景缩…

电脑内存不足怎么清理?教你3招轻松解决

电脑内存不足是影响电脑性能的常见问题之一&#xff0c;它会导致电脑运行缓慢、应用程序响应迟钝等情况。为了解决这个问题&#xff0c;需要对电脑内存进行清理和优化。本文将介绍电脑内存不足怎么清理的三种方法&#xff0c;帮助您提高电脑性能。 方法1&#xff1a;清理临时文…

一文搞懂SSL证书收费与免费选择攻略

在互联网技术高速发展的今天&#xff0c;网络安全问题已经成为企业和个人不可忽视的重要议题。SSL&#xff08;Secure Sockets Layer&#xff09;证书&#xff0c;作为一种安全协议&#xff0c;能够为网站提供加密通信&#xff0c;确保数据的传输过程中不被窃取或篡改&#xff…

荟敏堂·中医优势专科建设新质生产力发展论坛在京召开

原题&#xff1a;《荟敏堂中医优势专科建设新质生产力发展论坛在京召开——周超凡中医治则学思想传承研讨会成功举办》 会议现场照片 仟江水商业电讯&#xff08;5月8日 北京 委托发布&#xff09;日前&#xff0c;周超凡中医治则学思想传承研讨会暨中医优势专科建设新质生产力…

HTTP免费升级到HTTPS攻略

HTTPS就是在HTTP的基础上加入了SSL&#xff0c;将一个使用HTTP的网站免费升级到HTTPS的关键就是申请一个免费的SSL证书 具体步骤如下 1 获取免费SSL证书 国内的JoySSL 提供不限量免费的SSL/TLS证书。根据自己的需求选择证书类型&#xff08;登录JoySSL官网&#xff0c;创建账号…

如何看待2024数维杯?

一、赛事介绍 美赛结束后,2024年又一场高含金量数模竞赛开始报名啦!数维杯每年上半年为数维杯国赛(5月,俗称小国赛),下半年为数维杯国际赛(11月),累计参赛高校千余所,参赛人数超14万人,经过八年多的发展,已成为继数学建模国赛和美赛之后的第三大全国性数学建模赛事,…

UE灯光:点光和聚光灯的强度单位(cd、lm)

在虚幻引擎&#xff08;UE&#xff09;中&#xff0c;点光和聚光灯的光强使用两种不同的单位进行度量&#xff1a; 坎德拉&#xff08;cd&#xff09;&#xff1a;坎德拉是光强度的国际单位&#xff08;SI单位&#xff09;。它代表光源在特定方向上每单位立体角发出的光通量。…

融知财经:期权期货及其他衍生产品

期权、期货及其他衍生产品是金融市场中用于管理风险和进行投机的金融工具。这些衍生产品的价值依赖于一个或多个基础资产&#xff0c;如股票、商品、利率、汇率等。以下是关于这些衍生产品的一些基本介绍&#xff1a; 1、期货&#xff08;Futures&#xff09;&#xff1a;期货是…

亚马逊夏季热销爆款盘点!2024跨境选品出海风向看这里!

随着夏日的脚步渐近&#xff0c;夏季购物热潮即将掀起。这正是我们更新产品列表、上架最热门夏季商品的绝佳时机。基于对2023年夏季亚马逊销售数据的深入分析&#xff0c;预测以下这些商品在2024年夏天依然极有可能成为跨境卖家热销爆品。 一、女士夏季连衣裙 首先&#xff0…

浅谈ps/2键盘

文章目录 说明基础知识操作系统中断类型工作机制优点应用 CPU对IO设备的轮询机制轮询机制的工作原理轮询机制的特点轮询机制的优、缺点与中断机制的对比 N-Key Roller&#xff08;全键无冲&#xff09;应用领域实现原理技术限制 PS/2接口简介USB设备&PS/2设备的工作机制PS/…

XSS、CSRF、SSRF漏洞原理以及防御方式_xss csrf ssrf

这里写目录标题 XSS XSS攻击原理&#xff1a;XSS的防范措施主要有三个&#xff1a;编码、过滤、校正 CSRF CSRF攻击攻击原理及过程如下&#xff1a;CSRF攻击的防范措施&#xff1a; SSRF SSRF漏洞攻击原理以及方式SSRF漏洞攻击的防范措施 XMLXSS、CSRF、SSRF的区别 XSS、CSRF的…

MySQL mydumper工具

目录 1. mydumper介绍 2. mydumper参数解释 3. 备份例子 3.1 备份全库(未包含其他) 3.2 备份全库(包含其他) 3.3 备份指定数据库(-B或--database) 3.4 导出指定表(-T或--tables-list) 3.5 只导出表结构&#xff0c;不导出表数据(-d或--no-data) 3.6 只导出表数据&#…

Cloudera的简介及安装部署

简介 Cloudera是一家位于美国的软件公司&#xff0c;成立于2008年&#xff0c;专注于为企业客户提供基于Apache Hadoop的软件、支持、服务以及培训。Cloudera的开源Apache Hadoop发行版&#xff0c;即Cloudera Distribution including Apache Hadoop&#xff08;CDH&am…

新能源汽车充电站智慧充电电能服务综合解决方案

安科瑞薛瑶瑶18701709087/17343930412 ★解决方案 ✔目的地充电-EMS微电网平台 基于EMS解决方案从设备运维的角度解决本地充电的能量管理及运维问题&#xff0c;与充电管理平台打通数据&#xff0c;为企业微电网提供源、网、荷、储、充一体化解决方案。 ✔运营场站--电能服务…

07_Flutter使用NestedScrollView+TabBarView滚动位置共享问题修复

07_Flutter使用NestedScrollViewTabBarView滚动位置共享问题修复 一.案发现场 可以看到&#xff0c;上图中三个列表的滑动位置共享了&#xff0c;滑动其中一个列表&#xff0c;会影响到另外两个&#xff0c;这显然不符合要求&#xff0c;先来看下布局&#xff0c;再说明产生这个…

深圳车间厂房降温用什么设备好?

环保水空调&#xff08;也被称为水冷空调或蒸发式降温换气机组&#xff09;的特点主要体现在以下几个方面&#xff1a; 节能环保&#xff1a;环保水空调使用水作为冷媒介&#xff0c;相比传统空调的制冷方式&#xff0c;它能在制冷过程中节约更多的能源&#xff0c;减少碳排放…

测评工作室的养号成本,效率,纯净度,便捷性等问题怎么解决?

大家好&#xff0c;我是南哥聊跨境&#xff0c;最近有很多做测评工作室的朋友找到南哥&#xff0c;问我有什么新的测评养号系统可以解决成本&#xff0c;效率&#xff0c;纯净度&#xff0c;便捷性等问题 测评养号系统从最早的模拟器、虚拟机到911、VPS、手机设备等&#xff0…