定时器、PWM定时器、UART串口通信

news2025/2/7 22:03:48

我要成为嵌入式高手之4月15日ARM第八天!!
————————————————————————————

定时器

        S3C2440A 有 5 个 16 位定时器。其中定时器 0、1、2 和 3 具有脉宽调制(PWM)功能。定时器 4 是一个无 输出引脚的内部定时器。定时器 0 还包含用于大电流驱动的死区发生器。

使用s3c2440的时钟4实现1毫秒的定时

定时器配制寄存器 0(TCFG0)

预分频寄存器

定时器配制寄存器 1(TCFG1)

分频寄存器

定时器输入时钟频率 = PCLK / {预分频值+1} / {分频值}

                                {预分频值} = 0~255

                                {分频值} = 2, 4, 8, 16

定时器控制寄存器 1(TCON)

定时器 4 计数缓冲寄存器(TCNTB4)

对算出来的计数器值(2500)的备份

定时器 4 计数监视寄存器(TCNTO4)

很少用到

设置中断寄存器INTMOD、INTMSK

将中断寄存器设置为定时器4

void timer4_init(void)
{
	TCFG0 |= (19 << 8);//预分频值为4
	//TCFG1 |= (1 << 16);//分频值为4

	TCON |= (1 << 22);
	TCNTB4 = 2500;//设置计数的值
	TCON |= (1 << 21);
	TCON &= ~(1 << 21);//先置1再置0将计数值修改进去

	//打开中断
	INTMOD &= ~(1 << 14);
	INTMSK &= ~(1 << 14);
	
	TCON |= (1 << 20);//打开定时器
}

PWM定时器

多出一个比较寄存器,相当于 TCNTB 控制周期,TCMPB控制占空比

在此用蜂鸣器调制PWM

用GPB0实现周期400hz,占空比50%的方波

参数设置与定时器4差不多

此外还需要设置蜂鸣器GPIO

端口 B 控制寄存器(GPBCON)

int counter0 = 0;

void timer0_init(void)
{
	//设置蜂鸣器GPIO
	GPBCON |= (2 << 0);

	TCFG0 |= (9 << 0);//预分频值为10 = 5M
	TCFG1 |= (1 << 0);//分频值为4 = 1.25M

	TCON |= (1 << 22);
	TCNTB0 = 3125;//设置计数的值 = 400HZ
	TCNTB0 = 3125 / 2;//设置占空比为50%
	
	TCON |= (1 << 3) | (1 << 2);//(1 << 2)由高电平开始
	TCON |= (1 << 1);
	TCON &= ~(1 << 1);//先置1再置0将计数值修改进去

	//打开中断
	INTMOD &= ~(1 << 10);
	INTMSK &= ~(1 << 10);
	
	TCON |= (1 << 0);//打开定时器
}

int timer0_handle(void)
{
	++counter0;
	if (counter0 >= 1000)
	{
		ledAllNor();
		counter0 = 0;
	}		
}

UART串口通信

        S3C2440A 的每个 UART 包括 7 种状态(Tx/Rx/错误)信号:溢出错误、奇偶校验错误、帧错误、断点、接收 缓冲器数据就绪、发送缓冲器空以及发送移位器空,全部都由相应 UART 状态寄存器(UTRSTATn/UERSTATn) 标示。

我们主要用到接收缓冲区数据中断

外设总线:APB

要发送的数据先写入发送缓冲区,然后通过发送移位器一个字节一个字节发;接收亦如此


UART 方框图(带 FIFO)

        

        波特率时钟是通过 16 和由 UART 波特率分频寄存器(UBRDIVn)指定的 16 位分频系数来分频源时钟(PCLK,FCLK/n 或 UEXTCLK)产生的。 UBRDIVn 由下列表达式决定:

UBRDIVn = (int)( UART 时钟 / ( 波特率 × 16) ) - 1

端口 H 控制寄存器(GPHCON,GPHDAT,GPHUP)

