正点原子-Linux嵌入式开发学习-第二期03

news2024/11/19 0:35:07

第九讲:模仿STM32驱动开发实验

 

前言:在02中我们学习的如何使用C语言的知识去编写代码,并且是直接定义寄存器地址的。你自己回想一下,stm32的库文件是这样的吗?当然不是,它是继续封装了地址,把寄存器封装为结构体使用,我们需要打开stm32库文件,关于寄存器地址定义的在#include "stm32f10x_it.h" 文件中

寄存器结构体封装-以GPIO寄存器为例

下面的5张图表示的就是寄存器封装的过程

 

 

 

 封装步骤:

                1:把数据类型重定义一下,像stm32一样的

                2:把所有的寄存器开始封装,根据结构体地址递增的特点,如果发现地址不连续,那么随便定义一个变量占就可以了,如果是多个就使用数组占

                3:定义各个外设的基地址,如GPIO1的基地址

                 

#define GPIO1_BASE                  (0x0209C000)

/* 
 * GPIO寄存器结构体
 */
typedef struct 
{
	volatile unsigned int DR;							
	volatile unsigned int GDIR; 							
	volatile unsigned int PSR;								
	volatile unsigned int ICR1; 							
	volatile unsigned int ICR2; 							 
	volatile unsigned int IMR;								 
	volatile unsigned int ISR;			
	volatile unsigned int EDGE_SEL;  
}GPIO_Type;

#define GPIO1				((GPIO_Type *)GPIO1_BASE)

 工程汇编文件书写

这里的汇编代码书写,与前面的有所不同,不同的就是:我们手动清零bss段的数据

看到前一节的链接脚本的书写

 .word表示的意思是占位的意思,类似于int也是占了2/4个字节的位置

 

 把起始和结束地址保存在寄存器中,这里涉及到了另外几个汇编-stmia、cmp、ble

这里的mov可以改成ldr吗?你可以尝试一下

/* 清BSS段 */
	ldr r0, _bss_start
	ldr r1, _bss_end
	mov r2,  #0
bss_loop:
	stmia r0!, {r2}		/* 向r0的地址写入0,然后r0寄存器保存的地址值加1 */
	cmp r0, r1  		/* 比较r0和r1,也就是__bss_start和__bss_end的值*/
	ble bss_loop		/* 如果小于等于的话就跳转到bss_loop继续清bss段*/

 C代码编写

void led_init(void)
{
	/* 1、初始化IO复用 */
	IOMUX_SW_MUX->GPIO1_IO03 = 0X5;		/* 复用为GPIO1_IO03 */


	/* 2、配置GPIO1_IO03的IO属性	
	 *bit 16:0 HYS关闭
	 *bit [15:14]: 00 默认下拉
     *bit [13]: 0 kepper功能
     *bit [12]: 1 pull/keeper使能
     *bit [11]: 0 关闭开路输出
     *bit [7:6]: 10 速度100Mhz
     *bit [5:3]: 110 R0/6驱动能力
     *bit [0]: 0 低转换率
     */
    IOMUX_SW_PAD->GPIO1_IO03 = 0X10B0;


	/* 3、初始化GPIO */
	GPIO1->GDIR = 0X0000008;	/* GPIO1_IO03设置为输出 */
	GPIO1->GDIR = 9;
	/* 4、设置GPIO1_IO03输出低电平,打开LED0 */	
	GPIO1->DR &= ~(1 << 3);	
	
}

Makefile编写

其实这里的-Wall -nostdlib -c -o2也可以写到一起

 第十讲NXP官方SDK使用

前言:

在第九讲我们完成了模仿stm32的驱动方式完成我们的LED点灯工程,我们手动添加了我们需要的寄存器地址并且定义和使用(使用方式为:stm32的使用方式),但是我们知道6ULL有很多的寄存器因此我们不可能一个一个自己这样添加,但是好的就是NXP官方已经帮我们搞好了这些,因此本讲的内容就是选择性的使用NXP官方提供的SDK并且移植到我们的工程中去

但是实际上对于以后的开发,很少有芯片会有这种配套的SDK给我们使用,我们一般也不会使用官方提供的库和bsp,因为我们的驱动但是直接操作寄存器的,不使用哪些库(这是视频zzk讲的,现在我还没有理解,留个印象)

移植后,我们需要改动,至于怎么改动?视频没讲为什么,直接操作了,并且在讲解移植的时候,出现了问题(原因是:文件乱码了,这个问题很容易遇到,我也经常遇到,在copy代码的时候),因此zzk建议我们不要移植nxp的,直接移植正点原子写好了的文件就可以了

主要内容:移植的两个函数讲解

IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03,0);

IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03,0X10B0);

static inline void IOMUXC_SetPinMux(uint32_t muxRegister,

                                    uint32_t muxMode,

                                    uint32_t inputRegister,

                                    uint32_t inputDaisy,

                                    uint32_t configRegister,

                                    uint32_t inputOnfield)

static inline void IOMUXC_SetPinConfig(uint32_t muxRegister,

                                       uint32_t muxMode,

                                       uint32_t inputRegister,

                                       uint32_t inputDaisy,

                                       uint32_t configRegister,

                                       uint32_t configValue)

