C基础与SDK调试方法

REVIEW

上次学习了一下软件使用流程zynq PS点灯-CSDN博客

本次学习一下C编程基础与调试方法

 1.  硬件编程原理

小梅哥视频链接:

07_Xilinx嵌入式裸机硬件编程原理_哔哩哔哩_bilibili

对应的课程笔记:【zynq课程笔记】【裸机】【第7课 】【硬件编程原理】 - ACZ702开发板 - 芯路恒电子技术论坛 - Powered by Discuz! (corecourse.cn)

①典型GPIO结构

R1:方向/输出使能控制寄存器
R2:输出状态/数据寄存器
R3:输入状态/数据寄存器

②Zynq7000 GPIO结构

zynq PS端 GPIO-CSDN博客

GPIO控制的编程思路

初始化
根据GPIO对应位的工作场景,设置其方向、中断屏蔽位、中断检测类型。
工作
输入:若开启了中断,则编写中断处理函数;

           若不开启中断,则在需要的时候直接读取输入寄存器的值。
输出:则通过写数据寄存器或输出置位/清零寄存器来修改该位的输出值。

2.  寄存器操作

小梅哥视频:06_Zynq SoC嵌入式逻辑C编程基础_哔哩哔哩_bilibili

课程笔记:【zynq课程笔记】【裸机】【第6课 】【C编程基础】 - ACZ702开发板 - 芯路恒电子技术论坛 - Powered by Discuz! (corecourse.cn)

cpu编程,本质上就是对指定地址进行读写操作

视频课程用到的代码:实现让开发板上的PS_LED0亮灭

        端口为MIO7

场景分析:该场景下只需要简单的控制GPIO的对应位输出高低电平即可,用不到中断功能。
初始化
关闭中断
INT_DIS/ INT_EN:
这是一组作用于同一个功能的2个独立的寄存器,一个负责使能GPIO的每一位的中断,另一个负责禁止GPIO的每一位的中断。
本应用中,对应GPIO无需开启中断,所以设计时针对INT_DIS/ INT_EN寄存器,需要明确:
关闭某位中断该操作哪个寄存器,往该寄存器写0关闭中断,还是写1关闭中断。
根据UG585中的描述,对INT_DIS寄存器的对应位写1就可以禁止该位对应的IO产生中断。所以本例中初始化时,理论上需要对INT_DIS寄存器进行操作。设置MIO7对应的中断控制位不打开。
Data = (1<<7);
Xil_Out32(XPAR_PS7_GPIO_0_BASEADDR + XGPIOPS_INTDIS_OFFSET, Data);

#include "stdio.h"
#include "xparameters.h"
#include "xil_io.h"
#include "xgpiops.h"
#include "sleep.h"