在此要将GPH2和GPH3设置为串口 发送 / 接收 模式

UART 线路控制寄存器(ULCON)

UART 控制寄存器(UCON)


在此不用管FCLK,选择PCLK

Tx发送中断类型:缓冲区一变成空,就产生中断

Rx接收中断类型:设置为脉冲类型

……

UART TX/RX 状态寄存器

用来查询的

UART 发送缓冲寄存器(保持寄存器和 FIFO 寄存器)

发送数据时进行修改

UART 接收缓冲寄存器(保持寄存器和 FIFO 寄存器)

UART 波特率分频寄存器

要进行计算得出波特率

        波特率时钟是通过 16 和由 UART 波特率分频寄存器(UBRDIVn)指定的 16 位分频系数来分频源时钟(PCLK,FCLK/n 或 UEXTCLK)产生的。 UBRDIVn 由下列表达式决定:

UBRDIVn = (int)( UART 时钟 / ( 波特率 × 16) ) - 1

例如,如果波特率为 115200 bps 并且 UART 时钟为 40 MHz,UBRDIVn 为:

UBRDIVn = (int)(40000000 / (115200 x 16) ) - 1

                = (int)(21.7) - 1 [取最接近的整数]

                = 22 - 1 = 2

void uart0_init(void)
{
	unsigned int t;

	GPHCON |= (2 << 4) | (2 << 6);

	t = ULCON0;
	t &= ~(1 << 6);
	t &= ~(7 << 3);
	t &= ~(1 << 2);
	t |= (3 << 0);
	ULCON0 = t;

	t = UCON0;
	t &= ~(3 << 10);
	t &= ~((1 << 8) | (1 << 7) | (1 << 6) | (1 << 5) | (1 << 4));
	t |= (1 << 2) | (1 << 0);
	UCON0 = t;
	
	UBRDIV0 = 325;
}

发送一个字符: 

void uart0_send_char(unsigned char data)
{
	UTXH0 = data;
	while ((UTRSTAT0 & (1 << 1)) == 0);
	//查询TX寄存器是否为0,为0表示发送完毕,非0表示还在发送,需要等待发送完毕
}

发送字符串:

void uart0_send_buffer(unsigned char *p, unsigned int len)
{
	int i = 0;

	for (i = 0; i < len; ++i)
	{
		uart0_send_char(*p++);	
	}
}

数据接收

首先需要打开中断

中断模式(INTMOD)寄存器

中断屏蔽(INTMSK)寄存器

次级源挂起(SUBSRCPND)寄存器

中断次级屏蔽(INTSUBMSK)寄存器

对于接收放需要打开INT_RXD0

中断偏移(INTOFFSET)寄存器

接收到的数据要从接收缓存区读取

UART 接收缓冲寄存器(保持寄存器和 FIFO 寄存器)

void uart0_init(void)
{
	unsigned int t;

	//将GPIO端口设置为串口
	GPHCON |= (2 << 4) | (2 << 6);

	//设置串口线路控制寄存器
	t = ULCON0;
	t &= ~(1 << 6);
	t &= ~(7 << 3);
	t &= ~(1 << 2);
	t |= (3 << 0);
	ULCON0 = t;

	//设置控制寄存器
	t = UCON0;
	t &= ~(3 << 10);
	t &= ~((1 << 8) | (1 << 7) | (1 << 6) | (1 << 5) | (1 << 4));
	t |= (1 << 2) | (1 << 0);
	UCON0 = t;
	
	//设置波特率
	UBRDIV0 = 325;

	//设置中断
	INTMOD &= ~(1 << 28);
	INTMSK &= ~(1 << 28);
	INTSUBMSK &= ~(1 << 0);
}
unsigned char rcvBuffer[256];
unsigned int pos;

void uart0_handle(void)
{
	if ((SUBSRCPND & (1 << 0)) != 0)
	{
		rcvBuffer[pos++] = URXH0;	
	}
	SUBSRCPND = SUBSRCPND;
}