原型和使用你会发现我使用的只有两个形参,我们写错了吗?

#define IOMUXC_GPIO1_IO03_GPIO1_IO03                         0x020E0068U, 0x5U, 0x00000000U, 0x0U, 0x020E02F4U

Mux表示的是复用寄存器,config表示的是功能模式的(比如上下拉速度之类的)

其实是IOMUXC_GPIO1_IO03_GPIO1_IO03表示的是5个参数

 *((volatile uint32_t *)configRegister) = configValue;

配置输出和电平还是单独使用寄存器配置的

/* 3、初始化GPIO,设置GPIO1_IO03设置为输出  */

    GPIO1->GDIR |= (1 << 3);    

   

    /* 4、设置GPIO1_IO03输出低电平,打开LED0 */

    GPIO1->DR &= ~(1 << 3);      

Makefile书写

这次的Makefile书写比上一次的又升级了?=的使用,其实我感觉有点多余了

CROSS_COMPILE ?= arm-linux-gnueabihf-
NAME		  ?= ledc

CC 		:= $(CROSS_COMPILE)gcc
LD		:= $(CROSS_COMPILE)ld
OBJCOPY := $(CROSS_COMPILE)objcopy
OBJDUMP := $(CROSS_COMPILE)objdump
TEMP    := -Wall -nostdlib -c -O2 -o
OBJS 	:= start.o main.o

$(NAME).bin:$(OBJS)
	$(LD) -Timx6ul.lds -o $(NAME).elf $^
	$(OBJCOPY) -O binary -S $(NAME).elf $@
	$(OBJDUMP) -D -m arm $(NAME).elf > $(NAME).dis

%.o:%.s
	$(CC) $(TEMP) $@ $<
	

	
%.o:%.c
	$(CC) $(TEMP) $@ $<
	
clean:
	rm -rf *.o $(NAME).bin $(NAME).elf $(NAME).dis

 

目录

第九讲:模仿STM32驱动开发实验

寄存器结构体封装-以GPIO寄存器为例

 工程汇编文件书写

 C代码编写

Makefile编写

 第十讲NXP官方SDK使用

前言:

主要内容:移植的两个函数讲解

Makefile书写



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

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

相关文章

ACL介绍

ACL 中文&#xff1a;访问控制列表 介绍&#xff1a; ACL 是网络当中策略的一种&#xff0c;策略&#xff1a;我们之前学的内容只够我们把网络连通&#xff0c;但网络不仅仅是能连通那么简单&#xff0c;在保证网络能连通的基础上&#xff0c;应该还有更高一层的追求&#xf…

地统计插值学习心得(二)

简介 交叉验证是一种“留一”法,可用于确定插值模型与数据的拟合程度。交叉验证从数据集中移除一个点,并使用剩余的所有其他点来预测被移除点的位置。预测值随后与测量值进行比较,并生成大量统计数据 来确定预测的准确性。 交叉验证窗格可以用于展示并评价插值模型的执行效…

Redis持久化之RDB

Redis持久化之RDB1.RDB&#xff08;Redis DataBase&#xff09;1.1 RDB是什么1.2 dump.rdb文件1.3Redis启动方式1.4 配置文件中默认快照配置1.5 命令save VS bgsave1.6 RDB举例1.7 stop-writes-on-bgsave-error1.8 rdbchecksum 检查完整性2.持久化如何执行的2.1 流程优势劣势1.…

【小学信息技术教资面试】《生活在信息中》教案

题目&#xff1a;生活在信息中内容&#xff1a; 基本要求&#xff1a; &#xff08;1&#xff09;说出信息的不同表现形式及信息在生活中的应用。 &#xff08;2&#xff09;教学中注意师生间的交流互动。 &#xff08;3&#xff09;十分钟之内完成试讲。 《生活在信息中》教…

【学习笔记04】生命周期的钩子函数

目录一、生命周期的钩子函数二、创建阶段三、挂载阶段四、父子组件创建和挂载阶段钩子函数的执行次序五、更新阶段六、销毁阶段七、复习和补充1、MVVM2、v-for中的key值3、$nextTick一、生命周期的钩子函数 在组件的生命周期的过程中自动的调用的函数&#xff0c;叫做生命周期…

C++进阶 多态讲解

作者&#xff1a;小萌新 专栏&#xff1a;C进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;简单介绍C中多态的概念 多态多态的概念多态的定义及实现多态的构成条件虚函数虚函数的重写虚函数重写的两个例外协变析构函数的重写C11…

【ML】numpy meshgrid函数使用说明(全网最简单版)

【ML】numpy meshgrid函数使用说明meshgrid的作用&#xff1f;怎么使用&#xff08;举例说明&#xff09;手工描点&#xff08;帮助理解&#xff09;怎么画三维&#xff1f;附画图代码meshgrid的作用&#xff1f; 首先要明白numpy.meshgrid()函数是为了画网格&#xff0c;&…

Systemverilog实现参数化的Round-Robin Arbiter Tree