int main(void)
{

        u32 reg_val = 0;
        u32 Data = 0;

                //设置方向和输出使能
                //OUTEN、DIRM寄存器

        //设置IO方向,bit7的方向为输出
        reg_val = Xil_In32(XPAR_PS7_GPIO_0_BASEADDR + XGPIOPS_DIRM_OFFSET);
        Data = reg_val | (1<<7);
        Xil_Out32(XPAR_PS7_GPIO_0_BASEADDR + XGPIOPS_DIRM_OFFSET ,  Data);

        //设置输出使能,bit7输出使能
        reg_val = Xil_In32(XPAR_PS7_GPIO_0_BASEADDR + XGPIOPS_OUTEN_OFFSET);
        Data = reg_val | (1<<7);
        Xil_Out32(XPAR_PS7_GPIO_0_BASEADDR + XGPIOPS_OUTEN_OFFSET, Data);

                 //设置方向和输出使能
                //OUTEN、DIRM寄存器

        由于是点亮LED,属于输出型GPIO,因此,根据GPIO的结构图知道,需要使output enable信号为高电平,以使能IO Pin上的三态缓冲器输出。

        而output enable为1的条件则是OUTENDIRM两个寄存器对应的位都为1
        由于这两个寄存器均是32位同时写入型,所以为了不干扰寄存器中其他位的值,

需要采用read-modify-write的操作顺序,也就是先读出,再修改,最后再写回。

        while(1)
        {

                //MASK_DATA寄存器
            //设置bit7输出1
            Data = ((~(1<<7)) << 16) | (1<<7);
            Xil_Out32(XPAR_PS7_GPIO_0_BASEADDR + XGPIOPS_DATA_LSW_OFFSET,  Data);
            usleep(1000000);//延时1000000us

            //设置bit7输出0
            Data = ((~(1<<7)) << 16) & (~(1<<7));
            Xil_Out32(XPAR_PS7_GPIO_0_BASEADDR + XGPIOPS_DATA_LSW_OFFSET,  Data);
            sleep(1);//延时1000000us
        }
        
        
        return 0;
}

                  //MASK_DATA寄存器

        写MASK_DATA寄存器时需要注意,对于每一个GPIO Bank,由MASK_DATA_LSWMASK_DATA_MSW两个寄存器组成,其中MASK_DATA_LSW控制该组GPIO中低16位的状态,MASK_DATA_MSW控制该组GPIO中高16位的状态。
        MASK_DATA的高16位中,哪些位为0,这些位对应的数据寄存器的值才允许被更新,更新的值由MASK_DATA寄存器的低16位来指定。

① bsp(board  support package)板级支持包

        用户编程时,可以使用该支持包中提供的驱动和函数,来避免自己编写应用函数和基于寄存器读写的驱动。

        由于这些驱动程序中加了很多安全判断和兼容操作,所以,在对程序尺寸和运行效率要求不高的场合,推荐使用BSP提供的驱动和函数,而在对性能和程序尺寸有要求的场合,推荐自己编写基于寄存器读写的驱动。

        //对与本摸鱼怪来说,这一点后面需要的话,再肥来恶补知识叭~

② 如何实现对指定地址的读写操作

使用指针

例如对地址为0x00000020的寄存器进行读写,就可以使用下面的形式:

        读寄存器:return (volatile u8 ) 0x00000020;

        写寄存器:(volatile u8 ) 0x00000020 = 0x12;

使用IO读写函数   xil_io.h

Xil_In8(addr);

Xil_In16(addr);

Xil_In32(addr);

Xil_In64(addr);

Xil_Out8 (addr, data);

Xil_Out16(addr, data);

Xil_Out32(addr, data);

Xil_Out64(addr, data);

这些函数就是对指针操作的封装

③ 如何知道各个外设的硬件信息(寄存器地址,位功能)

查看datasheet

在UG585的附录B中,有所有外设的每个寄存器的地址和功能描述。

reg_val = Xil_In32(XPAR_PS7_GPIO_0_BASEADDR + XGPIOPS_DIRM_OFFSET);

XPAR_PS7_GPIO_0_BASEADDR 为基地址

XGPIOPS_DIRM_OFFSET  为偏移地址

使用BSP提供的驱动和硬件信息文件

在bsp工程中,Xilinx为每一个硬件功能都提供了描述其寄存器地址和位功能的.h文件:

这类文件字母x开头,然后紧跟外设功能名,最后以_hw结尾。

例如,对于GPIO,提供的该文件名为xgpiops_hw.h,

          对于串口(uart),提供的该文件名为xuartps_hw.h,

          对于SD/MMC外设控制器,提供的该文件名为xsdps_hw.h。

需要注意的是,SDK在生成BSP时,会仅针对系统中配置使能了的硬件生成硬件信息文件,对于没有配置使能的硬件,则可能不会生成硬件信息文件,例如我们开发流程课程中,因为没有使能SD/MMC外设和UART外设,所以在SDK中生成的LED_bsp下就找不到刚刚说的xsdps_hw.h和xuartps_hw.h。

④如何实现程序中的延时