main.c

int main(void)
{	
	wdt_init();
	clock_init();
	led_init();
	uart0_init();	

	pos = 0;
	while (1)
	{
		if (pos != 0)
		{
			delay(0x3FFFF);
			uart0_send_buffer(rcvBuffer, pos);
			pos = 0;
		}
	}
}	

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

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

相关文章

电商技术揭秘二十五:电商平台的智能库存管理与优化

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

【DM8】ET SQL性能分析工具

通过统计SQL每个操作符的时间花费&#xff0c;从而定位到有性能问题的操作&#xff0c;指导用户去优化。 开启ET工具 INI参数&#xff1a; ENABLE_MONITOR1 MONITOR_SQL_EXEC1 查看参数 select * FROM v$dm_ini WHERE PARA_NAMEMONITOR_SQL_EXEC;SELECT * FROM v$dm_ini WH…

Fiddler工具的操作和功能时-----定位到步骤图(助力抓包)

前言&#xff1a; 继续上一篇&#xff0c;已经对fiddler的安装、配置和代理的问题进行了讲解&#xff1a; Fiddle配置代理&#xff0c;保手机模拟器访问外部网络-CSDN博客 本章&#xff0c;讲对一些fiddler的操作进行一系列讲解&#xff01;Fiddler作为一款网络调试工具&…

小型时间继电器ST3PA-C DC24V 带插座PF085A 导轨安装 JOSEF约瑟

ST3P系列时间继电器 系列型号 ST3PF-2Z(JSZ3F-2Z) 5s AC110V ST3PF(JSZ3F) 10s AC48V ST3PC-1(AH3-3) 5s DC24V ST3PC-1(AH3-3) 2h AC220V ST3PC-F(JSZ3C-F) AC380V ST3PA-E(JSZ3A-E) DC24V ST3PA-F(JSZ3A-F) DC24V ST3PF(JSZ3F) 10s AC36V ST3PC-1(AH3-3) 10s AC24V ST3PC-1…

基于SSM+Jsp+Mysql的贝儿米幼儿教育管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

【包邮送书】MicroPython项目开发实战

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

读天才与算法:人脑与AI的数学思维笔记01_洛夫莱斯测试

1. 创造力 1.1. 创造力是一种原动力&#xff0c;它驱使人们产生新的、令人惊讶的、有价值的想法&#xff0c;并积极地将这些想法付诸实践 1.2. 创造出在表面上看似新的东西相对容易 1.3. 在遇到偶然间的创造性行为时&#xff0c;都会表现得异…

建立时间/保持时间为负是什么情况

目录 建立时间为负保持时间为负参考 在说明建立时间和保持时间为何为负的情况下&#xff0c;首先可以看看建立时间Tsu和保持时间Th的由来&#xff0c;可参考如下两篇文章&#xff1a; 建立时间和保持时间理解_为什么要满足建立时间和保持时间-CSDN博客 ic基础|时序篇&#xff…

分布式文件系统HDFS-1

文章目录 主要内容一.分布式文件系统HDFS1.定义2.优缺点3.原理4.设计思想及原则5.框架结构 6.HDFS的主要组件包括7.块、名称节点和数据节点8.HDFS冗余数据保存9.数据存取策略 总结 主要内容 HDFS 一.分布式文件系统HDFS 1.定义 HDFS&#xff08;Hadoop Distributed File Syst…

使用python在本地指定的目录临时模拟服务器(3),2024年最新网易 面经

先自我介绍一下&#xff0c;小编浙江大学毕业&#xff0c;去过华为、字节跳动等大厂&#xff0c;目前阿里P7 深知大多数程序员&#xff0c;想要提升技能&#xff0c;往往是自己摸索成长&#xff0c;但自己不成体系的自学效果低效又漫长&#xff0c;而且极易碰到天花板技术停滞…

二叉树的前、中、后序遍历【c++】