本篇内容涉及的rtl代码为开源组织PLUP的common cell仓库中的源代码&#xff0c;本文只是对其进行些许解读。源码链接如下&#xff1a;[https://github.com/pulp-platform/common_cells/blob/dc555643226419b7a602f0aa39d449545ea4c1f2/src/rr_arb_tree.sv] “想要快速提升编程能…

基于springboot的公司人事管理系统

1 简介 今天向大家介绍一个帮助往届学生完成的毕业设计项目&#xff0c;公司人事管理系统。 计算机毕业生设计,课程设计需要帮助的可以找我 源码获取------》 链接&#xff1a;https://pan.baidu.com/s/1CdxrlV7GeRRmsT9UWEMtJg 提取码&#xff1a;cygy 2 设计概要 21世纪…

测试人不得不知的 HTTP 状态码知识

HTTP协议是当前使用最广泛的一种通信协议&#xff0c;在性能测试中&#xff0c;也使用的非常广泛。但是&#xff0c;确有很多人在调试性能测试脚本的时候&#xff0c;弄不明白HTTP状态码&#xff0c;不能通过HTTP状态码做些基本判断&#xff0c;今天&#xff0c;就来给大家好好…

客户终身价值(CLTV)计算和回归预测模型(Python)

内容介绍 本文整理了客户终身价值&#xff08;CLV或者CLTV&#xff09;的相关概念&#xff0c;并对一家英国线上零售公司的一年交易数据进行分析&#xff0c;计算该公司所有客户的CLV并且建立回归预测模型。 一、客户生命周期价值 用户生命周期价值Customer Lifetime value(…

常见实用的锁策略详解

&#x1f388;专栏链接:多线程相关知识详解 目录 1.乐观锁VS悲观锁 2.读写锁VS普通互斥锁 3.轻量级锁VS重量级锁 4.自旋锁VS挂起等待锁 5. 公平锁VS非公平锁 6.可重入锁VS不可重入锁 7.关于synchronized的锁策略以及自适应 1.乐观锁VS悲观锁 乐观锁:预测锁…

Windows中安装配置RabbitMQ

本次安装环境win10&#xff0c;采用版本 OTP 25.0.3https://github.com/erlang/otp/releases/tag/OTP-25.0.3RabbitMQ 3.10.13 Release RabbitMQ 3.10.13 rabbitmq/rabbitmq-server GitHubOpen source RabbitMQ: core server and tier 1 (built-in) plugins - Release Rabbi…

[N1CTF 2018]eating_cms parse_url绕过

index.php <?php require_once "function.php"; if(isset($_SESSION[login] )){Header("Location: user.php?pageinfo"); } else{include "templates/index.html"; } ?> function.php <?php session_start(); require_once &q…

Kafka Producer 自定义 拦截器 序列化

Kafka Producer 拦截器 & 序列化 前言 文章中的版本信息、maven依赖如下 JDK17 kafka_2.13-3.3.1 pom文件 <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>…

NR HARQ (四)Type-2 HARQ-ACK codebook

微信同步更新欢迎关注同名modem协议笔记 上篇提到type-1 HARQ-ACK codebook&#xff0c;即semi-static codebook&#xff0c;UE要为每个PDSCH候选位置生成反馈&#xff0c;也会包含实际没有下行传输的PDSCH&#xff0c;再加上配置CBG的场景&#xff0c;HARQ-ACK 码本中包含的无…

【Linux 内核 内存管理】物理内存组织结构

一、 UMA和NUMA两种模型 共享存储型多处理机有两种模型 一致内存访问&#xff08;Uniform-Memory-Access&#xff0c;简称UMA&#xff09;模型 非一致内存访问&#xff08;Nonuniform-Memory-Access&#xff0c;简称NUMA&#xff09;模型 UMA模型 物理存储器被所有处理器件均…

超标量处理器设计——第八章_发射

超标量处理器设计——第八章_发射 参考《超标量处理器》姚永斌著 文章目录超标量处理器设计——第八章_发射8.1 简述8.1.1 集中式 VS. 分布式8.1.2 数据捕捉 VS. 非数据捕捉8.1.3 压缩 VS. 非压缩8.2 发射过程的流水线8.2.1 非数据捕捉结构的流水线8.2.2 数据捕捉结构的流水线8…

随手写系列——写一个凯撒密码转换页面

文章目录先展示效果H5编写C3编写JS编写——方法一&#xff1a;过程版JS编写——方法二&#xff1a;对象版代码获取先展示效果 &#xff08;因为主要是实现功能&#xff0c;所以CSS写的很粗糙&#xff09; H5编写 基础结构如下&#xff1a; 先构成最外面的大盒子.box&#…

【Flutter】之便于提高开发效率的周边库和轮子

GetX 状态管理 GetX包含很多功能&#xff0c;各种弹出widget、路由管理、国际化、Utils、状态管理等。 基于路由管理 1. 添加到项目中 1.1. 将此添加到pubspec.yaml文件中。 get: 4.1.4 1.2. 在命令行中运行 flutter packages get 1.3. 在MaterialApp前面加上 “Get”&…