对精度要求较高的延时,可以使用BSP中提供的基于CPU心跳定时器的定时/延时函数,例如

微秒单位延迟usleep(unsigned long useconds)

秒单位延迟sleep(unsigned int seconds)

⑤使用跨平台可移植的数据类型

include “stdint.h”

uint8_t us8_type;

uint16_t us16_type;

uint32_t us32_type;

uint64_t us64_type;

int8_t s8_type;

int16_t s16_type;

int32_t s32_type;

int64_t s64_type;

3.  使用硬件库进行编程

小梅哥视频链接:

08_基于SDK硬件驱动库的编程方法_哔哩哔哩_bilibili

对应的课程笔记:【zynq课程笔记】【裸机】【第8课 】【使用SDK硬件驱动库】 - ACZ702开发板 - 芯路恒电子技术论坛 - Powered by Discuz! (corecourse.cn)

#include "xgpiops.h"

#include "unistd.h"


XGpioPs Gpio;

XGpioPs_Config *ConfigPtr;


int main(void)

{

    ConfigPtr =  XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);

    XGpioPs_CfgInitialize(&Gpio,  ConfigPtr, ConfigPtr->BaseAddr);


    XGpioPs_SetDirectionPin(&Gpio,  7, 1);

    XGpioPs_SetOutputEnablePin(&Gpio,  7, 1);


    while(1)

    {

       //设置bit7输出1

       XGpioPs_WritePin(&Gpio,  7, 0x1);

       usleep(500000);


       //设置bit7输出0

       XGpioPs_WritePin(&Gpio,  7, 0x0);

       usleep(500000);

    }

    return 0;

}

XGpioPs_LookupConfig

  

寻找指定GPIO设备的配置信息

XGpioPs_CfgInitialize

对GPIO的驱动程序进行初始化

XGpioPs_SetDirectionPin

设置指定Pin的方向

XGpioPs_SetOutputEnablePin

设置指定Pin的输出使能

XGpioPs_WritePin

写/更新指定管脚的值/状态

4.调试

小梅哥视频:

09_Zynq SoC ARM裸机程序调试方法_哔哩哔哩_bilibili

对应课程笔记:【zynq课程笔记】【裸机】【第9课 】【裸机程序调试方法】 - ACZ702开发板 - 芯路恒电子技术论坛 - Powered by Discuz! (corecourse.cn)

5.  一个小作业

#include "COMMON.h"
#include "sleep.h"

int main(void)
{
    u8 State_PS_KEY; //存放按键(MIO7)的电平状态,0 为低电平,1 为高电平
    PS_GPIO_Init(); //初始化 PS 端 MIO 和 EMIO

    //设置 PS_LED(MIO7)为输出并且初始为低电平
    PS_GPIO_SetMode(PS_LED, OUTPUT, 0);
    PS_GPIO_SetMode(PS_KEY, INPUT, 0); //设置 PS_KEY(MIO47)方向为输入

    while(1)
    {

        //读取 PS_KEY 的电平值并存储到 State_PS_KEY 变量里
      //  State_PS_KEY = PS_GPIO_GetPort(PS_KEY);

        while(!PS_GPIO_GetPort(PS_KEY))
        {

        //将 State 变量的值取非赋予 PS_LED 来输出
        PS_GPIO_SetPort(PS_LED,1);
        usleep(500000);
        PS_GPIO_SetPort(PS_LED,0);
        usleep(500000);
        }
        PS_GPIO_SetPort(PS_LED,0);
    }
    return 0;
}

 while(!PS_GPIO_GetPort(PS_KEY))

嘎嘎~这个是调试出来的小问题:

    while(State_PS_KEY ​​​​​​​)
        {

        //将 State 变量的值取非赋予 PS_LED 来输出
        PS_GPIO_SetPort(PS_LED,1);
        usleep(500000);
        PS_GPIO_SetPort(PS_LED,0);
        usleep(500000);

          State_PS_KEY = PS_GPIO_GetPort(PS_KEY);
        }