前序遍历&#xff1a;根左右 中序遍历&#xff1a;左根右 后序遍历&#xff1a;左右根 #include <iostream> #include <vector> using namespace std;//双链表节点结构 typedef struct treeNode {int value;struct treeNode* left;struct treeNode* right;treeNod…

Vue3(四):Pinia

一、Pinia介绍 Pinia是一个专门为Vue.js设计的状态管理库&#xff0c;它提供了一种简单和直观的方式来管理应用程序的状态。在使用Pinia时&#xff0c;可以轻松地创建定义状态的存储&#xff0c;然后将其与Vue组件绑定&#xff0c;使它们能够使用该状态。和上一个博客提到的Vu…

bestvike --bvframe学习

ref title fetch后台api 分页属性&#xff0c;pagination 要差几条&#xff1f;pagelimit 在api中写一个饭方法&#xff0c;vue中用用他 vue.cinfig.js中配置别名 nacos微服务 实体类要继承basedata&#xff08;封装了公共数据&#xff09; 控制器autowired&#xff0c;getm…

哈希函数的简单介绍

哈希函数&#xff1a; hash: 把....弄糟(乱) 又称为散列函数&#xff0c;杂凑函数 什么是哈希表&#xff1f; 哈希表简单来说可以看作是是对数组的升级&#xff0c;&#xff08;也有不少人认为哈希表的本质就是数组&#xff09;&#xff0c;那么哈希表和数组的具体联系和区…

每日OJ题_BFS解决最短路③_力扣127. 单词接龙

目录 ③力扣127. 单词接龙 解析代码 ③力扣127. 单词接龙 127. 单词接龙 难度 困难 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk&#xff1a; 每一对相邻的单词只差一个字母。…

ObjectMapper的具体介绍与使用

文章目录 声明一、前言二、ObjectMapper与JSONObject比较1、核心主要有三个部分&#xff1a;依赖包不同 2、ObjectMapper使用概述2.1、工程的pom.xml导包信息2.2、创建案例中的测试对象2.3、对象和JSON相互转化2.3.1、测试代码2.3.2、测试结果展示 2.4、集合和JSON像话转化2.4.…

简单的车牌号识别

目录 处理流程与界面各接口编写时遇到的一些问题上传图片识别结果标签显示中文 处理流程与界面 首先点击“上传图片”按钮&#xff0c;可以选择文件夹中含有汽车车牌的图片&#xff0c;并显示在“图片框”中。 点击“检测车牌”按钮&#xff0c;会先对“图片框”中即含有汽车车…

Spring Task 定时任务(含结合cron 表达式)

目录 一、Spring Task的介绍 二、使用方法 2.1 配置类启用定时任务支持&#xff1a; 2.2 同步定时任务 ​编辑2.3 fixedRate 可以看出不能满足我们的日常需求 那如何让其开启异步呢&#xff08;开启多个线程工作&#xff09; 三、Spring Task 结合cron表达式 3.1 corn 表…

FreGS:具有渐进频率正则化的3D高斯溅射

FreGS: 3D Gaussian Splatting with Progressive Frequency Regularization FreGS&#xff1a;具有渐进频率正则化的3D高斯溅射 Jiahui Zhang1  Fangneng Zhan2  Muyu Xu1  Shijian Lu1  Eric Xing3, 4 张家慧 1 詹方能 2 许慕玉 1 卢世坚 1 邢志伟 3, 4 1Nanyang Technolo…

Day23_学点儿IDEA_单元测试@Test在新module项目中失效、Jackson核心对象 ObjectMapper识别不到

版本 IntelliJ IDEA 2023.2.4 目录结构 Study(Project) ├──JavaSE(Module) │ └──xxxx └──JavaWeb(Module)└──xxxx问题 1.1 在JavaSE项目中正常可以用的单元测试Test&#xff0c;到了JavaWeb项目中不起作用了 1.2 解决方法 如果是新创建的项目&#xff0c;先…