我一直在寻找答案、但找不到答案。
"sysctl"来自哪里。 它不在数据表中、因此我猜它是在头文件中创建的、或者是在头文件中创建的。
语句中"->""的含义是什么。
我知道 RCC 寄存器、但不知道 SYSCTl->来自哪里。
我敢打赌、一旦有人向我展示了光、它就会变得很简单。
Keith、
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我一直在寻找答案、但找不到答案。
"sysctl"来自哪里。 它不在数据表中、因此我猜它是在头文件中创建的、或者是在头文件中创建的。
语句中"->""的含义是什么。
我知道 RCC 寄存器、但不知道 SYSCTl->来自哪里。
我敢打赌、一旦有人向我展示了光、它就会变得很简单。
Keith、
请允许我提供一个观察-然后提出建议-旨在"快速、轻松和增强"您的 MCU"学习"(第一)-随后您的掌握。
现在您已经两次了解(相对)次要和/或模糊的 MCU 详细信息。 (位带提前到达)
通过询问"每一个/每一个"(对您来说是新的)细节、您的理解是否会支离破碎、延迟和效率低下? (这是我的小公司、相当成功的技术公司和其他人的信念)
或许另一种方法(更自然地)可以更好地回答许多这样的"MCU 详细信息")? 综合阅读 MCU 手册、"外设驱动程序用户指南"和(许多)供应商提供的代码示例(找到@"外设/示例") -所有"开放和随时可用"-当您运行供应商提供的代码示例时-到目前为止已证明-最顶尖的学习工具@我的公司! (及其他)
您可能会"太早"注意到 MCU 的"相对重要性"。 如果(而是)对该供应商的努力(他们最熟练、对您的成功感兴趣)(基本上基于 MCU 外设)"进行"分类"、并通过"示例"代码条目-代码流-和代码执行寻求您的积极参与、这是否会更有效? 这个供应商的 API 是广泛、详细的、极具"尝试/真实/测试"性的、并且"新/奇怪"概念或描述的"发生"往往会被注意和解释。 (即此类"新项目"的数量(提及/出现次数)通常反映其重要性)
我在这里的尝试是提供一条不同的(改进的)路线-但却是到相同的-成功的目的地...
谢谢你、Bruno、我们三个人都投入了时间/精力。
但不确定、"全部在同一页上"。 我看到海报-虽然聪明且充满动力-他的学习效率"被"扣为"有趣"-但不是"超级关键"、也不是(甚至)主流 MCU 问题。
由于时间/努力是有限的-"严肃、专注和进步"学习所用的时间(赦免)必须从可用的时间中减去"杂草"所花费的时间。 (不源于关键字!)
曾参加过许多此类大学级别的课程、并通过"关键字"(无论多么诱人)进行学习、并不是一种高效的学习机制。 海报当然可以自由接受/拒绝此观察/建议-但"趋势"得到了充分注意-我不相信它符合此海报(或其他人)的最佳兴趣... 这-也许-值得我的评论...
|
上午5:39 (0分钟前)
![]() |
![]() ![]() |
||
|
Keith、
我看到它的方式:寄存器就在那里、并且必须由处理 MCU 的人员理解。 它们是大量的开关集合、可打开或关闭功能-并且功能非常复杂和互锁、从而增加了对许多"配置开关"的需求。
但无需在代码中单独打开或关闭每个开关,因为供应商提供的内容更类似于英语(或人的语言,因为这是值得的),可以执行“PropertySetAllSwitchedRequiredForTimerAToWork()”; 这就是驱动程序库(TivaWare)的作用。
SYSCTL 实际上是该代码中另一个变量的宏(昵称)... John 的 PWM_伺 服示例显示正在使用-但未声明。 有人刚刚完成了将一个系统控制寄存器分割成许多小块的工作、每个小块都有 RCGCGPIO、RCC 等名称。 但所有这些都必须映射到某个位置。 如果您更改器件型号、映射很可能不再适合您。
Tivaware "更接近"解决这个问题-至少、当然、在您继续使用这个供应商的产品系列时-因为一旦您定义了您正在使用的器件、任何 Tivaware 函数内受影响的寄存器自动指向正确的位置。 它们更容易被人眼阅读。 不过,不要做太多梦,我想知道是否有英语教师会理解以下内容:
ADCSequenceConfigure (ADC0_BASE、1、ADC_TRIGGER_processor、0); ADCSequStepConfigure (ADC0_BASE、 1、0、ADC_CTL_TS); ADCSequenceStepConfigure (ADC0_BASE、1、 1、ADC_CTL_TS | ADC_CTL_IE | ADC_CTL_END); ADCSequenceEnable (ADC0_BASE、1);
DRM? 尝试使用寄存器配置 ADC -即使代码工作正常、您的代码也会变得无法读取的严重破坏。
谢谢
布鲁诺
HA HA、
我想我正在减弱、但至少我在2009年 LOL 中发现了另一个提出类似问题的人:
http://www.keil.com/forum/15726/ 除此之外,我还能找到有关这个问题的邮政编码。
我真的很恼火,我找不到一个简单的前向解释,说明在哪里声明了 sysctl,或者在我看到的代码示例中,在"->""之前的所有其他宏。 但我想现在是时候让它运行并给予 Tivaware 更多关注了。
好的、如果我仍然想惩罚自己、在使用 Tivaware 时、我会一直回到 DRM 学习。
感谢大家的所有投入。
Keith、
Keith、
我不想讨论直接寄存器写入的问题、但我也不想暗示存在任何隐藏或秘密。 您所创建的书的示例代码适用于较旧的器件、并使用了我没有的 include 文件。 但是、我可以很好地猜测代码在做什么。
SYSCTL 被定义为指向一个地址等于控制寄存器基地址的结构体的指针:
typedef volatile struct systemBase { uint32 DID0_R; /* 0x0000 */ 。} systembase_t; #define sysctl ((systembase_t *) 0x400FE000)
然后、"sysctl->RCC"的值将求值到地址0x400FE060处的 RCC 寄存器
当前 TivaWare 头文件对寄存器的定义不同:
#define SYSCTL_RCC_R (*((volatile uint32_t *) 0x400FE060))
您看到的示例:
sysctl->RCC =(sysctl->RCC & 0xF83FFFFF)| 0x800;
读取地址0x400FE060处的寄存器 RCC、使用0xF83FFFFF 对读取的值进行与 0x800对结果的或操作、然后将结果写回 RCC 寄存器。
也许这种详细的解释会使我们更强烈地建议使用 TivaWare API 而不是直接写入寄存器。 我至少觉得以下函数调用更易于理解、即使没有注释也是如此:
SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);
公司/我有确切的书-和 pgs。 315、316显示-几乎正如 Bob 所说: (我扫描它-但背景是深灰色-对比度较差)
SYSCTRL 本身从未定义或引用。 并且-(始终)所有此类"sysctrl"运算都使用"赋值"(=)从不使用指针! (在我的书中)
#define SYSCTRL_RCC *(volatile unsigned long *)(0x400FE060)
#define SYSCTRL_RIS *(volatile unsigned long *)(0x400FE050)
#define SYSCTRL_RCGC1 *((volatile unsigned long *)(0x400FE104))
#define SYSCTRL_RCGC2 *((volatile unsigned long *)(0x400FE108))
然后在"SYSCTRL_RCC"上执行5个操作。 我们的海报列出了一张- Bob Detailed -其他的海报使我的手指变得更硬、"从主排坠落"。
这就是 DRM 的实现、"hello.c"-如 Joseph Yu's'中列出的那样输出到 UART、"ARM Cortex-M3的最终指南"。 (第二版)
正如供应商的 Bob 所说的-对 SysCtlClockSet()的 API 调用-是如此的用户友好、易于理解并且有可能成功。
我无法报告这种进入 DRM 的意外导致的"高层建筑的飞跃、手腕吊死或单车死亡"的数量...