这个小问题,自己调试一下就可以发现啦~

好久没写C,还是要好好熟练一下~

//啦啦啦,摸鱼结束~

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

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

相关文章

C++ STL - 容器

C STL&#xff08;标准模板库&#xff09;中的容器是一组通用的、可复用的数据结构&#xff0c;用于存储和管理不同类型的数据。 目录 零. 简介&#xff1a; 一 . vector&#xff08;动态数组&#xff09; 二. list&#xff08;双向链表&#xff09; 三. deque&#xff08…

yolov8摔倒检测(包含数据集+训练好的模型)

基于先进的YOLOv8模型&#xff0c;实现了一套高效可靠的人体摔倒检测系统。YOLOv8作为YOLO系列的最新成员&#xff0c;以其卓越的检测速度和准确性&#xff0c;在计算机视觉领域尤其是目标检测任务中表现出色。本系统不仅能够实时处理视频流或监控画面&#xff0c;还能对静态图…

SwiftUI中Menu和ControlGroup的使用

本篇文章主要介绍一下Menu组件和ControlGroup组件的使用。Menu组件是在iOS 14&#xff08;tvOS 17&#xff09;推出的一个组件&#xff0c;点击后提供一个可选择的操作列表。ControlGroup组件是一个容器视图&#xff0c;以视觉上适当的方式为给定的上下文显示语义相关的控件&am…

【面试干货】SQL语言分类

【面试干货】SQL语言分类 1、数据查询语言&#xff08;DQL&#xff09;2、数据操纵语言&#xff08;DML&#xff09;3、数据定义语言&#xff08;DDL&#xff09;4、数据控制语言&#xff08;DCL&#xff09;5、结语 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收…

使用gradio库实现Web应用,允许用户上传图像,并使用YOLOv8模型对图像进行目标检测。

一、Gradio Gradio 详细介绍 Gradio 是一个用于构建和分享机器学习模型和数据科学应用的开源Python库。它简化了创建交互式Web界面的过程&#xff0c;让开发者可以快速搭建原型并与他人分享。 主要特性 易用性&#xff1a; 无需前端开发经验&#xff1a;只需几行Python代码就…

论工业交换机的工业级芯片的重要性

工业交换机作为工业网络中的重要设备&#xff0c;其性能和稳定性对整个工业生产过程至关重要。而工业级芯片作为工业交换机的核心组成部分&#xff0c;更是承载着重要的功能和责任。工业级芯片具有承受恶劣环境的能力&#xff0c;能够在高温、高压、强电磁干扰等恶劣条件下稳定…

html+CSS+js部分基础运用15

1、完成输入框内容的实时反向输出。 2、银行账户余额变动自动通知项目。 设计要求&#xff1a;单击按钮后&#xff0c;余额按照输入框的数额减少&#xff0c;同时将按钮式的提示信息&#xff08;金额&#xff09;同步改变。利用侦听属性实现余额发生变化时发出提示信息&#x…

Django render()函数页面渲染

1&#xff0c; render() 函数 在Django框架中&#xff0c;render() 函数是一个非常有用的快捷方式&#xff0c;用于从视图函数返回一个完整的HTTP响应。它负责将给定的模板与上下文数据结合&#xff0c;渲染出最终的HTML页面&#xff0c;并返回一个HttpResponse对象。 from d…

全能大模型AIGC产品的使用体验、选择倾向与未来展望

随着人工智能技术的迅猛发展&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;领域正迎来前所未有的繁荣。其中&#xff0c;全能大模型产品以其强大的生成能力和广泛的应用场景&#xff0c;吸引了众多用户的关注。腾讯元宝APP的上线更是为这一领域注入了新的活力。本文…

第10周 企业认证、分布式事务,分布式锁方案落地

第10周 企业认证、分布式事务,分布式锁方案落地 1. 基于Redis提高请求响应**********************************************************************************************本周我们将对企业入驻认证的流程进行落地,并且结合分布式缓存中间件Redis与Redisson进行相关的技术…

企业(园区)智慧能源双碳平台解决方案

园区作为工业企业集聚区&#xff0c;在提供了大量基础设施和公共服务的同时也成为了碳排放的主要源头。工业园区的耗能约占全社会总耗能的69%&#xff0c;碳排放占全国总排放约31%。工业园区节能、减耗、提质、减碳工作的落实&#xff0c;是我国实现碳达峰碳中和目标的必然要求…

【python】ModuleNotFoundError: No module named ‘timm’

成功解决“ModuleNotFoundError: No module named ‘timm’”错误的全面指南 一、引言 在Python编程中&#xff0c;经常会遇到各种导入模块的错误&#xff0c;其中“ModuleNotFoundError: No module named ‘timm’”就是一个典型的例子。这个错误意味着你的Python环境中没有安…

Web安全:Web体系架构存在的安全问题和解决方案

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

【毕业设计之微信小程序系列】基于微信小程序的餐厅点餐小程序的设计与实现

《基于微信小程序的餐厅点餐小程序的设计与实现》 项目效果图 目录大纲 摘要 1、选题及其意义 1.1、设计项目的名称 1.2、研究意义 2、需求分析 2.1、用户需求分析 2.2、功能需求分析 2.3、非功能需求分析 3、系统相关技术概述 3.1、餐饮平台开发相关技术 3.1.1、微信小程序 …

读AI未来进行式笔记04数字医疗与机器人

1. 数字医疗 1.1. 20世纪的“现代医学”得益于史无前例的科学突破&#xff0c;使得医疗的方方面面都得到改善&#xff0c;让人类预期寿命从1900年的31岁提高到2017年的72岁 1.2. 现有的医疗数据库和流程将实现数字化 1.2.1. 患者记录 1.2.…

实时语音交互数字人解决方案,满足不同场景需求

北京美摄网络科技有限公司凭借其领先的实时语音交互数字人解决方案&#xff0c;为企业带来了全新的沟通体验与商业机遇。 一、技术革新&#xff0c;开启交互新篇章 美摄科技实时语音交互数字人解决方案&#xff0c;以先进的人工智能和机器学习技术为基础&#xff0c;实现了文…

批量提取 Word 文档中的全部图片

步骤 1、打开 WinRAR 任选一个现成的压缩包双击打开 WinRAR &#xff0c;或从开始菜单打开 WinRAR 2、直接把要提取图片的 Word 文档拖入 WinRAR 菜单区域 1 → 2 → 3&#xff0c;WinRAR 资源管理目录中的 media 就是该 Word 文档所要提取的全部图片所在文件夹 按住&#x…

人工智能任务5-高级算法工程师需要学习哪些课程与掌握哪些能力

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能的任务5-高级算法工程师需要学习哪些课程&#xff0c;需要掌握哪些能力。高级算法工程师需要掌握的算法模型有&#xff1a;人脸检测模型MTCNN&#xff0c;人脸识别方法Siamese network、center loss、softm…

基于协同注意力的视觉-语言嵌入用于机器人手术视觉问题定位回答

文章目录 CAT-ViL: Co-attention Gated Vision-Language Embedding for Visual Question Localized-Answering in Robotic Surgery摘要方法实验结果 CAT-ViL: Co-attention Gated Vision-Language Embedding for Visual Question Localized-Answering in Robotic Surgery 摘要…

今日份动态规划学习(二维01背包+01背包变形)

目录 P1877 [HAOI2012] 音量调节 P1877 [HAOI2012] 音量调节 题解&#xff1a;一个入门级别的01背包问题&#xff0c;首先就是为什么能看出是01背包&#xff0c;因为只有两种状态&#xff0c;要不增大音量&#xff0c;要不减小音量&#xff0c;和01背包的选与不选非常近似。但…